Dijkstra's Algorithm
خوارزمية Dijkstra Dijkstra's Algorithm
خوارزمية Dijkstra تجد أقصر مسار (بالوزن) من عقدة مصدر لكل عقدة أخرى في رسم بياني موزون بأوزان غير سالبة — أساس تطبيقات الملاحة والخرائط.
تتبّع أرخص تكلفة معروفة حتى الآن لكل عقدة، وبكل خطوة تعالج العقدة غير المُعالَجة الأرخص (عبر طابور أولوية/كومة) وتُحدّث تكاليف جيرانها إن وُجد طريق أرخص عبرها — عملية تُسمّى 'الاسترخاء' (Relaxation).
الصياغة
import heapq
distances = {node: float("inf") for node in graph}
distances[start] = 0
pq = [(0, start)]
while pq:
dist, node = heapq.heappop(pq)
for neighbor, weight in graph[node]:
new_dist = dist + weight
if new_dist < distances[neighbor]:
distances[neighbor] = new_dist
heapq.heappush(pq, (new_dist, neighbor))📄 مثال
import heapq
def dijkstra(graph, start):
distances = {node: float("inf") for node in graph}
distances[start] = 0
pq = [(0, start)]
visited = set()
while pq:
dist, node = heapq.heappop(pq)
if node in visited:
continue
visited.add(node)
for neighbor, weight in graph[node]:
new_dist = dist + weight
if new_dist < distances[neighbor]:
distances[neighbor] = new_dist
heapq.heappush(pq, (new_dist, neighbor))
return distances
graph = {"A": [("B", 6), ("C", 2)], "B": [("A", 6), ("D", 3)], "C": [("A", 2), ("D", 1)], "D": [("B", 3), ("C", 1)]}
print(dijkstra(graph, "A")) # {'A': 0, 'B': 6, 'C': 2, 'D': 3}أهم النقاط
| النقطة | الوظيفة |
|---|---|
| التعقيد الزمني | O((V + E) log V) باستخدام كومة (Binary Heap) كطابور أولوية |
| الشرط الإلزامي | كل الأوزان يجب أن تكون غير سالبة — تفشل بأوزان سالبة، استخدم Bellman-Ford عندها |
| الهيكل المساعد | طابور أولوية (Priority Queue / Min-Heap) |
💡 نصائح عملية
- تتبّع العقد التي عُولجت بالفعل (visited) لتفادي إعادة معالجتها من إدخالات قديمة بالكومة — لا يغيّر صحة النتيجة لكنه يحسّن الأداء
⚠️ أخطاء شائعة
- استخدامها مع أوزان سالبة بالرسم البياني — تُنتج نتائج خاطئة صامتة بلا أي خطأ أو تحذير واضح
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DSA الكامل بالعربي.