Ваше рішення є дійсним і відповідає визначенню d -ary купи. Але, як ви зазначали, ваша нотація є дещо складною.
Ви можете використовувати ці дві наступні функції для отримання батьківського елемента i -го елемента та j -го дочірнього i -го елемента.
d-ary-parent(i) return ⌊(i−2)/d+1⌋
d-ary-child(i,j) return d(i−1)+j+1
Очевидно . Ви можете перевірити ці функції, перевіривши, що1≤j≤dd-ary-parent(d-ary-child(i,j))=i
Також легко помітити те, що двійкова купа - це особливий тип -ary купи, де , якщо ви заміните на , то ви побачите, що вони відповідають функціям РОБІТЬ, ЛІВО та ВПРАВО, згадані в книзі.dd=2d2
Якщо я правильно зрозумів вашу відповідь, ви використовуєте геометричну прогресію . У вашому випадку ви отримаєте , що, очевидно, , що насправді є правильним і правильним рішенням. Але тільки для управління постійними коливаннями ви можете хотіти писати .h=logd(nd−1+1)−1logd(nd)−1=logd(n)+logd(d)−1=logd(n)+1−1=logd(n)Θ(logd(n))
Причиною цього є те, що деякі купи можуть не бути врівноваженими, тому їх найдовший шлях та найкоротший міг змінюється залежно від постійної , використовуючи позначення ви усунете цю проблему.cΘ
Вам не потрібно повторно реалізовувати процедуру, подану в підручнику, але її потрібно трохи змінити, наприклад, призначити всіх дітей таблиці за допомогою заданих та функції.AUXd-ary-parentd-ary-child
Оскільки не змінено, це залежить від часу запуску . Тепер у своєму аналізі ви повинні використовувати найгірший час, пропорційний висоті та кількості дітей, які повинен перевірити кожен вузол (щонайбільше d ). Ще раз ваш аналіз дуже точний, врешті-решт ви отримали , який можна перетворити на: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))
З практичних причин , ми завжди можемо вважати , що , так що ми можемо втратити частину O нотації, то ми отримаємо . Що також є правильним рішенням. Але не дивно, що ви також можете проаналізувати час виконання функції, використовуючи теорему , яка покаже, що є не тільки але навіть .d≪ndlogd(d−1)O(dlogd(n))MAX-HEAPIFYOΘ
У книзі CLRS вже передбачена процедура INSERT. Як виглядає так:
INSERT(A,key) A.heap_size=A.heap_size+1 A[A.heap_size]=−∞ INCREASE-KEY(A,A.heap_size,key)
Це можна легко довести, але здоровий глузд диктує, що час складності - це . Це тому, що купа може проходити аж до кореня.O(logd(n))
Як і INSERT, INCREASE-KEY також визначається в підручнику як:
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)
Складність, очевидно, (див. Попередній пункт).O(logd(n))
h = (log [nd−1+1])− 1
Отже, вище пояснення висоти не буде правдивим. h = log [nd − 1 + 1] −1 = log [nd] -1 = log [n] Хоча, тим не менше, висота дерева записується якΘ(log(n)).
Примітка: журнал завжди знаходиться до основи d для д-арної купи .