هرم دوجملهای
جنگلی از درختهای دوجملهای با درجههای متفاوت، مثل ارقام دودویی n؛ ادغام دو هرم مثل جمع دو عدد دودویی است و در O(log n) انجام میشود.
درخت دوجملهای درجهی k، یعنی B_k، از دو B_{k−1} ساخته میشود که ریشهی یکی فرزند ریشهی دیگری شده است. پس 2^k گره دارد و ریشهاش k فرزند دارد.
- زمان:
O(log n) per union, insert or extract-min - حافظه:
O(n) - هوروویتز–ساهنی، فصل ۹
- CLRS، فصل ۱۹
هفت درج: ۷ = ۱۱۱ در دودویی، پس سه درخت با ۱، ۲ و ۴ گره میماند. بعد حذف کمینه.
class Node:def __init__(self, key):self.key = keyself.degree = 0self.children = [] # in increasing degreedef binomial_heap(ops):heap = [] # the root list, in increasing degreeremoved = []for x in ops:if x > 0:union(heap, [Node(x)])elif not heap:continueelse:m = heap[0]for r in heap:if r.key < m.key:m = rheap.remove(m)removed.append(m.key)union(heap, m.children)return removeddef union(heap, other):# Merge the two root lists by degree, then link trees of equal degree, like adding binary numbers.heap.extend(other)heap.sort(key=lambda t: t.degree)i = 0while i < len(heap) - 1:x = heap[i]nx = heap[i + 1]if x.degree != nx.degree:i = i + 1elif i + 2 < len(heap) and heap[i + 2].degree == x.degree:i = i + 1elif x.key <= nx.key:link(nx, x)heap.pop(i + 1)else:link(x, nx)heap.pop(i)def link(y, z):# Two trees of degree k become one of degree k + 1: y goes under z.z.children.append(y)z.degree = z.degree + 1
شروع اجرا
∅
متغیرهای محلی
نارنجی = در همین گام عوض شد
ops list
Call stack
- binomial_heap()خط 8
توضیح
درخت دوجملهای
درخت دوجملهای درجهی k، یعنی B_k، از دو B_{k−1} ساخته میشود که ریشهی یکی فرزند ریشهی دیگری شده است. پس 2^k گره دارد و ریشهاش k فرزند دارد.
هرم دوجملهای
مجموعهای از درختهای دوجملهای مرتبهرمی، حداکثر یکی از هر درجه. درختهایی که هستند دقیقاً ارقام 1 نمایش دودویی n اند؛ پس حداکثر ⌊log n⌋ + 1 درخت داریم.
ادغام = جمع دودویی
دو فهرست ریشه را به ترتیب درجه کنار هم میگذاریم. هر جا دو درخت همدرجه شدند، پیوند میزنیم: ریشهی بزرگتر زیر کوچکتر میرود و یک درخت درجهی بالاتر میسازند، مثل رقم نقلی در جمع. اگر سه درخت همدرجه کنار هم باشند، از اولی میگذریم و دوتای بعدی را پیوند میزنیم.
- درج: ادغام با هرمی یکگرهای.
- حذف کمینه: کمینه یکی از ریشههاست؛ آن را برمیداریم و فرزندانش (که خودشان یک هرم دوجملهایاند) را دوباره ادغام میکنیم.
ورودی
عدد مثبت درج میشود و 0 یعنی حذف کمینه.