Masalah tumpukan d-ary dari CLRS


10

Saya bingung saat memecahkan masalah berikut (pertanyaan 1-3).

Pertanyaan

Sebuah d tumpukan -ary seperti tumpukan biner, tetapi (dengan satu pengecualian mungkin) node non-daun memiliki d anak bukannya 2 anak-anak.

  1. Bagaimana Anda mewakili tumpukan d -ary dalam array?

  2. Berapa tinggi dari d tumpukan -ary dari n elemen dalam hal n dan d ?

  3. Berikan implementasi yang efisien dari EXTRACT-MAX di d -ary max-heap. Menganalisis waktu berjalannya dalam hal d dan n .

  4. Berikan implementasi yang efisien dari INSERT di d -ary max-heap. Menganalisis waktu berjalannya dalam hal d dan n .

  5. Berikan implementasi INCREASE-KEY ( A , i , k ) yang efisien , yang menandai kesalahan jika k <A [i] = k dan kemudian memperbarui struktur tumpukan matriks d -ary secara tepat. Menganalisis waktu berjalannya dalam hal d dan n .

Solusi saya

  1. Berikan arrayA[a1..an]

    root:a1level 1:a2a2+d1level 2:a2+da2+d+d21level k:a2+i=1k1dia2+i=1kdi1

    Notasi saya agak canggih. Apakah ada yang lebih sederhana?

  2. Biarkan h menunjukkan ketinggian tumpukan d -ary.

    Misalkan heap adalah pohon d -ary lengkap

    1+d+d2+..+dh=ndh+11d1=nh=logd[nd1+1]1
  3. Ini implementasi saya:

    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) )
    
    • Waktu berjalan MAX-HEAPIFY:

      TM=d(c8d+(c9+..+c13)d+c14d)
      mana menunjukkan biaya baris ke- i di atas.ci
    • EXTRACT-MAX:

      TE=(c1+..+c7)+TMCdh=Cd(logd[n(d1)+1]1)=O(dlogd[n(d1)])

    Apakah ini solusi yang efisien? Atau ada sesuatu yang salah dalam solusi saya?


Saya pikir ada sedikit kesalahan dalam pertanyaan serta penjelasan: Ketinggian tumpukan d-ary datang ke h = (log [nd - n + 1]) - 1 // Perhatikan "-n" dan tidak "-1" dan bukan h = (log [nd−1+1])− 1Jadi kami penjelasan di atas untuk ketinggian tidak akan berlaku. h = log [nd − 1 + 1] −1 = log [nd] -1 = log [n] Meskipun demikian, ketinggian pohon ditulis sebagai Θ(log(n)).Catatan: log selalu ke pangkalan d untuk tumpukan d-ary .
Surabhi Raje

Jawaban:


10
  1. Solusi Anda valid dan mengikuti definisi d -ary heap. Tetapi ketika Anda menunjukkan notasi Anda agak canggih.

    Anda mungkin menggunakan dua fungsi berikut untuk mengambil induk i elemen -th dan j anak -th i elemen th.

    d-ary-parent(i)    return (i2)/d+1

    d-ary-child(i,j)    return d(i1)+j+1

    Jelas . Anda dapat memverifikasi fungsi-fungsi yang memeriksa1jdd-ary-parent(d-ary-child(i,j))=i

    Juga mudah untuk melihat adalah bahwa tumpukan biner adalah jenis khusus dari tumpukan -ary mana , jika Anda mengganti dengan , maka Anda akan melihat bahwa mereka cocok fungsi INDUK, KIRI dan KANAN disebutkan dalam buku.dd=2d2

  2. Jika saya memahami jawaban Anda dengan benar, Anda menggunakan deret ukur geometris . Dalam kasus Anda, Anda bisa pergi , yang jelas , yang sebenarnya merupakan solusi yang valid dan benar. Tetapi hanya demi menangani fluktuasi konstan, Anda mungkin ingin menulis .h=logd(nd1+1)1logd(nd)1=logd(n)+logd(d)1=logd(n)+11=logd(n)Θ(logd(n))

    Alasan untuk ini adalah bahwa beberapa tumpukan mungkin tidak seimbang, sehingga lintasan terpanjang dan lintasan terpendeknya bervariasi oleh beberapa konstanta , dengan menggunakan notasi Anda menghilangkan masalah ini.cΘ

  3. Anda tidak perlu mengimplementasikan kembali prosedur yang diberikan dalam buku teks, tetapi Anda harus sedikit mengubahnya, misalnya menetapkan semua anak ke tabel menggunakan dan fungsi.AUXd-ary-parentd-ary-child

    Karena tidak diubah, itu tergantung pada waktu berjalan dari . Dalam analisis Anda, Anda sekarang harus menggunakan waktu terburuk yang sebanding dengan tinggi badan dan jumlah anak yang harus diperiksa oleh setiap simpul (paling banyak adalah d ). Sekali lagi analisis Anda sangat tepat, pada akhirnya Anda mendapatkan , yang dapat diubah menjadi:EXTRACT-MAXMAX-HEAPIFYO(d logd(n(d1)))

    O(d logd(n(d1)))=O(d(logd(n)+log(d1)))=O(d logd(n)+d logd(d1))

    Untuk alasan praktis kita selalu dapat mengasumsikan bahwa , sehingga kita dapat kehilangan bagian dari notasi O , maka kita akan mendapatkan . Yang juga merupakan solusi yang valid. Tetapi tidak mengherankan Anda juga dapat menganalisis fungsi waktu berjalan menggunakan teorema Master , yang akan menunjukkan bahwa tidak hanya tetapi bahkan .dndlogd(d1)O(dlogd(n))MAX-HEAPIFYOΘ

  4. Buku CLRS sudah menyediakan prosedur INSERT. Yang terlihat seperti ini:

    INSERT(A,key)    A.heap_size=A.heap_size+1    A[A.heap_size]=    INCREASE-KEY(A,A.heap_size,key)

    Itu bisa dibuktikan dengan mudah tetapi akal sehat menyatakan bahwa kompleksitas waktunya adalah . Itu karena tumpukan mungkin dilalui sampai ke akar.O(logd(n))

  5. Sama seperti INSERT, INCREASE-KEY juga didefinisikan dalam buku teks sebagai:

    INCREASE-KEY(A,i,key)    if key<A[i]        error"new key is smaller then current"    A[i]=key    while i>1 and A[i]>A[d-ary-parent(i)]        A[i]A[d-ary-parent(i)]        i=d-ary-parent(i)

    Kompleksitas jelas (lihat poin sebelumnya).O(logd(n))


Terima kasih! Bagaimana dengan implementasi INCREASE-KEY dan INSERT? Saya mencoba untuk menulisnya, tetapi itu memberi panggilan rekursif MAX-HEAPIFY dua kali. Apakah ada solusi yang lebih baik? Saya menemukan sedikit informasi di web dan wiki
lucasKo

Apakah sisa latihan itu? Jika demikian silakan perbarui pertanyaan Anda dan saya akan dengan senang hati menjawab tema.
Bartosz Przybylski

Saya menempatkan pertanyaan itu di pos yang diedit.
lucasKo

Penerapan kembali prosedur INSERT? Maksud Anda, itu tidak harus memanggil prosedur yang menyesuaikan urutan di dalam tumpukan, setelah memasukkan elemen baru? Saya tidak mengerti ...
lucasKo

Deskripsi itu agak disayangkan, lihat suntingan untuk klarifikasi.
Bartosz Przybylski

1

Ini bukan jawaban yang lengkap. bagian b) solusinya bukan Its seperti yang ditunjukkan oleh pengguna 55463 (karena dia tidak dapat berkomentar, tetapi menjawab), tetapi diturunkan karena kurangnya penjelasan . Jawaban terangkat juga salah mengatasinya. Jawabannya tetap Sumber: Soal 2-2. Analisis tumpukan tumpukan, bagian b)

h=logd[nd1+1]1
h = Θ ( log d ( n ) )
1+d+d2+..+dh=ndh+11d1=nh=logd[n(d1)+1]1
h=Θ(logd(n))

-1

Jawaban untuk pertanyaan kedua adalah h = log d (n (d-1) + 1) - 1 Jadi, h = log d (nd - n + 1) - 1


4
Mengapa ini jawabannya? Formula tanpa penjelasan tidak benar-benar membantu siapa pun.
David Richerby
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.