AlgoVerse

مؤلفه‌های همبند

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

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

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

سه مؤلفه: یک مثلث، یک زنجیر سه‌گره‌ای و یک جفت.

  1. def components(graph, src):
  2. comp = {v: 0 for v in graph}
  3. count = 0
  4. for s in graph:
  5. if comp[s] == 0:
  6. count = count + 1
  7. comp[s] = count
  8. stack = [s]
  9. while stack:
  10. u = stack.pop()
  11. for v, _ in graph[u]:
  12. if comp[v] == 0:
  13. comp[v] = count
  14. stack.append(v)
  15. return comp

ناوردا: گره‌هایی که برچسب یکسان (غیرصفر) دارند، به هم راه دارند؛ گره‌های با برچسب متفاوت راهی به هم ندارند.

شروع اجرا

ABCDEFGH
  • گره‌ی جاری (u)
  • درخت پیمایش (از parent)
  • یالِ در حال بررسی

پشته stack

خالی

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

src'A'

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

graph dict
  • 'A': [('B', 1), ('C', 1)]
  • 'B': [('A', 1), ('C', 1)]
  • 'C': [('B', 1), ('A', 1)]
  • 'D': [('E', 1)]
  • 'E': [('D', 1), ('F', 1)]
  • 'F': [('E', 1)]
  • 'G': [('H', 1)]
  • 'H': [('G', 1)]

Call stack

  1. components()خط 1
گام ۱ از ۹۱
خط سیاه = new_component · خط نارنجی = گام کلیدیtry_start: 0/8 · new_component: 0/3 · visit: 0/8 · check: 0/12 · label: 0/5

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

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

    • check
    • visit
    • ورودی فعلی (n=8)
    050100481216202428n = تعداد گره‌هاcheckvisit
    نمایش به شکل جدول
    ncheckvisit
    410.44
    827.68
    1241.612
    165616
    2070.820
    2474.424
    2894.428
    توضیح

    ایده

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

    1. گره‌ها را به ترتیب مرور کن.
    2. اگر گره‌ای هنوز برچسب ندارد، شمارنده‌ی مؤلفه را زیاد کن و از آن گره یک پیمایش (اینجا DFS با پشته) شروع کن؛ هر گره‌ای که پیمایش به آن برسد همان برچسب را می‌گیرد.

    هزینه

    هر گره یک بار برچسب می‌خورد و هر یال حداکثر دو بار بررسی می‌شود: O(V + E).

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

    • عدد کنار هر گره شماره‌ی مؤلفه‌ی آن است (۰ یعنی هنوز برچسب نخورده).
    • پشته زیر تصویر است؛ با سطح جزئیات «هر دور حلقه» فقط شروع هر مؤلفه‌ی تازه را ببین.