هرم چپگرا (Leftist)
هرمی که دو هرم را در O(log n) ادغام میکند: همهی کار روی ستون راست کوتاه انجام میشود و هر جا سمت چپ کوتاهتر شد، دو فرزند جابهجا میشوند. درج و حذف کمینه هم همان ادغاماند.
هرم دودویی آرایهای درج و حذف کمینه را خوب انجام میدهد، ولی ادغام دو هرم در آن O(n) است. هرم چپگرا (Crane) ادغام را در O(log n) انجام میدهد، و درج و حذف کمینه را هم با ادغام میسازد.
- زمان:
O(log n) per merge, insert or delete-min - حافظه:
O(n) - هوروویتز–ساهنی، فصل ۹
هفت درج و بعد دو حذف کمینه؛ عدد کوچک زیر هر گره s آن است و هر جا s چپ کمتر شد، فرزندان جابهجا میشوند.
class Node:def __init__(self, key):self.key = keyself.left = Noneself.right = Noneself.s = 1 # the length of the shortest path down to an empty spotdef leftist_heap(ops):root = Noneremoved = []for x in ops:if x > 0:root = merge(root, Node(x))elif root is None:continueelse:removed.append(root.key)root = merge(root.left, root.right)return removeddef s(x):if x is None:return 0return x.sdef merge(a, b):# Merge along the right spines, which are short (O(log n)), and swap children where the left side gets too short.if a is None:return bif b is None:return aif b.key < a.key:a, b = b, aa.right = merge(a.right, b)if s(a.left) < s(a.right):a.left, a.right = a.right, a.lefta.s = s(a.right) + 1return a
شروع اجرا
∅
درخت فراخوانیهای بازگشتی
نارنجی پر = فراخوانی در حال اجرا · حاشیهی نارنجی = هنوز روی پشته · خاکستری = تمام شده
متغیرهای محلی
نارنجی = در همین گام عوض شد
ops list
Call stack
- leftist_heap()خط 9
توضیح
چرا ادغام
هرم دودویی آرایهای درج و حذف کمینه را خوب انجام میدهد، ولی ادغام دو هرم در آن O(n) است. هرم چپگرا (Crane) ادغام را در O(log n) انجام میدهد، و درج و حذف کمینه را هم با ادغام میسازد.
s و چپگرایی
برای هر گره، s طول کوتاهترین مسیر تا یک جای خالی است. درخت چپگرا است اگر برای هر گره s(چپ) ≥ s(راست). پس ستون راست (از ریشه همیشه به راست) کوتاهترین مسیر است و طولش حداکثر log₂(n + 1) است.
ادغام
ریشهی کوچکتر ریشهی جواب است؛ زیردرخت راستش را به صورت بازگشتی با هرم دیگر ادغام میکنیم. در برگشت، اگر s چپ کمتر از راست شد، دو فرزند را جابهجا میکنیم. همهی کار روی دو ستون راست است: O(log n).
ورودی
عدد مثبت درج میشود و 0 یعنی حذف کمینه. عدد کوچک زیر هر گره s آن است.