CLRSのd-aryヒープ問題


10

次の問題(質問1〜3)を解決しているときに混乱しました。

質問

D進ヒープは、バイナリヒープ似ているが、(一つの可能な例外を除いて)は、非リーフノードが有するD子供の代わりに、2人の子供。

  1. 配列のd- aryヒープをどのように表現しますか?

  2. n要素とd要素のd- aryヒープの高さは、ndで何ですか?

  3. d -ary max-heap でのEXTRACT-MAXの効率的な実装を提供します。実行時間をdおよびnで分析します。

  4. d -ary max-heap でのINSERTの効率的な実装を提供します。実行時間をdおよびnで分析します。

  5. INCREASE-KEY(Aik)の効率的な実装を提供します。これは、k <A [i] = kの場合にエラーにフラグを立て、d進行列のヒープ構造を適切に更新します。実行時間をdおよびnで分析します。

私の解決策

  1. 配列[a1a]

    ルートa1レベル1a2a2+d1レベル2a2+da2+d+d21レベルka2+Σ=1k1da2+Σ=1kd1

    私の表記は少し洗練されているようです。他にもっと簡単なものはありますか?

  2. してみましょうhは高さ表すD進ヒープを。

    ヒープが完全なd- aryツリーであるとします

    1+d+d2++dh=dh+11d1=h=logd[d1+1]1
  3. これは私の実装です:

    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

      TM=dc8d+c9++c1d+c14d
      ここで、は上のi行目のコストを示します。c
    • EXTRACT-MAX:

      TE=c1++c7+TMCdh=Cdlogd[d1+1]1=Odlogd[d1]

    これは効率的な解決策ですか?または私のソリューションに何か問題がありますか?


質問と説明に少し間違いがあると思います:d-aryヒープの高さはh =(log [nd − n + 1])− 1 //になるので、「-n」ではなく、 "-1"ではなくh = (log [nd−1+1])− 1高さに関する上記の説明は当てはまりません。h = log [nd−1 + 1] −1 = log [nd] -1 = log [n]それでも、ツリーの高さは次のように記述されΘ(log(n)).ます。ログは常にd-aryヒープの底dまでです。
Surabhi Raje

回答:


10
  1. あなたのソリューションは有効であり、d- aryヒープの定義に従います。しかし、あなたが指摘したように、あなたの記法は少し洗練されています。

    あなたは親の取得するために、これら二つの以下の機能を使用する場合がありますI番目の要素とJ番目の子I番目の要素を。

    d-ary-parent    retあなたr 2/d+1

    d-ary-childj    retあなたr d1+j+1

    1jdd-ary-parentd-ary-childj=

    dd=2d2

  2. 私があなたの答えを正しく理解していれば、幾何学的な進行を使用します。あなたの場合、あなたは行く、これは明らかに log dnh=logdd1+11ログdd1=ログd+ログdd1=ログd+11=ログdΘログd

    cΘ

  3. Uバツd-ary-parentd-ary-child

    エキストラマックスMAX-HEAPIFYOd ログdd1

    Od ログdd1=Odログd+ログd1=Od logd+d ログdd1

    ddログdd1OdログdMAX-HEAPIFYOΘ

  4. CLRSブックには、すでにINSERTプロシージャが用意されています。これは次のようになります。

    インサートkey    heap_sze=heap_sze+1    [heap_sze]=    増加キーheap_szekey

    Oログd

  5. INSERTと同様に、INCREASE-KEYも教科書で次のように定義されています。

    増加キーkey    f key<[]        error「新しいキーは現在のものよりも小さい」    []=key    whle >1 ad []>[d-ary-parent]        [][d-ary-parent(i)]        =d-ary-parent(i)

    Oログd


ありがとう!INCREASE-KEYとINSERTの実装はどうですか?書こうとしましたが、MAX-HEAPIFYが2回再帰的に呼び出されました。より良い解決策はありますか?WebとWiki
lucasKo

残りの運動ですか?もしそうなら、あなたの質問を更新してください、そして私はテーマに答えさせていただきます。
Bartosz Przybylski 2012年

私はそれらの質問を編集された投稿に載せました。
lucasKo

INSERTプロシージャを再実装しますか?つまり、新しい要素を挿入した後、ヒープ内の順序を調整するプロシージャを呼び出す必要はありませんか?
わかり

その説明は少し残念でした、明確にするために編集を参照してください。
Bartosz Przybylski 2012年

1

h=logd[d1+1]1
1+d+d2++dh=dh+11d1=h=logd[d1+1]1
h=Θログd

-1

2番目の質問の答えはh = log d(n(d-1)+ 1)-1なので、h = log d(nd-n + 1)-1


4
なぜこれが答えなのですか?説明のない式は、実際には誰にも役立ちません。
David Richerby 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.