跳到主要内容

電気通信大学 情報理工学研究科 情報学専攻 2021年8月実施 選択問題 アルゴリズムとデータ構造

Author

祭音Myyura (co-authored with GPT 5.6 SOL)

Description

完全二分木の最大ヒープを、根から幅優先順に配列へ格納する。添字は 00 から始まり、以下の n は末尾の添字、swap は二要素の交換を表す。

void algo(int a[], int parent, int n) {
int child = parent * 2 + 1;
if (child <= n) {
int r_child = child + 1;
if (r_child <= n && a[r_child] > a[child]) child = r_child;
if (a[parent] < a[child]) {
swap(&a[parent], &a[child]); /* (S) */
algo(a, child, n);
}
}
}
void algo1(int a[], int n) {
while (n > 0) {
swap(&a[0], &a[n]);
n--;
algo(a, 0, n);
}
}
void algo2(int b[], int p, int n) {
if (p >= 0) {
algo(b, p, n);
p--;
algo2(b, p, n);
}
}
void algo3(int a[], int k, int n) {
int c;
for (c = k; c <= n; c++)
if (a[0] /* (1) */ a[c]) {
swap(&a[0], &a[c]);
algo(/* (2) */);
}
}

使用する配列は

A=(30,28,23,20,25,19,21,8,6,15,11,4,9,12,2),B=(20,19,16,15,18,14,8),X=(35,15,40,20,55,5,65,25,45,70,30,45,50,10,60)\begin{aligned} A&=(30,28,23,20,25,19,21,8,6,15,11,4,9,12,2),\\ B&=(20,19,16,15,18,14,8),\\ X&=(35,15,40,20,55,5,65,25,45,70,30,45,50,10,60) \end{aligned}

である。

  1. A[6]A[6] の左の子、A[10]A[10] の親の値、および葉の個数を答えよ。
  2. A[0]=10A[0]=10 として algo(A,0,14) を実行した後の配列と (S) の実行回数を答えよ。
  3. algo1(B,6) において、n=5,4,,0n=5,4,\ldots,0 の各回の algo 実行後の配列と、その回の (S) の実行回数を答えよ。
  4. algo2(X,6,14) の実行後の配列とヒープ構成法を説明せよ。
  5. ヒープ配列の先頭 kk 要素を用い、第 kk 小要素を根へ格納する algo3 の空欄を埋めよ。1kn+11\le k\le n+1 とし、配列に重複要素はない。

题目描述

追踪最大堆的下滤、堆排序和自底向上建堆过程,并补全利用大小为 kk 的最大堆求第 kk 小元素的程序。

Kai

1.

0 始まりの添字より、

(a) 12,(b) 25,(c) 8 個.\boxed{\text{(a) }12,\qquad \text{(b) }25,\qquad \text{(c) }8\text{ 個}}.

2.

根を 1010 にして下向き調整すると、交換は

1028,1025,101510\leftrightarrow28,\qquad 10\leftrightarrow25,\qquad 10\leftrightarrow15

の 3 回である。したがって、

A=(28,25,23,20,15,19,21,8,6,10,11,4,9,12,2)\boxed{ A=(28,25,23,20,15,19,21,8,6,10,11,4,9,12,2)}

であり、(S) の実行回数は 3\boxed{3} 回である。

3.

各回の algo 実行後は次のとおりである。

nn(S) の回数配列 BB
52(19,18,16,15,8,14,20)(19,18,16,15,8,14,20)
42(18,15,16,14,8,19,20)(18,15,16,14,8,19,20)
31(16,15,8,14,18,19,20)(16,15,8,14,18,19,20)
21(15,14,8,16,18,19,20)(15,14,8,16,18,19,20)
11(14,8,15,16,18,19,20)(14,8,15,16,18,19,20)
00(8,14,15,16,18,19,20)(8,14,15,16,18,19,20)

よって最終的に昇順に整列される。

4.

X=(70,55,65,45,35,50,60,25,20,15,30,45,5,10,40)\boxed{ X=(70,55,65,45,35,50,60,25,20,15,30,45,5,10,40)}

となる。algo2 は、葉でない節点を添字の大きい順に下向き調整するため、配列をボトムアップに最大ヒープへ変換する。

5.

先頭 kk 要素を最大ヒープとして保つ。根より小さい要素を見つけたときだけ根と交換し、先頭 kk 要素を再びヒープ化すれば、走査後の根は第 kk 小要素となる。したがって、

(1) >,(2) a,0,k1.\boxed{\text{(1) }>,\qquad \text{(2) }a,\,0,\,k-1}.