מבני נתונים ואלגוריתמים - מחברת קורס/גרפים/אלגוריתם Kruskal
דף זו עוסק באלגוריתם למציאת העץ הפורש הזול ביותר בגרף לא מכוון בעל טבלת עלויות לקשתות.
כדאי לדעת: בספר הקורס, הפרק "Minimum Spanning Tree" מכסה נושא זה. |
מימוש C++ |
הרעיון הכללי
[עריכה]נפעיל את "אלגוריתם" Grow-Tree, אלא שהסדר שבו נבדוק את הקשתות הוא סדר עולה מבחינת מחירם.
דוגמה: בתרשים הבא, A מתאר את הגרף בהתחלה. אם נמיין את הקשתות בסדר עולה, אז , , ו יהיו הקשתות הראשונות. B, C, וD מראים את הבחירות בהן.
|
פסוודו-קוד
[עריכה]להלן הפסוודו-קוד של אלגוריתם Kruskal.
# Takes a connected undirected graph (G) and a cost table (Edge-Costs)
# Returns a set of edges E' such that (V(G), E') is
# a MST (minimum spanning tree).
MST-Kruskal(G, Edge-Costs)
1 V = V(G)
2 E = E(G)
3 Sets = Make-Array( Length(V) )
4 E' = {}
5 for v in V
6 Sets[v] = Make-Set()
# Sort the edges by increasing cost, using the
# cost-table Edge-Costs.
7 Sort(E)
8 for (u, v) in E
9 if Find-Set(u) != Find-Set(v)
10 E' = E' ∪ {(u, v)}
11 Union(Sets[u], Sets[v])
12 return E'
1-4 מאתחלות מספר מבני נתונים: V
מערך הצמתים, מערך הקשתות, Sets
מערך של מבנה הנתונים היעיל לקבוצות זרות, וE'
קבוצת קשתות (במימוש כלשהו, נניח רשימה מקושרת). 5-6 מאתחלות את מבני הנתונים לקבוצות זרות. 7 ממיינת את מערך הקשתות לפי מחיריהן בסדר עולה (באלגוריתם מיון כלשהו, נניח מיון מיזוג). 8-11 דומות ל"אלגוריתם" Grow-Tree, אלא שכעת הקשתות ממויינות לפי מחיריהן, מה שמשפיע על סדר הפעולות. 12 מחזירה את העפ"מ.
נכונות וסיבוכיות
[עריכה]
משפט: אלגוריתם kruskal מחזיר עפ"מ. |
הוכחה: כאמור, 7 ממיינת את E
לפי מחיר הקשתות. לכן, אם 10 בוחרת בקשת, אז זו הקשת הזולה ביותר מבין הקשתות שעדיין לא השתמשו בהן. הקשתות האחרות ייצרו את העצים שיש עד כה, או שהן חסרות שימוש בשל חיבורן בין צמתים באותו עץ. במילים אחרות, אם 10 בוחרת בקשת, זו בהכרח קשת קלה.
מכאן נובע שהאלגוריתם למעשה מממש את "אלגוריתם" Grow-MST.
כעת ננתח את הסיבוכיות. 1-6 הן . אם 7 משתמשת במיון מיזוג, אז היא . 7 ו8-11 הן (לפי ניתוח הסיבוכיות של מימוש רשומות עם איחוד עפ"י גודל). זמן הריצה הכולל, לכן, הוא .