Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الفرز الطوبولوجي

آخر تحديث

الفرز الطوبولوجي لرسم بياني موجّه لا دوري (DAG) هو ترتيب خطي لعُقده بحيث تأتي u قبل v لكل حافة u → v. يجيب على أسئلة مثل «بأي ترتيب يمكنني تشغيل هذه المهام بحيث ينتهي كل شرط مسبق أولاً؟». اضغط على تشغيل أعلاه لمشاهدة خوارزمية كان تستخرج العُقد بترتيب صحيح.

تأخذ خوارزمية كان بشكل متكرر عقدة لا تملك حواف داخلة متبقية (درجة دخول 0)، وتضيفها إلى الترتيب وتزيل حوافها الخارجة - ما قد يحرر عُقدًا جديدة بدرجة دخول 0. تعمل على DAG فقط: إذا وُجدت دورة فلن تصل بعض العُقد أبدًا إلى درجة دخول 0 ولا يوجد ترتيب صحيح. تعمل في زمن O(V + E).

التعقيد الزمني والمكاني

المقياسالتعقيدملاحظات
الزمنO(V + E)كل عقدة تُخرَج مرة واحدة، وكل حافة تُزال مرة واحدة
المكانO(V)عدادات درجة الدخول + المجموعة الجاهزة + الترتيب
يتطلبرسمًا بيانيًا DAGالدورات ليس لها فرز طوبولوجي
النتيجةغير وحيدةقد توجد عدة ترتيبات صحيحة

خطوة بخطوة (خوارزمية كان)

الخطوةما يحدث
1احسب درجة الدخول (عدد الحواف الداخلة) لكل عقدة.
2اجمع كل العُقد ذات درجة الدخول 0 في مجموعة جاهزة.
3خذ عقدة جاهزة وأضفها إلى ترتيب الإخراج.
4أنقص درجة الدخول لكل من خلفائها.
5أي خلف يصل إلى درجة دخول 0 ينضم إلى المجموعة الجاهزة.
6كرّر حتى تفرغ المجموعة الجاهزة.

مثال محلول

فرز الرسم البياني DAG بالحواف A→C, B→C, C→D, C→E, D→F, E→F (درجات الدخول الابتدائية A:0 B:0 C:2 D:1 E:1 F:2):

الخطوةالمجموعة الجاهزةالترتيبالإجراء
0{A, B}[]تبدأ A وB بدرجة دخول 0، لذا كلاهما جاهز.
1{B}[A]أخرج A؛ حافتها A→C تخفض درجة دخول C من 2 → 1.
2{C}[A, B]أخرج B؛ حافتها B→C تخفض C من 1 → 0، فتصبح C جاهزة.
3{D, E}[A, B, C]أخرج C؛ الحافتان C→D وC→E تخفضان D وE إلى 0، فيصبحان جاهزين.
4{E}[A, B, C, D]أخرج D؛ حافتها D→F تخفض درجة دخول F من 2 → 1.
5{F}[A, B, C, D, E]أخرج E؛ حافتها E→F تخفض F من 1 → 0، فتصبح F جاهزة.
6{}[A, B, C, D, E, F]أخرج F؛ المجموعة الجاهزة فارغة وكل العُقد الست مرتبة - انتهى.

متى تستخدم الفرز الطوبولوجي

استخدمه عندماتجنّبه عندما
تحتاج إلى ترتيب يحترم التبعيات (خطوات البناء، تثبيت الحزم، المتطلبات المسبقة للدورات).يكون الرسم البياني غير موجّه - الترتيب الطوبولوجي معرّف فقط للرسوم الموجّهة.
يكون الرسم البياني DAG وتريد أي ترتيب خطي صحيح.قد يحتوي الرسم البياني على دورات وتحتاج مع ذلك إلى ترتيب كلي (لا يوجد أي ترتيب).
تريد اكتشاف الدورات بتكلفة منخفضة - الفرز الطوبولوجي الفاشل يثبت وجود دورة.تحتاج إلى الترتيب الأقصر أو الأمثل وفق وزن ما؛ الفرز الطوبولوجي البسيط يتجاهل الأوزان.
ستعالج الترتيب مرة واحدة في O(V + E).تتغير الحواف باستمرار وعليك إعادة الفرز عند كل تحديث، حيث تناسب البنية التزايدية أكثر.

كود Topological Sort

تنفيذ نظيف وقابل للتشغيل لخوارزمية Topological Sort بلغات Python, JavaScript, Java, C++, C. اختر لغة، وانسخ الكود، أو افتحه محمّلًا مسبقًا في ساحة تجربة Coddy.

كود Topological Sort بلغة Python

Python
1from collections import deque2
3
4def topological_sort(graph):5    # Kahn's algorithm: repeatedly remove nodes with no incoming edges6    in_degree = {node: 0 for node in graph}7    for node in graph:8        for neighbor in graph[node]:9            in_degree[neighbor] += 110    queue = deque(node for node in graph if in_degree[node] == 0)11    order = []12    while queue:13        node = queue.popleft()14        order.append(node)15        for neighbor in graph[node]:16            in_degree[neighbor] -= 117            if in_degree[neighbor] == 0:18                queue.append(neighbor)19    if len(order) != len(graph):20        raise ValueError("Graph has a cycle, no topological order")21    return order22
23
24graph = {25    "shirt": ["tie", "jacket"],26    "tie": ["jacket"],27    "pants": ["shoes", "jacket"],28    "socks": ["shoes"],29    "shoes": [],30    "jacket": [],31}32
33print(" -> ".join(topological_sort(graph)))
شغّل هذا الكود في ساحة تجربة Python

الأسئلة الشائعة حول الفرز الطوبولوجي

فيمَ يُستخدم الفرز الطوبولوجي؟
يرتّب المهام بحيث تأتي كل تبعية قبل ما يحتاج إليها. تشمل الاستخدامات الواقعية أنظمة البناء ومديري الحزم (ترجمة التبعيات أولاً)، وجدولة الدورات ذات المتطلبات المسبقة، وترتيب تقييم الصيغ في جداول البيانات.
ما هو التعقيد الزمني للفرز الطوبولوجي؟
تعمل كل من خوارزمية كان والنهج المبني على DFS في زمن O(V + E)، لأن كل عقدة تُعالَج مرة واحدة وكل حافة تُفحَص مرة واحدة. وتستخدمان O(V) من المساحة الإضافية.
لماذا يتطلب الفرز الطوبولوجي رسمًا بيانيًا DAG؟
تخلق الدورة الموجّهة تناقضًا: إذا وجب أن تأتي a قبل b ووجب أن تأتي b قبل a، فلا يوجد ترتيب خطي يحقق كليهما. لذا يوجد فرز طوبولوجي إذا وفقط إذا كان الرسم البياني موجّهًا لا دوريًا. تكتشف خوارزمية كان دورة عندما تنتهي قبل إخراج جميع العُقد.
ما الفرق بين خوارزمية كان والفرز الطوبولوجي المبني على DFS؟
خوارزمية كان تكرارية وتشبه BFS: تزيل بشكل متكرر العُقد ذات درجة الدخول 0، ما يجعل اكتشاف الدورات والترتيب صريحين تمامًا. يزور نهج DFS العُقد تعاوديًا ويضع كل عقدة في مقدمة الترتيب عند انتهاء تعاوديتها، منتجًا عكس أزمنة الانتهاء. كلاهما O(V + E)؛ يتجنب كان التعاود العميق ويكشف المجموعة الجاهزة بشكل طبيعي، بينما DFS غالبًا أقصر في الكتابة.
متى ينبغي أن أستخدم الفرز الطوبولوجي بدلاً من الفرز العادي؟
استخدم الفرز الطوبولوجي عندما يُعرَّف الترتيب بالتبعيات بين العناصر بدلاً من مفتاح قابل للمقارنة. يرتّب فرز المقارنة مثل فرز الدمج O(n log n) حسب القيمة؛ أما الفرز الطوبولوجي فيرتّب حسب حواف «يجب أن يأتي قبل»، وخلافًا لفرز المقارنة يمكنه إنتاج عدة إجابات صحيحة للمدخل نفسه.
هل نتيجة الفرز الطوبولوجي وحيدة؟
عادةً لا. كلما كانت عقدتان أو أكثر جاهزتين (درجة دخول 0) في الوقت نفسه، يمكنك إخراجها بأي ترتيب، لذا تسمح معظم الرسوم DAG بعدة ترتيبات طوبولوجية صحيحة. يكون الترتيب وحيدًا فقط عندما توجد عقدة جاهزة واحدة بالضبط في كل خطوة، وهو ما يحدث عندما يشكّل الرسم DAG سلسلة واحدة (مسار هاميلتوني).
Coddy programming languages illustration

أتقن الخوارزميات مع Coddy

ابدأ الآن