AlgoVerse

هرم دوجمله‌ای

جنگلی از درخت‌های دوجمله‌ای با درجه‌های متفاوت، مثل ارقام دودویی n؛ ادغام دو هرم مثل جمع دو عدد دودویی است و در O(log n) انجام می‌شود.

درخت دوجمله‌ای درجه‌ی k، یعنی B_k، از دو B_{k−1} ساخته می‌شود که ریشه‌ی یکی فرزند ریشه‌ی دیگری شده است. پس 2^k گره دارد و ریشه‌اش k فرزند دارد.

ادامه‌ی توضیح ↓
ورودی:
n=8خروجی PDF

هفت درج: ۷ = ۱۱۱ در دودویی، پس سه درخت با ۱، ۲ و ۴ گره می‌ماند. بعد حذف کمینه.

  1. class Node:
  2. def __init__(self, key):
  3. self.key = key
  4. self.degree = 0
  5. self.children = [] # in increasing degree
  6. def binomial_heap(ops):
  7. heap = [] # the root list, in increasing degree
  8. removed = []
  9. for x in ops:
  10. if x > 0:
  11. union(heap, [Node(x)])
  12. elif not heap:
  13. continue
  14. else:
  15. m = heap[0]
  16. for r in heap:
  17. if r.key < m.key:
  18. m = r
  19. heap.remove(m)
  20. removed.append(m.key)
  21. union(heap, m.children)
  22. return removed
  23. def union(heap, other):
  24. # Merge the two root lists by degree, then link trees of equal degree, like adding binary numbers.
  25. heap.extend(other)
  26. heap.sort(key=lambda t: t.degree)
  27. i = 0
  28. while i < len(heap) - 1:
  29. x = heap[i]
  30. nx = heap[i + 1]
  31. if x.degree != nx.degree:
  32. i = i + 1
  33. elif i + 2 < len(heap) and heap[i + 2].degree == x.degree:
  34. i = i + 1
  35. elif x.key <= nx.key:
  36. link(nx, x)
  37. heap.pop(i + 1)
  38. else:
  39. link(x, nx)
  40. heap.pop(i)
  41. def link(y, z):
  42. # Two trees of degree k become one of degree k + 1: y goes under z.
  43. z.children.append(y)
  44. z.degree = z.degree + 1

ناوردا: هر درخت مرتب‌هرمی است، درخت درجه‌ی k دقیقاً 2^k گره دارد، و بعد از هر ادغام هیچ دو ریشه‌ای هم‌درجه نیستند.

شروع اجرا

∅

removed—

متغیرهای محلی

نارنجی = در همین گام عوض شد

ops list

12725152833410

Call stack

  1. binomial_heap()خط 8
گام ۱ از ۲۰۷
خط سیاه = inserted, extracted · خط نارنجی = گام کلیدیmerged: 0/8 · inserted: 0/7 · link: 0/6 · min_root: 0/1 · three_alike: 0/1 · extracted: 0/1
    توضیح

    درخت دوجمله‌ای

    درخت دوجمله‌ای درجه‌ی k، یعنی B_k، از دو B_{k−1} ساخته می‌شود که ریشه‌ی یکی فرزند ریشه‌ی دیگری شده است. پس 2^k گره دارد و ریشه‌اش k فرزند دارد.

    هرم دوجمله‌ای

    مجموعه‌ای از درخت‌های دوجمله‌ای مرتب‌هرمی، حداکثر یکی از هر درجه. درخت‌هایی که هستند دقیقاً ارقام 1 نمایش دودویی n اند؛ پس حداکثر ⌊log n⌋ + 1 درخت داریم.

    ادغام = جمع دودویی

    دو فهرست ریشه را به ترتیب درجه کنار هم می‌گذاریم. هر جا دو درخت هم‌درجه شدند، پیوند می‌زنیم: ریشه‌ی بزرگ‌تر زیر کوچک‌تر می‌رود و یک درخت درجه‌ی بالاتر می‌سازند، مثل رقم نقلی در جمع. اگر سه درخت هم‌درجه کنار هم باشند، از اولی می‌گذریم و دوتای بعدی را پیوند می‌زنیم.

    • درج: ادغام با هرمی یک‌گره‌ای.
    • حذف کمینه: کمینه یکی از ریشه‌هاست؛ آن را برمی‌داریم و فرزندانش (که خودشان یک هرم دوجمله‌ای‌اند) را دوباره ادغام می‌کنیم.

    ورودی

    عدد مثبت درج می‌شود و 0 یعنی حذف کمینه.