Topological Sort
الترتيب الطوبولوجي Topological Sort
الترتيب الطوبولوجي يرتّب عقد رسم بياني موجّه بلا دورات (DAG) بحيث تسبق كل عقدة كل عقدة تعتمد عليها — أساس جدولة المهام المترابطة.
يُطبَّق فقط على رسم بياني موجّه وبلا دورات (DAG). أشهر طريقتين: خوارزمية Kahn (تبدأ بالعقد ذات درجة الدخول صفر وتزيلها تدريجيًا)، أو DFS (ادفع كل عقدة لمكدّس بعد استكشاف كل جيرانها، ثم اعكس المكدّس).
الصياغة
from collections import deque
in_degree = {n: 0 for n in graph}
for n in graph:
for neighbor in graph[n]:
in_degree[neighbor] += 1
queue = deque([n for n in graph if in_degree[n] == 0])
order = []
while queue:
node = queue.popleft()
order.append(node)
for neighbor in graph[node]:
in_degree[neighbor] -= 1
if in_degree[neighbor] == 0:
queue.append(neighbor)📄 مثال
from collections import deque
def topological_sort(graph):
in_degree = {n: 0 for n in graph}
for n in graph:
for neighbor in graph[n]:
in_degree[neighbor] += 1
queue = deque([n for n in graph if in_degree[n] == 0])
order = []
while queue:
node = queue.popleft()
order.append(node)
for neighbor in graph[node]:
in_degree[neighbor] -= 1
if in_degree[neighbor] == 0:
queue.append(neighbor)
if len(order) != len(graph):
raise ValueError("يوجد دورة — لا يوجد ترتيب طوبولوجي صالح")
return order
tasks = {"تصميم": ["تطوير"], "تطوير": ["اختبار"], "اختبار": []}
print(topological_sort(tasks)) # ['تصميم', 'تطوير', 'اختبار']أهم النقاط
| النقطة | الوظيفة |
|---|---|
| التعقيد الزمني | O(V + E) |
| الشرط الإلزامي | رسم بياني موجّه وبلا دورات (DAG) فقط |
| الترتيب فريد؟ | لا بالضرورة — قد توجد عدة ترتيبات صحيحة لنفس الرسم البياني |
💡 نصائح عملية
- لو ناتج خوارزمية Kahn يحوي عقدًا أقل من إجمالي عدد عقد الرسم البياني، فهذا يكشف وجود دورة — استخدمها كأداة كشف دورات مجانية
⚠️ أخطاء شائعة
- محاولة تطبيقها على رسم بياني فيه دورة دون التحقق أولًا — تُعطي ترتيبًا جزئيًا ناقصًا بصمت بدل خطأ واضح إن لم تتحقق من طول الناتج
خصائص ذات صلة
🎓 تريد فهم الصورة الكاملة خطوة بخطوة؟ ابدأ من مسار DSA الكامل بالعربي.