電気通信大学 情報理工学研究科 情報学専攻 2021年8月実施 選択問題 アルゴリズムとデータ構造
标签:
Author
祭音Myyura (co-authored with GPT 5.6 SOL)
Description
完全二分木の最大ヒープを、根から幅優先順に配列へ格納する。添字は から始まり、以下の 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) */);
}
}
使用する配列は
である。
- の左の子、 の親の値、および葉の個数を答えよ。
- として
algo(A,0,14)を実行した後の配列と (S) の実行回数を答えよ。 algo1(B,6)において、 の各回のalgo実行後の配列と、その回の (S) の実行回数を答えよ。algo2(X,6,14)の実行後の配列とヒープ構成法を説明せよ。- ヒープ配列の先頭 要素を用い、第 小要素を根へ格納する
algo3の空欄を埋めよ。 とし、配列に重複要素はない。
题目描述
追踪最大堆的下滤、堆排序和自底向上建堆过程,并补全利用大小为 的最大堆求第 小元素的程序。
Kai
1.
0 始まりの添字より、
2.
根を にして下向き調整すると、交換は
の 3 回である。したがって、
であり、(S) の実行回数は 回である。
3.
各回の algo 実行後は次のとおりである。
| (S) の回数 | 配列 | |
|---|---|---|
| 5 | 2 | |
| 4 | 2 | |
| 3 | 1 | |
| 2 | 1 | |
| 1 | 1 | |
| 0 | 0 |
よって最終的に昇順に整列される。
4.
となる。algo2 は、葉でない節点を添字の大きい順に下向き調整するため、配列をボトムアップに最大ヒープへ変換する。
5.
先頭 要素を最大ヒープとして保つ。根より小さい要素を見つけたときだけ根と交換し、先頭 要素を再びヒープ化すれば、走査後の根は第 小要素となる。したがって、