الفرز الطوبولوجي
في علم الحاسوب ، يُعرف الترتيب الطوبولوجي للرسم البياني الموجه بأنه ترتيب خطي لرؤوسه بحيث يكون لكل حافة موجهة (u,v) من الرأس u إلى الرأس v ، يأتي u قبل v في الترتيب. على سبيل المثال، قد تمثل رؤوس الرسم البياني مهامًا مطلوب تنفيذها، وقد تمثل الحواف قيودًا تنص على وجوب تنفيذ مهمة قبل أخرى؛ في هذا السياق، يُعد الترتيب الطوبولوجي مجرد تسلسل صحيح للمهام.
بالتحديد، الترتيب الطوبولوجي هو عملية اجتياز للرسم البياني حيث لا تتم زيارة أي عقدة v إلا بعد زيارة جميع العقد التابعة لها . يكون الترتيب الطوبولوجي ممكنًا فقط إذا لم يكن للرسم البياني دورات موجهة ، أي إذا كان رسمًا بيانيًا موجهًا غير دوري (DAG). أي رسم بياني موجه غير دوري (DAG) له ترتيب طوبولوجي واحد على الأقل، وهناك خوارزميات خطية لإنشائه. للترتيب الطوبولوجي تطبيقات عديدة، خاصة في مسائل الترتيب مثل مجموعة أقواس التغذية الراجعة . كما يكون الترتيب الطوبولوجي ممكنًا حتى عندما يحتوي الرسم البياني الموجه غير الدوري (DAG) على مكونات منفصلة .
أمثلة

- 5، 7، 3، 11، 8، 2، 9، 10 (مرئي من اليسار إلى اليمين، من الأعلى إلى الأسفل)
- 3، 5، 7، 8، 11، 2، 9، 10 (الرأس المتاح ذو الرقم الأصغر أولاً)
- 3، 5، 7، 8، 11، 2، 10، 9 ( معجمي حسب الجيران الواردين )
- 5، 7، 3، 8، 11، 2، 10، 9 (أقل الحواف أولاً)
- 7، 5، 11، 3، 10، 8، 9، 2 (الرأس المتاح ذو الرقم الأكبر أولاً)
- 5، 7، 11، 2، 3، 8، 9، 10 (محاولة من الأعلى إلى الأسفل، ومن اليسار إلى اليمين)
- 3، 7، 8، 5، 11، 10، 2، 9 (اختياري)
يُستخدم الترتيب الطوبولوجي عادةً في جدولة سلسلة من المهام بناءً على تبعياتها . تُمثَّل المهام برؤوس، ويوجد ضلع من x إلى y إذا كان يجب إكمال المهمة x قبل بدء المهمة y (على سبيل المثال، عند غسل الملابس، يجب أن تنتهي الغسالة قبل وضع الملابس في المجفف). يُحدد الترتيب الطوبولوجي ترتيب تنفيذ المهام. دُرِسَ تطبيقٌ وثيق الصلة بخوارزميات الترتيب الطوبولوجي لأول مرة في أوائل الستينيات في سياق تقنية PERT لجدولة إدارة المشاريع . [ 1 ] في هذا التطبيق، تُمثِّل رؤوس الرسم البياني مراحل المشروع، وتُمثِّل الأضلاع المهام التي يجب تنفيذها بين كل مرحلة وأخرى. يُشكِّل الترتيب الطوبولوجي أساس خوارزميات الوقت الخطي لإيجاد المسار الحرج للمشروع، وهو سلسلة من المراحل والمهام التي تتحكم في مدة الجدول الزمني الإجمالي للمشروع.
في علوم الحاسوب، تظهر تطبيقات من هذا النوع في جدولة التعليمات ، وترتيب تقييم خلايا الصيغ عند إعادة حساب قيم الصيغ في جداول البيانات ، وتوليف المنطق ، وتحديد ترتيب مهام التجميع في ملفات الإنشاء ، وتسلسل البيانات ، وحل تبعيات الرموز في الروابط . كما يُستخدم لتحديد ترتيب تحميل الجداول ذات المفاتيح الخارجية في قواعد البيانات.
الخوارزميات
تستغرق الخوارزميات المعتادة للفرز الطوبولوجي وقتًا خطيًا في عدد العقد بالإضافة إلى عدد الحواف، بشكل تقاربي.
خوارزمية كان
إحدى هذه الخوارزميات، التي وصفها كان (1962) لأول مرة ، تعمل عن طريق اختيار الرؤوس بنفس ترتيب الفرز الطوبولوجي النهائي. [ 2 ] أولًا، يتم إيجاد قائمة بـ "عقد البداية" التي لا تحتوي على حواف واردة، ثم تُضاف إلى مجموعة S؛ يجب أن توجد عقدة واحدة على الأقل من هذا النوع في رسم بياني غير فارغ (محدود) وغير دوري. ثم:
L ← قائمة فارغة تحتوي على العناصر المرتبة S ← مجموعة جميع العقد التي لا تحتوي على حافة واردة طالما أن S ليست فارغة، قم بإزالة العقدة n من S وأضف n إلى L. لكل عقدة m لها حافة e من n إلى m، قم بإزالة الحافة e من الرسم البياني. إذا لم يكن لدى m أي حواف واردة أخرى ، فأضف m إلى S.إذا كان للرسم البياني حواف، فأرجع خطأ ( يحتوي الرسم البياني على دورة واحدة على الأقل)، وإلا فأرجع L (ترتيب طوبولوجي).
إذا كان الرسم البياني عبارة عن رسم بياني موجه غير دوري (DAG )، فسيكون الحل موجودًا في القائمة L (مع أن الحل ليس بالضرورة فريدًا). وإلا، فيجب أن يحتوي الرسم البياني على دورة واحدة على الأقل، وبالتالي يكون الترتيب الطوبولوجي مستحيلاً.
نظرًا لعدم تفرّد الترتيب الناتج، يمكن أن تكون البنية S ببساطة مجموعة أو طابورًا أو مكدسًا. ويختلف الحل المُنشأ باختلاف ترتيب إزالة العقد n من المجموعة S. ويُشكّل أحد أشكال خوارزمية كان، التي تفصل حالات التعادل معجميًا، عنصرًا أساسيًا في خوارزمية كوفمان-غراهام للجدولة المتوازية ورسم المخططات الطبقية .
البحث العميق أولاً
تعتمد خوارزمية بديلة للفرز الطوبولوجي على البحث العميق أولاً . تقوم الخوارزمية بالمرور على كل عقدة من عقد الرسم البياني، بترتيب عشوائي، وتبدأ بحثًا عميقًا أولاً ينتهي عندما تصل إلى أي عقدة تمت زيارتها بالفعل منذ بداية الفرز الطوبولوجي أو عندما لا تحتوي العقدة على حواف صادرة (أي عقدة طرفية):
L ← قائمة فارغة تحتوي على العقد المرتبة، طالما توجد عقد بدون علامة دائمة، حدد عقدة غير معلمة n، قم بزيارة ( n ). دالة زيارة (العقدة ن ) إذا كانت ن تحتوي على علامة دائمة، فقم بالخروج إذا كانت ن تحتوي على علامة مؤقتة، ثم توقف (الرسم البياني يحتوي على دورة واحدة على الأقل) ضع علامة مؤقتة على الرقم نلكل عقدة m ذات حافة من n إلى m، قم بزيارة ( m ) ضع علامة دائمة على الحرف ن أضف n إلى رأس L
تُضاف كل عقدة n إلى قائمة المخرجات L بعد النظر في جميع العقد الأخرى التي تعتمد على n (جميع العقد التابعة لـ n في الرسم البياني). تحديدًا، عند إضافة العقدة n ، نضمن أن جميع العقد التي تعتمد على n موجودة بالفعل في قائمة المخرجات L: فقد أُضيفت إلى L إما عن طريق الاستدعاء المتكرر للدالة visit() الذي انتهى قبل استدعاء الدالة visit () ، أو عن طريق استدعاء الدالة visit() الذي بدأ حتى قبل استدعاء الدالة visit () . وبما أن كل حافة وعقدة تُزار مرة واحدة، فإن الخوارزمية تعمل في زمن خطي. هذه الخوارزمية، القائمة على البحث العميق أولًا، هي نفسها التي وصفها كورمن وآخرون (2001) ؛ [ 3 ] ويبدو أنها وُصفت لأول مرة منشورةً بواسطة تارجان عام 1976. [ 4 ]
الخوارزميات المتوازية
على جهاز ذي وصول عشوائي متوازٍ ، يمكن إنشاء ترتيب طوبولوجي في زمن قدره O ((log n ) ² ) باستخدام عدد متعدد الحدود من المعالجات، مما يضع المسألة ضمن فئة التعقيد NC² . [ 5 ] إحدى طرق القيام بذلك هي تربيع مصفوفة التجاور للرسم البياني المعطى بشكل متكرر، عددًا لوغاريتميًا من المرات، باستخدام ضرب المصفوفات min-plus مع تعظيم القيمة بدلًا من تصغيرها. تصف المصفوفة الناتجة أطول مسافات المسارات في الرسم البياني. يؤدي فرز الرؤوس حسب أطوال أطول مساراتها الواردة إلى إنتاج ترتيب طوبولوجي. [ 6 ]
خوارزمية للفرز الطوبولوجي المتوازي على أجهزة الذاكرة الموزعة تُوازي خوارزمية كان للرسم البياني الموجه غير الدوري (DAG).[ 7 ] على مستوى عالٍ، تقوم خوارزمية كان بإزالة الرؤوس ذات الدرجة الداخلية 0 بشكل متكرر وإضافتها إلى الترتيب الطوبولوجي بالترتيب الذي أُزيلت به. وبما أن الحواف الخارجة من الرؤوس المُزالة تُزال أيضًا، فستكون هناك مجموعة جديدة من الرؤوس ذات الدرجة الداخلية 0، حيث تُكرر العملية حتى لا يتبقى أي رؤوس. تُنفذ هذه الخوارزميةالتكرارات، حيث D هو أطول مسار في G. يمكن تنفيذ كل تكرار بالتوازي، وهي فكرة الخوارزمية التالية.
فيما يلي، يُفترض أن تقسيم الرسم البياني مُخزّن على p عنصر معالجة (PE)، والتي تحمل علاماتيقوم كل عنصر معالجة (PE) i بتهيئة مجموعة من الرؤوس المحليةمع درجة داخلية 0، حيث يمثل الفهرس العلوي التكرار الحالي. بما أن جميع الرؤوس في المجموعات المحليةإذا كانت درجة الدخول تساوي صفرًا، أي أنها غير متجاورة، فيمكن ترتيبها بأي ترتيب للحصول على فرز طوبولوجي صحيح. ولتعيين فهرس عام لكل رأس، يتم حساب مجموع بادئة على أحجاملذا، في كل خطوة، هناكتمت إضافة الرؤوس إلى عملية الفرز الطوبولوجي.

في الخطوة الأولى، يقوم PE j بتعيين المؤشراتإلى الرؤوس المحلية فيهذه الرؤوس فيتُزال، بالإضافة إلى حوافها الخارجة المقابلة. لكل حافة خارجيةمع نقطة النهاية v في وحدة معالجة أخرىالرسالةيتم نشرها على PE l . بعد جميع الرؤوس فيبعد إزالة الرسائل المنشورة، يتم إرسالها إلى وحدة المعالجة المركزية المقابلة لها. كل رسالةيتم تحديث درجة الدخول للرأس المحلي v . إذا انخفضت درجة الدخول إلى الصفر، تتم إضافة v إلىثم تبدأ الدورة التالية.
في الخطوة k ، يقوم PE j بتعيين المؤشرات، أين يمثل العدد الإجمالي للرؤوس التي تمت معالجتها بعد الخطوة تتكرر هذه العملية حتى لا يتبقى أي رؤوس للمعالجة، وبالتاليفيما يلي نظرة عامة عالية المستوى على برنامج واحد، وبيانات متعددة باستخدام الشفرة الزائفة لهذه الخوارزمية.
لاحظ أن مجموع البادئة للإزاحات المحليةيمكن حسابها بكفاءة بالتوازي.
p عنصر معالجة بمعرفات من 0 إلى p - 1. المدخلات: G = (V, E) DAG، موزعة على عناصر المعالجة، حيث j = 0، ...، p - 1. المخرجات: الترتيب الطوبولوجي لـ G دالة traverseDAGDistributed δ درجة الدخول للرؤوس المحلية V Q = { v ∈ V | δ[ v ] = 0} // جميع الرؤوس ذات درجة الدخول 0 nrOfVerticesProcessed = 0 قم بتنفيذ عملية بناء شاملة باستخدام مجموع البادئات على حجم Q // احصل على الإزاحات والعدد الإجمالي للرؤوس في هذه الخطوة الإزاحة = عدد الرؤوس المعالجة + مجموع (Q i ، من i = 0 إلى j - 1) // j هو فهرس المعالج لكل u في Q localOrder[u] = index++; لكل (u,v) في E، قم بإرسال الرسالة ( u, v ) إلى PE الذي يملك الرأس v، ثم أضف مجموع (|Q i |، من i = 0 إلى p - 1) إلى nrOfVerticesProcessed. قم بتسليم جميع الرسائل إلى جيران الرؤوس في Q استقبال الرسائل للرؤوس المحلية V قم بإزالة جميع الرؤوس في Q لكل رسالة ( u, v ) تم استلامها: إذا كان --δ[v] = 0 أضف v إلى Q طالما أن الحجم الكلي لـ Q أكبر من 0 إرجاع الطلب المحليتعتمد تكلفة الاتصال بشكل كبير على تقسيم الرسم البياني المُعطى. أما بالنسبة لوقت التشغيل، فعلى نموذج CRCW-PRAM الذي يسمح بجلب البيانات وإنقاصها في وقت ثابت، تعمل هذه الخوارزمية في، حيث D هو أطول مسار في G و Δ هي الدرجة القصوى. [ 7 ]
تطبيق على إيجاد أقصر مسار
يمكن أيضًا استخدام الترتيب الطوبولوجي لحساب أقصر المسارات بسرعة عبر رسم بياني موجه غير دوري مُثقَّل . لنفترض أن V هي قائمة الرؤوس في هذا الرسم البياني، مرتبة ترتيبًا طوبولوجيًا. عندئذٍ، تحسب الخوارزمية التالية أقصر مسار من رأس مصدر ما s إلى جميع الرؤوس الأخرى: [ 3 ]
- ليكن d مصفوفة بنفس طول V ؛ ستحتوي هذه المصفوفة على مسافات أقصر مسار من s . اجعل d [ s ] = 0 ، وجميع قيم d [ u ] الأخرى = ∞ .
- ليكن p مصفوفة بنفس طول V ، مع تهيئة جميع عناصرها إلى nil . سيحتوي كل عنصر p [ u ] على العنصر السابق لـ u في أقصر مسار من s إلى u .
- قم بالتكرار على الرؤوس u كما هو مرتب في V ، بدءًا من s :
- لكل رأس v يتبع الرأس u مباشرة (أي، يوجد ضلع من u إلى v ):
- ليكن w وزن الحافة من u إلى v .
- قم بتخفيف حدة الحافة: إذا كان d [ v ] > d [ u ] + w ، فقم بتعيين
- d [ v ] ← d [ u ] + w ,
- p [ v ] ← u .
- لكل رأس v يتبع الرأس u مباشرة (أي، يوجد ضلع من u إلى v ):
بمعنى آخر:
- ليكن d مصفوفة بنفس طول V ؛ ستحتوي هذه المصفوفة على مسافات أقصر مسار من s . اجعل d [ s ] = 0 ، وجميع قيم d [ u ] الأخرى = ∞ .
- ليكن p مصفوفة بنفس طول V ، مع تهيئة جميع عناصرها إلى nil . سيحتوي كل عنصر p [ u ] على العنصر السابق لـ u في أقصر مسار من s إلى u .
- قم بالتكرار على الرؤوس u كما هو مرتب في V ، بدءًا من s :
- لكل رأس v في u (أي، يوجد ضلع من v إلى u ):
- ليكن w وزن الحافة من v إلى u .
- قم بتخفيف حدة الحافة: إذا كان d [ u ] > d [ v ] + w ، فقم بتعيين
- d [ u ] ← d [ v ] + w ,
- p [ u ] ← v .
- لكل رأس v في u (أي، يوجد ضلع من v إلى u ):
على رسم بياني مكون من n رأسًا و m حافة، تستغرق هذه الخوارزمية Θ( n + m ) ، أي وقت خطي . [ 3 ]
رجل فريد
إذا كان للترتيب الطوبولوجي خاصية أن جميع أزواج الرؤوس المتتالية في الترتيب المُرتب متصلة بحواف، فإن هذه الحواف تُشكل مسارًا هاميلتونيًا موجهًا في الرسم البياني الموجه غير الدوري (DAG) . إذا وُجد مسار هاميلتوني، يكون ترتيب الترتيب الطوبولوجي فريدًا؛ فلا يوجد ترتيب آخر يُراعي حواف المسار. على العكس، إذا لم يُشكل الترتيب الطوبولوجي مسارًا هاميلتونيًا، فسيكون للرسم البياني الموجه غير الدوري (DAG) ترتيبان طوبولوجيان صالحان أو أكثر، لأنه في هذه الحالة من الممكن دائمًا تكوين ترتيب صالح ثانٍ عن طريق تبديل رأسين متتاليين غير متصلين بحافة. لذلك، من الممكن اختبار وجود ترتيب فريد، ووجود مسار هاميلتوني، في وقت خطي، على الرغم من صعوبة حل مشكلة المسار الهاميلتوني (NP-hardness) للرسوم البيانية الموجهة الأكثر عمومية (مثل الرسوم البيانية الموجهة الدورية). [ 8 ]
العلاقة بالطلبات الجزئية
ترتبط الترتيبات الطوبولوجية ارتباطًا وثيقًا بمفهوم الامتداد الخطي للترتيب الجزئي في الرياضيات. المجموعة المرتبة جزئيًا هي ببساطة مجموعة من العناصر مع تعريف لعلاقة المتباينة "≤"، والتي تحقق بديهيات الانعكاسية ( x ≤ x )، والتناظر العكسي (إذا كان x ≤ y و y ≤ x فإن x = y ) ، والتعدي (إذا كان x ≤ y و y ≤ z فإن x ≤ z ). أما الترتيب الكلي فهو ترتيب جزئي يكون فيه، لكل عنصرين x و y في المجموعة، إما x ≤ y أو y ≤ x . تُعرف الترتيبات الكلية في علوم الحاسوب بأنها عوامل المقارنة اللازمة لتنفيذ خوارزميات فرز المقارنة . بالنسبة للمجموعات المنتهية، يمكن تعريف الترتيبات الكلية بأنها متواليات خطية من العناصر، حيث تكون علاقة "≤" صحيحة كلما سبق العنصر الأول العنصر الثاني في الترتيب. يمكن استخدام خوارزمية فرز مقارنة لتحويل ترتيب كلي إلى تسلسل بهذه الطريقة. الامتداد الخطي لترتيب جزئي هو ترتيب كلي متوافق معه، بمعنى أنه إذا كان x ≤ y في الترتيب الجزئي، فإن x ≤ y في الترتيب الكلي أيضًا.
يمكن تعريف ترتيب جزئي لأي رسم بياني موجه غير دوري (DAG) بجعل مجموعة العناصر هي رؤوس الرسم البياني، وتعريف العلاقة x ≤ y على أنها صحيحة لأي رأسين x و y ، كلما وُجد مسار موجه من x إلى y ؛ أي عندما يكون y قابلاً للوصول من x . بهذه التعريفات، يكون الترتيب الطوبولوجي للرسم البياني الموجه غير الدوري (DAG) هو نفسه الامتداد الخطي لهذا الترتيب الجزئي. وبالعكس، يمكن تعريف أي ترتيب جزئي على أنه علاقة الوصول في الرسم البياني الموجه غير الدوري (DAG). إحدى طرق القيام بذلك هي تعريف رسم بياني موجه غير دوري (DAG) يحتوي على رأس لكل عنصر في المجموعة المرتبة جزئيًا، وحافة xy لكل زوج من العناصر حيث x ≤ y . طريقة بديلة للقيام بذلك هي استخدام الاختزال المتعدي للترتيب الجزئي؛ بشكل عام، ينتج عن هذا رسومات بيانية موجهة غير دورية (DAG) ذات حواف أقل، لكن علاقة الوصول في هذه الرسومات البيانية الموجهة غير الدورية (DAG) تظل هي نفسها الترتيب الجزئي. باستخدام هذه التركيبات، يمكن للمرء استخدام خوارزميات الترتيب الطوبولوجي لإيجاد امتدادات خطية للترتيبات الجزئية.
العلاقة بتحسين الجدولة
بحسب التعريف، يُعدّ حلّ مسألة جدولة تتضمن مخطط أسبقية حلاً صالحاً لخوارزمية الترتيب الطوبولوجي (بغض النظر عن عدد الآلات)، إلا أن الترتيب الطوبولوجي وحده لا يكفي لحلّ مسألة تحسين الجدولة على النحو الأمثل. تُعدّ خوارزمية هو طريقة شائعة لحل مسائل الجدولة التي تتطلب مخطط أسبقية وتتضمن أوقات معالجة (حيث يكون الهدف هو تقليل أطول وقت إنجاز بين جميع المهام). ومثل الترتيب الطوبولوجي، فإن خوارزمية هو ليست فريدة، ويمكن حلّها باستخدام خوارزمية البحث العمقي أولاً (عن طريق إيجاد أطول مسار ثم تخصيص المهام).
انظر أيضاً
- tsort ، برنامج يونكس للفرز الطوبولوجي
- مجموعة أقواس التغذية الراجعة ، وهي مجموعة من الحواف التي يسمح إزالتها بترتيب الرسم البياني الفرعي المتبقي طوبولوجيًا.
- خوارزمية مكونات تارجان المتصلة بقوة ، وهي خوارزمية تعطي قائمة مرتبة طوبولوجيًا للمكونات المتصلة بقوة في الرسم البياني
- النظام ما قبل الطوبولوجي
مراجع
- ↑ جارناجين، إم بي (1960)، طرق آلية لاختبار اتساق شبكات بيرت ، مذكرة فنية رقم K-24/60، دالغرين، فيرجينيا: مختبر الأسلحة البحرية الأمريكية
- ↑ كان، آرثر ب. (1962)، "الفرز الطوبولوجي للشبكات الكبيرة"، اتصالات رابطة مكائن الحوسبة ، 5 (11): 558-562 ، doi : 10.1145/368996.369025 ، S2CID 16728233
- 1 2 3 كورمن، توماس هـ .؛ ليسرسون، تشارلز إي .؛ ريفست، رونالد ل .؛ شتاين، كليفورد (2001)، "القسم 22.4: الفرز الطوبولوجي"، مقدمة في الخوارزميات ( الطبعة الثانية)، مطبعة معهد ماساتشوستس للتكنولوجيا وماكجرو هيل، الصفحات 549-552 ، ISBN 0-262-03293-7
- ↑ تارجان، روبرت إي. (1976)، "الأشجار الممتدة المنفصلة الحواف والبحث العميق أولاً"، أكتا إنفورماتيكا ، 6 (2): 171-185 ، doi : 10.1007/BF00268499 ، S2CID 12044793
- ↑ كوك، ستيفن أ. (1985)، "تصنيف المشكلات المتعلقة بالخوارزميات المتوازية السريعة"، المعلومات والتحكم ، 64 ( 1-3 ): 2-22 ، doi : 10.1016/S0019-9958(85)80041-3
- ↑ ديكل، إليعازر؛ نسيمي، ديفيد؛ ساهني، سرتاج (1981)، "خوارزميات المصفوفات والرسوم البيانية المتوازية"، مجلة SIAM للحوسبة ، 10 (4): 657-675 ، doi : 10.1137/0210049 ، MR 0635424
- 1 2 ساندرز، بيتر؛ ميلهورن، كورت؛ ديتزفيلبينجر، مارتن؛ ديمينتييف، رومان (2019)، الخوارزميات المتسلسلة والمتوازية وهياكل البيانات: مجموعة الأدوات الأساسية ، دار نشر سبرينغر الدولية، ISBN 978-3-030-25208-3
- ↑ فيرنيه، أوزوالدو؛ ماركنزون، ليليان (1997)، "مسائل هاميلتونية لمخططات التدفق القابلة للاختزال" (ملف PDF) ، وقائع المؤتمر الدولي السابع عشر لجمعية علوم الحاسوب التشيلية ، الصفحات 264-267 ، doi : 10.1109/SCCC.1997.637099 ، hdl : 11422/2585 ، ISBN 0-8186-8052-0، S2CID 206554481
للمزيد من القراءة
- DE Knuth ، فن برمجة الحاسوب ، المجلد 1، القسم 2.2.3، والذي يقدم خوارزمية للفرز الطوبولوجي لترتيب جزئي، وتاريخ موجز.
- Bertrand Meyer ، Touch of Class: Learning to Program Good with Objects and Contracts ، Springer ، 2009، الفصل 15، تصميم وهندسة خوارزمية: فرز طوبولوجي ، باستخدام لغة برمجة حديثة، لعرض تعليمي مفصل للفرز الطوبولوجي (باستخدام متغير من خوارزمية Kahn) مع مراعاة تصميم بنية البيانات، وتصميم واجهة برمجة التطبيقات، واعتبارات هندسة البرمجيات.
روابط خارجية
- خوارزميات الرسوم البيانية
- خوارزميات الفرز
- الرسوم البيانية الموجهة غير الدورية
