5תרגול 11/4/2007 30/5/2007
ערמות
07bמבני נתונים
ליאור שפירא
Heapsתזכורת: עץ בינארי מלאהחוק הבסיסי
אם צומתB צאצא של צומת A אזי Key(A)≤Key(B) הפעולות הנתמכות
Find-minDelete-minDecrease-keyInsertMerge
Heapsתזכורת:
מחיקת השורש
(max-heapהוספת צומת )עבור
15
4
15
1תרגיל בהינתן מערך באורךn נרצה ליצור ,heap ע"י הכנסה
סדרתית של ערכי המערך. הראו סדרת הפעולות (worst case במקרה הכי גרוע )Ω(nlogn)לוקחת
פתרון נצטרך להראות דוגמה של סדרת ההכנסות שלוקחת
Ω(nlogn)פעולות -נחפש סדרה ש"תקשה" כמה שיותר על הheap
1תרגיל
n n-1 n-2 n-3 … 2 1
n n
n-1
n-1
n
n-1
n n-2
n-2
n n-1
…
1תרגיל כל ערך שנוסיף צריך לבעבע לראש העץn/2 ההכנסות האחרונות לוקחות לפחות log(n/2)
כל אחת
:מסקנהW.C = Ω(nlogn)
1log( ) (log log 2)2 2 21 1log log 2
2 2( log )
n nn n
n n n nn
2תרגיל בהינתןheap שתומך בפעולות extract-min
, הראו שניתן למיין f(n) amortized בזמן insertו-O(nf(n)) בזמן nמערך מגודל
פתרון נבצעn פעולות הכנסה בזמן O(nf(n)) מבצעn פעולות הוצאת מינימום בזמן O(nf(n)) סה"כO(nf(n))
אלגוריתם מיון זה נקראheap-sort בשיעור תלמדו כי מיון כל איבר הואΩ(logn)
Median Heap – 3תרגיל ממשו מבנה נתונים התומך בפעולות
insert בזמן O(logn)extract-median בזמן O(logn)find-median בזמן O(1)
2 4 5 7 8 12 14 15 20
- פתרון3תרגיל Max-heapMin-heap
+
האברים הקטנים)עד החציון(
האברים הגדולים)מהחציון(
- פתרון3תרגיל
-נשתמש בmax-heap-ו min-heapn/2-הערכים הגדולים ביותר יישמרו ב max-heap-השאר יישמרו בmin-heapהחציון תמיד נמצא בשורש של אחד מהם
Max-heapMin-heap
+
2 4 5 7 8 12 14 15 20 Min-HeapMax-Heap
- פתרון3תרגיל Find-median
If (size(minheap)>size(maxheap)) return getmin(minheap)
Else return getmax(maxheap)
Insert(x) If (x<getmin(minheap))
Insert(maxheap,x) Else
Insert(minheap,x) If (abs(size(minheap)-size(maxheap))>1)
Balance heaps (move root from bigger heap to smaller heap)
Extract-Median Extract median from the max-heap or min-heap…
O(1)
O(logn)
O(logn)
Binomial Heapsתזכורת: תחילה נגדירBinomial Tree:
מכיל צומת יחידה0עץ בינומי מדרגה עץ בינומי מדרגהkהוא
בעל שורש מדרגהk ילדיו הינם עצים בינומיים מדרגותk-1,k-2,…,0)בסדר זה( עץ בינומי מדרגהk 2 מכילk צמתים והינו בגובה k
Binomial Heapsתזכורת: איחוד שני עצים בינומיים מסדרk-1
ניצור עץ בינומי מסדרk ע"י תליית אחד העצים כבן השמאלי ביותר של העץ השני
Binomial Heapsתזכורת: הגדרתBinomial Heap
סט עצים בינומיים המקיימים את התכונות הבאות כל עץ מקיים את תכונתminimum-heap כל צאצא גדול(
מההורה שלו( עבור כל סדרk עצים כאלו ב-1 או 0 של עץ בינומי, יש heap
Binomial Heapsתזכורת: פעולתMerge של שני עצים מדרגה k
function mergeTree(p, q) if p.root <= q.root
return p.addSubTree(q) else
return q.addSubTree(p) end
Binomial Heapsתזכורת: פעולתmerge של שני Binomial Heaps
function merge(p, q)
while not( p.end() and q.end() )
tree = mergeTree(p.currentTree(), q.currentTree())
if not heap.currentTree().empty()
tree = mergeTree(tree, heap.currentTree())
heap.addTree(tree)
else
heap.addTree(tree)
end if
heap.next() p.next() q.next()
end while
end
Binomial Heapsתזכורת: פעולתInsert
ניצורheap חדש המכיל את האבר החדש, ונבצע merge-בין שני ה heaps פעולתminimum
עלינו לחפש את הערך המינימלי מבין שורשי העצים בheap פעולתdelete-min
מצא את האבר ומחק אותו-הפוך את בניו לbinomial heap-ומזג את שני ה heaps
פעולתDecrease-min-בדומה לפעולות בheapרגיל
פעולתDeleteובצע -∞שנה את הערך ל delete-min
Binomial Heap הדגמה של
http://www.cse.yorku.ca/~aaw/Sotirios/BinomialHeap.html