درخت پوشای کمینه: مقایسه الگوریتم‌های کروسکال و پریم

اتصال مجموعه‌ای از مکان‌ها با کمترین هزینه کل اتصالات یک مسئله بهینه‌سازی کلاسیک با راه‌حل‌های حریصانه ظریف است. این راهنمای جامع مسئله درخت پوشای کمینه را توضیح می‌دهد، قضیه عمومی مبتنی بر برش که رویکردهای حریصانه برای آن را توجیه می‌کند اثبات می‌کند، و هم الگوریتم کروسکال، ساخته‌شده روی ساختار مجموعه‌مجزا، و هم الگوریتم پریم، ساخته‌شده روی یک صف اولویت، را مرور می‌کند.

الگوریتم پریمدرخت پوشای کمینهالگوریتم کروسکال

~5 دقیقه مطالعه · آخرین به‌روزرسانی ۱۶ شهریور ۱۴۰۵

مسئله درخت پوشای کمینه

با داشتن یک گراف بدون‌جهت متصل با یال‌های وزن‌دار، یک Spanning Tree (درخت پوشا) زیرمجموعه‌ای از یال‌ها است که همه رأس‌ها را بدون تشکیل هیچ چرخه‌ای متصل می‌کند. یک Minimum Spanning Tree (MST) (درخت پوشای کمینه) یک درخت پوشاست که وزن کل یالش تا حد ممکن کوچک است. این مسئله سناریوهایی مانند اتصال شهرها با کمترین طول کل کابل، یا سیم‌کشی یک برد مدار با استفاده از حداقل مقدار مواد اتصال‌دهنده را مدل‌سازی می‌کند.

مثال گراف با یال‌های وزن‌دار:
A-B: 4    A-C: 8
B-C: 8    B-D: 11
C-D: 7    C-E: 2
D-E: 6    D-F: 4
E-F: 14

درخت پوشای کمینه همه رأس‌ها را متصل می‌کند
با استفاده از کوچک‌ترین وزن کل یال ممکن،
و دقیقاً (V-1) یال بدون چرخه انتخاب می‌کند

الگوریتم عمومی MST و ویژگی برش

هر دو الگوریتمی که در این مقاله پوشش داده می‌شوند نمونه‌های خاصی از یک قضیه عمومی‌تر هستند که یک رویکرد حریصانه به این مسئله را توجیه می‌کند. یک Cut (برش) یک گراف را به‌عنوان یک افراز رأس‌هایش به دو مجموعه مجزا تعریف کن، و یک یال Crosses (عبور می‌کند) از برش اگر یک رأس در یک مجموعه را به یک رأس در دیگری متصل کند.

ویژگی برش (بیان غیررسمی):
برای هر برش از گراف، اگر یک یال عبورکننده از برش
وزن دقیقاً کوچک‌تری از هر یال دیگر عبورکننده
از همان برش داشته باشد، آن یال باید در
هر درخت پوشای کمینه گنجانده شود

این قضیه، قابل‌اثبات با استفاده از یک استدلال تبادلی مشابه از نظر سبک با آن‌هایی که برای الگوریتم‌های حریصانه که پیش‌تر در این مجموعه بحث شد استفاده شدند، پایه‌ای است که هم الگوریتم کروسکال و هم پریم روی آن ساخته می‌شوند: هر دو الگوریتم به‌طور مکرر یک "یال ایمن" — یکی که توسط ویژگی برش تضمین می‌شود به برخی درخت پوشای کمینه تعلق دارد — شناسایی می‌کنند و آن را به راه‌حل در حال رشد اضافه می‌کنند.

الگوریتم کروسکال: مرتب‌سازی سراسری یال‌ها

Kruskal's Algorithm (الگوریتم کروسکال) همه یال‌ها را به ترتیب افزایشی وزن در نظر می‌گیرد، و هر یال را به جنگل در حال رشد اضافه می‌کند مگر اینکه این کار یک چرخه ایجاد کند.

MST-KRUSKAL(G, w):
  A = مجموعه خالی
  برای هر رأس v در G.V:
      MAKE-SET(v)
  یال‌های G.E را بر اساس وزن، به ترتیب غیرکاهشی مرتب کن
  برای هر یال (u, v)، به ترتیب مرتب‌شده:
      اگر FIND-SET(u) ≠ FIND-SET(v):
          A = A ∪ {(u, v)}
          UNION(u, v)
  A را برگردان

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

ردیابی الگوریتم کروسکال

یال‌های مرتب‌شده: C-E(2), A-B(4), D-F(4), D-E(6), C-D(7),
              A-C(8), B-C(8), B-D(11), E-F(14)

پردازش C-E(2): مجموعه‌های متفاوت → اضافه کن. MST: {C-E}
پردازش A-B(4): مجموعه‌های متفاوت → اضافه کن. MST: {C-E, A-B}
پردازش D-F(4): مجموعه‌های متفاوت → اضافه کن. MST: {C-E, A-B, D-F}
پردازش D-E(6): مجموعه‌های متفاوت → اضافه کن. MST: {C-E, A-B, D-F, D-E}
پردازش C-D(7): همان مجموعه (C-E-D-F متصل) → رد کن، چرخه ایجاد می‌کرد
پردازش A-C(8): مجموعه‌های متفاوت → اضافه کن. MST: {C-E, A-B, D-F, D-E, A-C}
(5 یال اکنون همه 6 رأس را متصل می‌کنند — MST کامل)

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

الگوریتم پریم: رشد یک درخت واحد

Prim's Algorithm (الگوریتم پریم) رویکرد متفاوتی اتخاذ می‌کند: به‌جای در نظر گرفتن سراسری یال‌ها، یک درخت واحد را از یک رأس دلخواه شروع کرده و رشد می‌دهد، و همیشه ارزان‌ترین یالی که درخت فعلی را به یک رأس جدید هنوز شامل‌نشده متصل می‌کند اضافه می‌کند.

MST-PRIM(G, w, r):
  برای هر رأس u در G.V:
      u.key = infinity
      u.p = NIL
  r.key = 0
  Q = صف اولویت حاوی همه رأس‌های G.V، کلیددهی‌شده با .key
  تا زمانی که Q خالی نباشد:
      u = EXTRACT-MIN(Q)
      برای هر v در Adj[u]:
          اگر v در Q باشد و w(u, v) < v.key:
              v.p = u
              v.key = w(u, v)      // عملیات DECREASE-KEY
  // یال‌های (v, v.p) برای همه v ≠ r، MST را تشکیل می‌دهند

این الگوریتم مستقیماً به ساختار صف اولویت که پیش‌تر در این مجموعه درباره هیپ‌ها بحث شد متکی است: در هر گام، رأس نزدیک‌ترین به درخت در حال رشد را به‌طور کارآمد استخراج می‌کند، و کلیدهای رأس‌های همسایه را وقتی یال‌های اتصال جدید و ارزان‌تر کشف می‌شوند به‌روزرسانی می‌کند.

ردیابی الگوریتم پریم

شروع از رأس A:
استخراج A (کلید 0). به‌روزرسانی: B.key=4, C.key=8
استخراج B (کلید 4). به‌روزرسانی: (بدون بهبود، C.key در 8 می‌ماند)
استخراج C (کلید 8، از طریق A). به‌روزرسانی: D.key=7, E.key=2
استخراج E (کلید 2، از طریق C). به‌روزرسانی: D.key=6 (بهبودیافته)، F.key=14
استخراج D (کلید 6، از طریق E). به‌روزرسانی: F.key=4 (بهبودیافته، از طریق D)
استخراج F (کلید 4، از طریق D)

یال‌های MST حاصل: A-B, A-C, C-E, D-E, D-F

با استفاده از یک هیپ دودویی برای صف اولویت، هرکدام از V فراخوانی EXTRACT-MIN هزینه O(log V) دارد، و در سراسر همه تکرارها، حداکثر E عملیات DECREASE-KEY رخ می‌دهد، هرکدام نیز هزینه O(log V)، که زمان اجرای کل O(E log V) می‌دهد — که با پیچیدگی مجانبی الگوریتم کروسکال مطابقت دارد، هرچند دو الگوریتم از طریق مکانیزم‌های بسیار متفاوتی به آنجا

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

الگوریتم‌های نظریه اعداد: GCD، توان‌رسانی پیمانه‌ای، و RSA

رمزنگاری مدرن و بی‌شمار کاربرد الگوریتمی به تعداد کمی الگوریتم ظریف نظریه اعداد متکی است. این راهنمای جامع الگوریتم اقلیدس برای محاسبه بزرگ‌ترین مقسوم‌علیه مشترک، توان‌رسانی پیمانه‌ای سریع برای محاسبه کارآمد توان‌های بزرگ، و پایه ریاضی رمزنگاری RSA، یکی از پراستفاده‌ترین سیستم‌های رمزنگاری در جهان، را پوشش می‌دهد.

ادامه

اصول هندسه محاسباتی: جهت، تقاطع پاره‌خط، و پوسته محدب

الگوریتم‌های هندسی مسائل شامل نقاط، خطوط، و اشکال را حل می‌کنند، که در گرافیک کامپیوتری، برنامه‌ریزی مسیر رباتیک، و سیستم‌های اطلاعات جغرافیایی ظاهر می‌شوند. این راهنمای جامع آزمون جهت مبتنی بر ضرب خارجی که زیربنای تقریباً هر الگوریتم هندسی است، تشخیص تقاطع پاره‌خط ساخته‌شده روی آن آزمون، و الگوریتم اسکن گراهام برای محاسبه پوسته محدب یک مجموعه از نقاط را پوشش می‌دهد.

ادامه

الگوریتم‌های تطبیق رشته: جستجوی ساده، Rabin-Karp، و فراتر از آن

جستجو برای یک الگو درون یک متن بزرگ‌تر یکی از رایج‌ترین عملیات‌ها در محاسبات است، از ویرایشگرهای متن تا تحلیل توالی DNA. این راهنمای جامع الگوریتم تطبیق رشته ساده و بدترین‌حالت درجه‌دومش را پوشش می‌دهد، سپس استفاده ماهرانه الگوریتم Rabin-Karp از هشینگ برای دستیابی به کارایی سریع حالت‌میانگین را توضیح می‌دهد، شامل نحوه مدیریت درست برخوردهای هش.

ادامه

الگوریتم‌های تقریبی: نزدیک‌شدن اثبات‌پذیر به بهینه برای مسائل سخت

وقتی یک مسئله NP-complete اثبات شود، یک راه‌حل کارآمد دقیق بعید است وجود داشته باشد، اما این به معنای رهاکردن کامل مسئله نیست. این راهنمای جامع الگوریتم‌های تقریبی را توضیح می‌دهد، که تضمین بهینه‌بودن را در ازای تضمین کارایی معامله می‌کنند، و مسائل پوشش رأس و فروشنده دوره‌گرد را به‌عنوان مثال‌های کلاسیک با نسبت‌های تقریبی اثبات‌پذیر پوشش می‌دهد.

ادامه

NP-Completeness توضیح داده شده: P، NP، و چرا برخی مسائل در برابر راه‌حل‌های کارآمد مقاومت می‌کنند

برخی مسائل برای دهه‌ها در برابر هر تلاشی برای یک الگوریتم کارآمد مقاومت کرده‌اند، با این حال هیچ‌کس اثبات نکرده یک راه‌حل کارآمد غیرممکن است. این راهنمای جامع کلاس‌های P و NP، مفهوم تقلیل‌های زمان-چندجمله‌ای مورد استفاده برای مقایسه سختی مسئله، و چگونگی اینکه اثبات NP-complete بودن یک مسئله شواهد قوی، هرچند نه اثبات، فراهم می‌کند که هیچ الگوریتم کارآمدی وجود ندارد را توضیح می‌دهد.

ادامه

جریان بیشینه: فورد-فالکرسون و قضیه برش-کمینه/جریان-بیشینه

مسائل جریان بیشینه بیشترین توان عملیاتی ممکن از میان یک شبکه با اتصالات محدود-به-ظرفیت را مدل‌سازی می‌کنند، از لوله‌های آب تا شبکه‌های داده. این راهنمای جامع شبکه‌های جریان را معرفی می‌کند، روش فورد-فالکرسون برای یافتن جریان بیشینه با استفاده از مسیرهای تقویتی را مرور می‌کند، و قضیه ظریف برش-کمینه/جریان-بیشینه که دو مسئله به‌ظاهر متفاوت را به یکی متصل می‌کند را توضیح می‌دهد.

ادامه