次の問題(質問1〜3)を解決しているときに混乱しました。
質問
D進ヒープは、バイナリヒープ似ているが、(一つの可能な例外を除いて)は、非リーフノードが有するD子供の代わりに、2人の子供。
配列のd- aryヒープをどのように表現しますか?
n要素とd要素のd- aryヒープの高さは、nとdで何ですか?
d -ary max-heap でのEXTRACT-MAXの効率的な実装を提供します。実行時間をdおよびnで分析します。
d -ary max-heap でのINSERTの効率的な実装を提供します。実行時間をdおよびnで分析します。
INCREASE-KEY(A、i、k)の効率的な実装を提供します。これは、k <A [i] = kの場合にエラーにフラグを立て、d進行列のヒープ構造を適切に更新します。実行時間をdおよびnで分析します。
私の解決策
配列
→ 私の表記は少し洗練されているようです。他にもっと簡単なものはありますか?
してみましょうhは高さ表すD進ヒープを。
ヒープが完全なd- aryツリーであるとします
これは私の実装です:
EXTRACT-MAX(A) 1 if A.heapsize < 1 2 error "heap underflow" 3 max = A[1] 4 A[1] = A[A.heapsize] 5 A.heap-size = A.heap-size - 1 6 MAX-HEAPIFY(A, 1) 7 return max MAX-HEAPIFY(A, i) 1 assign depthk-children to AUX[1..d] 2 for k=1 to d 3 compare A[i] with AUX[k] 4 if A[i] <= AUX[k] 5 exchange A[i] with AUX[k] 6 k = largest 7 assign AUX[1..d] back to A[depthk-children] 8 if largest != i 9 MAX-HEAPIFY(A, (2+(1+d+d^2+..+d^{k-1})+(largest-1) )
MAX-HEAPIFYの実行時間:
C I
ここで、は上のi行目のコストを示します。EXTRACT-MAX:
→ これは効率的な解決策ですか?または私のソリューションに何か問題がありますか?
h = (log [nd−1+1])− 1
高さに関する上記の説明は当てはまりません。h = log [nd−1 + 1] −1 = log [nd] -1 = log [n]それでも、ツリーの高さは次のように記述されΘ(log(n)).
ます。ログは常にd-aryヒープの底dまでです。