AlgoVerse

الگوریتم بروفکا (سولین)

در هر دور، هر مؤلفه سبک‌ترین یالِ بیرون‌رونده‌اش را برمی‌دارد؛ تعداد مؤلفه‌ها هر دور دست‌کم نصف می‌شود.

قدیمی‌ترین الگوریتم درخت پوشای کمینه (۱۹۲۶). هر گره یک مؤلفه است. در هر دور:

ادامه‌ی توضیح ↓
ورودی:
V=9 · E=14 · src=Aخروجی PDF

همان گراف نه‌گره‌ای کروسکال و پریم؛ درخت وزن کل ۳۷ دارد.

  1. def boruvka(graph, src):
  2. # Boruvka does not need a start node; src is ignored.
  3. comp = {v: v for v in graph}
  4. mst = []
  5. rounds = 0
  6. merged = True
  7. while merged:
  8. merged = False
  9. rounds = rounds + 1
  10. best = {}
  11. for u in graph:
  12. for v, w in graph[u]:
  13. if comp[u] == comp[v]:
  14. continue
  15. c = comp[u]
  16. edge = (w, min(u, v), max(u, v))
  17. if c not in best or edge < best[c]:
  18. best[c] = edge
  19. for w, u, v in sorted(best.values()):
  20. if comp[u] == comp[v]:
  21. continue
  22. mst.append((u, v, w))
  23. old = comp[v]
  24. for x in graph:
  25. if comp[x] == old:
  26. comp[x] = comp[u]
  27. merged = True
  28. return mst

ناوردا: سبک‌ترین یالی که از یک مؤلفه بیرون می‌رود همیشه در یک درخت پوشای کمینه هست، پس همه‌ی یال‌های mst امن‌اند.

شروع اجرا

48118247149102617ABCDEFGHI
  • گره‌ی جاری (u)
  • درخت پوشای کمینه تا اینجا
  • یالِ در حال بررسی

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

src'A'

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

graph dict
  • 'A': [('B', 4), ('H', 8)]
  • 'B': [('A', 4), ('H', 11), ('C', 8)]
  • 'C': [('B', 8), ('I', 2), ('F', 4), ('D', 7)]
  • 'D': [('C', 7), ('F', 14), ('E', 9)]
  • 'E': [('D', 9), ('F', 10)]
  • 'F': [('C', 4), ('D', 14), ('E', 10), ('G', 2)]
  • 'G': [('F', 2), ('I', 6), ('H', 1)]
  • 'H': [('A', 8), ('B', 11), ('G', 1), ('I', 7)]
  • 'I': [('C', 2), ('G', 6), ('H', 7)]

Call stack

  1. boruvka()خط 1
گام ۱ از ۶۵۷
خط سیاه = round · خط نارنجی = گام کلیدیround: 0/3 · check: 0/84 · cheapest: 0/17 · try_add: 0/12 · add: 0/8 · merge: 0/8 · already_joined: 0/4

    رشد تعداد عملیات با اندازه‌ی ورودی

    میانگین ۵ گراف تصادفی برای هر n (با seed ثابت). نشانگر توخالی = ورودی فعلی.

    • check
    • ورودی فعلی (n=9)
    0100200300400481216202428n = تعداد گره‌هاcheck
    نمایش به شکل جدول
    ncheck
    425.2
    882.8
    12124.8
    16168
    20227.2
    24283.6
    28322
    توضیح

    ایده

    قدیمی‌ترین الگوریتم درخت پوشای کمینه (۱۹۲۶). هر گره یک مؤلفه است. در هر دور:

    1. هر مؤلفه سبک‌ترین یالی را که از آن بیرون می‌رود پیدا می‌کند.
    2. همه‌ی این یال‌ها به درخت اضافه می‌شوند و مؤلفه‌هایشان یکی می‌شوند.

    وقتی هیچ مؤلفه‌ای یال خروجی نداشت، کار تمام است.

    چرا سریع است؟

    هر مؤلفه با دست‌کم یک مؤلفه‌ی دیگر یکی می‌شود، پس تعداد مؤلفه‌ها هر دور دست‌کم نصف می‌شود: حداکثر log V دور، هر دور O(E)، جمعاً O(E log V). چون کار هر مؤلفه مستقل است، این روش برای اجرای موازی هم مناسب است.

    شکستن تساوی

    اگر وزن‌ها برابر باشند، دو مؤلفه ممکن است یال‌های متفاوتی انتخاب کنند و دور بسازند. اینجا یال‌ها با (وزن، نام کوچک‌تر، نام بزرگ‌تر) مقایسه می‌شوند تا ترتیب همیشه یکتا باشد.

    در trace به چه چیزی نگاه کنی

    • عدد کنار هر گره نام مؤلفه‌ی آن است؛ ببین بعد از هر دور چند مؤلفه می‌ماند.
    • دیکشنری best در پنل حافظه یال انتخابی هر مؤلفه است.