מבני נתונים ואלגוריתמים - מחברת קורס/גרפים/אלגוריתם Dijkstra

מתוך testwiki
קפיצה לניווט קפיצה לחיפוש

תבנית:מבני נתונים ואלגוריתמים - מחברת קורס

דף זו עוסק באלגוריתם למציאת המסלול הזול ביותר בגרף מכוון מצומת מוצא כלשהו.

תבנית:הארה


תבנית:מבנה תבנית


הבעיה

נתונים גרף מכוון G=(V,E), טבלת עלויות לקשתות E, וצומת מוצא sV כלשהו. בהינתן צומת vV כלשהו, רוצים לדעת מהו המסלול הזול ביותר מs לv.

תבנית:שימו לב



תבנית:מבנה תבנית


אלגוריתם Dijkstra

הרעיון הכללי

במהלך מציאת הפתרון נחזיק שני מבני נתונים:

  1. תבנית:קוד בשורה, מערך שיחזיק את המרחקים הזולים ביותר.
  2. תבנית:קוד בשורה (שיפורט בהמשך), שיחזיק את קבוצת הצמתים שעדיין אנו שוקלים את מסלולם הזול ביותר.

נפעל עפ"י הצעדים הבאים:

  1. בתחילה נאתחל את כל איברי תבנית:קוד בשורה לתבנית:קוד בשורה, למעט תבנית:קוד בשורה, שאותו נאחל ל0; נכניס את כל הצמתים לתבנית:קוד בשורה.
  2. כל עוד תבנית:קוד בשורה אינו ריק, נשלוף ממנו את הצומת תבנית:קוד בשורה שעבורו תבנית:קוד בשורה הקטן ביותר (מבין אלה שבתבנית:קוד בשורה). נעדכן את ערכי שכניו בתבנית:קוד בשורה.



תבנית:מבנה תבנית


פסוודו-קוד

להלן הפסוודו-קוד לאלגוריתם Dijkstra:

Dijkstra(G, Edge-Costs, s)
1	pq = Make-Priority-Queue()

2	Min-Costs = Make-Array( Length(V(G)) )

3	for u in V(G)
4		Min-Costs[u] = u == s? 0 : 
5		Insert(pq, u)
		
6	while Size(pq) > 0
7		u = Delete-Min(pq)

8		for v in A(G, u)
9			if Min-Costs[v] > Min-Costs[u] + Edge-Costs[ (u, v) ]
10				Min-Costs[v] = Min-Costs[u] + Edge-Costs[ (u, v) ]
11				Decrease-Key(pq, v)
	                	
12	return Min-Costs

ולהלן דוגמה לשימוש בו:

1	Min-Costs = Dijkstra(G, Edge-Costs, 1)

	# Prints 0.
2	Print( Min-Costs[1] )

	# Prints 6.
3	Print( Min-Costs[3] )

הנה הסבר לתבנית:קוד בשורה:

תבנית:שימו לב

נכונות

תבנית:משפט

ההוכחה היא באינדוקציה על הטענות הבאות:

תבנית:משפט


תבנית:הוכחה

ניתוח סיבוכיות

נניח שהגרף נתון ברשימת שכנויות. 1-2 פועלות בבירור בזמן Θ(|V|). 3-5 מבצעת |V| פעולות תבנית:קוד בשורה, ולכן אורכות זמן Θ(|V|log(|V|)) במקרה הגרוע. 6-11 מבצעות |V| פעולות תבנית:קוד בשורה, ולכל היותר |E| פעולות תבנית:קוד בשורה (שעפ"י הנחתנו, סיבוכיותה לוגאריתמית), ולכן הן פועלות בזמן Θ((|V|+|E|)log(|V|)) במקרה הגרוע. הסיבוכיות, לכן, היא Θ((|V|+|E|)log(|V|)) במקרה הגרוע.

תבנית:הארה

תבנית:מבני נתונים ואלגוריתמים - מחברת קורס