صف اولویت با هرم
درج در هرم بیشینه با بالا بردن عضو تازه، و برداشتن بیشینه با پایین بردن عضوی که جای ریشه نشسته؛ هر دو O(log n).
صف اولویت همیشه بزرگترین عضو را زود میدهد. با هرم بیشینه (درختی کامل که هر گره از فرزندانش کوچکتر نیست، ذخیرهشده در آرایه) هر دو عمل در O(log n) انجام میشوند:
- زمان:
O(log n) per operation - حافظه:
O(1) extra - CLRS، بخش ۶.۵
- هوروویتز–ساهنی، فصل ۵
هرم دهعضوی؛ کلید ۱۵ تا یک سطح زیر ریشه بالا میرود، بعد بیشینه (۱۶) برداشته میشود.
def priority_queue(heap, key):insert(heap, key)top = extract_max(heap)return top, heapdef insert(heap, key):heap.append(key)i = len(heap) - 1while i > 0:parent = (i - 1) // 2if heap[parent] >= heap[i]:breakheap[i], heap[parent] = heap[parent], heap[i]i = parentdef extract_max(heap):top = heap[0]heap[0] = heap[-1]heap.pop()i = 0size = len(heap)while True:largest = ileft = 2 * i + 1right = 2 * i + 2if left < size:if heap[left] > heap[largest]:largest = leftif right < size:if heap[right] > heap[largest]:largest = rightif largest == i:return topheap[i], heap[largest] = heap[largest], heap[i]i = largest
شروع اجرا
متغیرهای محلی
نارنجی = در همین گام عوض شد
heap list
Call stack
- priority_queue()خط 1
رشد تعداد عملیات با اندازهی ورودی
میانگین ۱۲ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.
- comparisons
- swaps
- ورودی فعلی (n=10)
نمایش به شکل جدول
| n | comparisons | swaps |
|---|---|---|
| 4 | 3.8 | 0.9 |
| 6 | 5.2 | 1.8 |
| 8 | 6.1 | 2.2 |
| 10 | 7.2 | 2.8 |
| 12 | 7.6 | 3.3 |
| 14 | 7.3 | 3.3 |
توضیح
ایده
صف اولویت همیشه بزرگترین عضو را زود میدهد. با هرم بیشینه (درختی کامل که هر گره از فرزندانش کوچکتر نیست، ذخیرهشده در آرایه) هر دو عمل در O(log n) انجام میشوند:
- درج: کلید را در انتهای هرم بگذار و تا وقتی از والدش بزرگتر است، با والد جابهجا کن (بالا بردن).
- برداشتن بیشینه: ریشه را بردار، آخرین عضو را جای ریشه بگذار و آن را با فرزند بزرگترش جابهجا کن تا وقتی از هر دو فرزند کوچکتر نیست (پایین بردن).
هزینه
ارتفاع هرم ⌊log n⌋ است و هر عمل حداکثر یک مسیر از ریشه تا برگ را طی میکند: O(log n). این همان صفی است که Dijkstra و Prim و زمانبندی کارها از آن استفاده میکنند.
در trace به چه چیزی نگاه کنی
- درخت بالای میلهها همان آرایه به شکل هرم است.
- مسیر بالا رفتن کلید تازه و پایین رفتن عضوِ جایگزین ریشه را دنبال کن.