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 ⌊(i−2)/d+1⌋
d-ary-child(i,j) return d(i−1)+j+1
Jelas . Anda dapat memverifikasi fungsi-fungsi yang memeriksa1≤j≤dd-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
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(nd−1+1)−1logd(nd)−1=logd(n)+logd(d)−1=logd(n)+1−1=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Θ
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(d−1)))
O(d logd(n(d−1)))=O(d(logd(n)+log(d−1)))=O(d logd(n)+d logd(d−1))
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 .d≪ndlogd(d−1)O(dlogd(n))MAX-HEAPIFYOΘ
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))
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))
h = (log [nd−1+1])− 1
Jadi 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 .