آرین سليمان زاده
  • الرئيسية
  • المدونة
  • البودكاست
  • الفيديوهات
  • تواصل
العربيةArabic
DeutschGerman
EnglishEnglish
فارسیPersian
한국어Korean
中文Chinese
اللوحة•تواصل سريع

Languages

Choose your interface locale

ar

العربية

Arabic

de

Deutsch

German

en

English

English

fa

فارسی

Persian

ko

한국어

Korean

zh

中文

Chinese

احجز موعداً

أرسل رسالة قصيرة — سأرد في أقرب وقت ممكن.

LinkedInاستجابة سريعة
الرئيسية/المقالات/ما هي خوارزمية Kosaraju وما المشكلة التي تحلها؟
Kosarajuمقال

ما هي خوارزمية Kosaraju وما المشكلة التي تحلها؟

مقدمة مبسطة لخوارزمية Kosaraju لفهم المكونات شديدة الاتصال في الرسوم البيانية الموجهة، والمشكلة التي تحلها، وفكرتها الأساسية، وأهم تطبيقاتها العملية في هندسة البرمجيات.

١٩ أغسطس ٢٠٢٦8 دقيقة قراءة4 المشاهدات
#Kosaraju#Graph Algorithms#Strongly Connected Components#SCC#DFS#Directed Graph#Algorithms#Software Engineering

Arian Soleimanzadeh

Software Engineer & Researcher

تصور لخوارزمية Kosaraju والمكونات شديدة الاتصال في رسم بياني موجه

Arian Soleimanzadeh

ذكاء اصطناعي · برمجة · منتج

بحث + هندسة
في هذه الصفحة
مقدمةما هو الرسم البياني؟ما هو الرسم البياني الموجه؟أين تظهر المشكلة؟ماذا يعني Strongly Connected؟ما هو Strongly Connected Component؟ماذا تفعل خوارزمية Kosaraju؟لماذا نحتاج إلى SCC؟اكتشاف الاعتماديات الدائريةهندسة Microservicesالشبكات الاجتماعيةتحليل صفحات الويبالمترجمات وتحليل البرامجأنظمة الحزملماذا لا يكفي DFS العادي؟الفكرة الأساسية لخوارزمية Kosarajuمثال بسيطالتعقيد الزمنيهل توجد خوارزميات أخرى؟متى نفكر في Kosaraju؟الفرق بين Cycle وSCCالخلاصة

مقدمة

تبدو كثير من خوارزميات الرسوم البيانية معقدة في البداية، لكن معظمها يحل مشكلة يمكن فهمها بسهولة. خوارزمية Kosaraju مثال واضح على ذلك.

تُستخدم Kosaraju لإيجاد المكونات شديدة الاتصال أو Strongly Connected Components (SCCs) داخل رسم بياني موجه.

سنبدأ هنا من المشكلة نفسها قبل الانتقال إلى التفاصيل الرياضية أو البرمجية.


ما هو الرسم البياني؟

الرسم البياني يتكون من مجموعة من العقد أو الرؤوس ومجموعة من الروابط بينها.

مثلاً:

Code
123
A --- B
|     |
C --- D

يمكن استخدام الرسوم البيانية لتمثيل:

  • الشبكات الاجتماعية
  • الطرق بين المدن
  • الاتصال بين الخوادم
  • اعتماديات البرمجيات
  • الروابط بين صفحات الويب
  • تدفق تنفيذ البرامج
  • العلاقات بين الخدمات المصغرة

ما هو الرسم البياني الموجه؟

في الرسم البياني الموجه يكون لكل رابط اتجاه.

مثلاً:

Code
1
A → B

يعني أننا نستطيع الانتقال من A إلى B، لكن ليس بالضرورة من B إلى A.

في نظام برمجي قد يعني:

Code
1
Service A → Service B

أن الخدمة A تعتمد على الخدمة B.


أين تظهر المشكلة؟

انظر إلى الرسم التالي:

Code
12345
A → B → C
↑       ↓
└───────┘

D → E

يمكننا الانتقال من A إلى B، ومن B إلى C، ثم من C إلى A.

إذن المجموعة:

Code
1
{A, B, C}

تتمتع بخاصية مهمة: كل عقدة تستطيع الوصول إلى العقد الأخرى.

لكن في الجزء:

Code
1
D → E

يمكن الوصول من D إلى E، ولكن لا يمكن العودة من E إلى D.


ماذا يعني Strongly Connected؟

تكون العقدتان u وv شديدتي الاتصال إذا كان هناك مسار من u إلى v ومسار آخر من v إلى u.

أي:

Code
1
u → ... → v

و:

Code
1
v → ... → u

في الوقت نفسه.


ما هو Strongly Connected Component؟

المكوّن شديد الاتصال أو SCC هو أكبر مجموعة من العقد بحيث تستطيع كل عقدة الوصول إلى جميع العقد الأخرى داخل المجموعة.

مثلاً:

Code
1234567
A → B → C
↑       ↓
└───────┘

D → E → F
↑       ↓
└───────┘

لدينا:

Code
12
SCC 1 = {A, B, C}
SCC 2 = {D, E, F}

ماذا تفعل خوارزمية Kosaraju؟

تقوم Kosaraju باكتشاف جميع المكونات شديدة الاتصال في الرسم البياني الموجه.

إذا كان لدينا:

Code
123456
A → B
B → C
C → A
C → D
D → E
E → D

فالنتيجة هي:

Code
12
SCC 1 = {A, B, C}
SCC 2 = {D, E}

يمكن تلخيص وظيفة الخوارزمية كالآتي:

تقسيم الرسم البياني الموجه إلى مجموعات تستطيع عقد كل مجموعة الوصول إلى بعضها بعضاً عبر مسارات موجهة.


لماذا نحتاج إلى SCC؟

اكتشاف الاعتماديات الدائرية

إذا كان لدينا:

Code
123
Module A → Module B
Module B → Module C
Module C → Module A

فهذه الوحدات تشكل Circular Dependency ويمكن أن تظهر كمكوّن SCC واحد.

هندسة Microservices

إذا كانت الخدمات تعتمد على بعضها بشكل دائري، فإن تحليل SCC يساعد على اكتشاف هذه المجموعة بسرعة.

الشبكات الاجتماعية

يمكن اعتبار المستخدمين عقداً وعلاقات المتابعة حواف موجهة، ثم تحليل مجموعات المستخدمين التي يمكن الوصول بينها في الاتجاهين.

تحليل صفحات الويب

كل صفحة تمثل عقدة وكل رابط يمثل حافة موجهة. يمكن للمكونات شديدة الاتصال كشف مجموعات الصفحات المترابطة بقوة.

المترجمات وتحليل البرامج

تُستخدم SCCs في تحليل Control Flow Graph وCall Graph وDependency Graph لاكتشاف الهياكل الدورية.

أنظمة الحزم

يمكن استخدام SCC لتحليل الدورات في اعتماديات المكتبات والحزم البرمجية.


لماذا لا يكفي DFS العادي؟

لنفترض:

Code
1
A → B → C

عند تنفيذ DFS من A سنزور A وB وC جميعاً.

لكن هذه العقد ليست SCC واحدة، لأن C لا تستطيع العودة إلى B أو A.

إذن:

Code
1
Reachability ≠ Strong Connectivity

وهنا تأتي أهمية Kosaraju.


الفكرة الأساسية لخوارزمية Kosaraju

تعمل الخوارزمية بصورة عامة في ثلاث مراحل:

  1. تنفيذ DFS على الرسم الأصلي وتسجيل ترتيب انتهاء معالجة العقد.
  2. عكس اتجاه جميع الحواف لإنشاء Transpose Graph.
  3. تنفيذ DFS مرة أخرى على الرسم المعكوس وفق ترتيب محدد.

يمكن تصورها هكذا:

Code
1234567891011
Original Graph
      ↓
     DFS
      ↓
Finish Order
      ↓
Transpose Graph
      ↓
     DFS
      ↓
     SCCs

كل عملية DFS في المرحلة الثانية تكشف مكوّناً شديد الاتصال.


مثال بسيط

Code
1234567
A → B → C
↑       ↓
└───────┘

C → D
D → E
E → D

لدينا:

Code
12
SCC 1 = {A, B, C}
SCC 2 = {D, E}

رغم إمكانية الانتقال من C إلى D، لا يمكن العودة من D أو E إلى A أو B أو C، لذلك تبقى المجموعتان منفصلتين.


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

عند استخدام Adjacency List تعمل Kosaraju في:

Code
1
O(V + E)

حيث:

  • V عدد العقد.
  • E عدد الحواف.

وهذا يجعلها مناسبة حتى للرسوم البيانية الكبيرة.


هل توجد خوارزميات أخرى؟

نعم، من أشهر البدائل:

  • Tarjan's Algorithm
  • Gabow's Algorithm

خوارزمية Tarjan تعمل أيضاً في O(V + E)، ولكن Kosaraju غالباً أسهل للفهم عند تعلم SCC للمرة الأولى.


متى نفكر في Kosaraju؟

إذا ظهرت في مسألة كلمات مثل:

  • Strong Connectivity
  • Mutual Reachability
  • Circular Dependency
  • Directed Graph Components
  • Cyclic Services
  • Cyclic Modules

فمن المناسب التفكير في SCC وخوارزميات مثل Kosaraju.


الفرق بين Cycle وSCC

Cycle هو مسار مغلق مثل:

Code
1
A → B → C → A

أما SCC فهي أكبر مجموعة من العقد التي يمكن لكل عقدة فيها الوصول إلى جميع العقد الأخرى.

يمكن أن يحتوي SCC واحد على عدة دورات مختلفة.


الخلاصة

خوارزمية Kosaraju تُستخدم لإيجاد Strongly Connected Components في الرسوم البيانية الموجهة.

وتظهر فائدتها في تحليل اعتماديات البرمجيات، وبنية Microservices، والشبكات الاجتماعية، والمترجمات، ورسوم الويب، والعديد من الأنظمة الأخرى.

تستخدم الخوارزمية عمليتي DFS ورسمًا معكوسًا، وتعمل في O(V + E) عند استخدام Adjacency List.

الفكرة الأهم هي:

Kosaraju لا تبحث فقط عن دورة، بل تكشف البنية الداخلية للرسم البياني الموجه وتقسمه إلى مجموعات قصوى من العقد التي يمكنها الوصول إلى بعضها بعضاً.

في المقال التالي سنتناول مفهوم Strongly Connected Components بمزيد من التفصيل قبل دراسة تنفيذ Kosaraju خطوة بخطوة.

في هذه الصفحة
مقدمةما هو الرسم البياني؟ما هو الرسم البياني الموجه؟أين تظهر المشكلة؟ماذا يعني Strongly Connected؟ما هو Strongly Connected Component؟ماذا تفعل خوارزمية Kosaraju؟لماذا نحتاج إلى SCC؟اكتشاف الاعتماديات الدائريةهندسة Microservicesالشبكات الاجتماعيةتحليل صفحات الويبالمترجمات وتحليل البرامجأنظمة الحزملماذا لا يكفي DFS العادي؟الفكرة الأساسية لخوارزمية Kosarajuمثال بسيطالتعقيد الزمنيهل توجد خوارزميات أخرى؟متى نفكر في Kosaraju؟الفرق بين Cycle وSCCالخلاصة

تفاصيل المقال

بيانات النشر ووقت القراءة وعدد المشاهدات.

تاريخ النشر

١٩ أغسطس ٢٠٢٦

آخر تحديث

٢٠ أغسطس ٢٠٢٦

وقت القراءة

8 دقيقة قراءة

المشاهدات

4

الكاتب

Arian Soleimanzadeh

المقال السابق

ما هي Longest Common Substring؟ إيجاد أطول جزء متصل مشترك باستخدام Dynamic Programming

المقال التالي

ما هي مسافة هامنج Hamming Distance؟ من الفكرة إلى التنفيذ والتطبيقات العملية

لنبنِ شيئاً نظيفاً، سريعاً، وجميلاً.

تواصل سريع للتعاون، أو الاستشارة، أو العمل على المنتجات.

تواصل سريعراسلني عبر البريد
آرین سليمان زاده

معرض أعمال شخصي يركز على هندسة الويب الحديثة، وأنظمة الواجهات، ومنتجات الذكاء الاصطناعي العملية — كود نظيف، وتصميم نقي.

روابط سريعة

  • نبذة
  • المدونة
  • المشاريع
  • تواصل

تواصل

  • info@ariansoleimanzadeh.site
  • soleimanzadeh.a.work@gmail.com

التوفر: أيام الأسبوع

عادةً يتم الرد خلال 24 ساعة.

النشرة البريدية

احصل على تحديثات حول المقالات، والمشاريع، والإصدارات الجديدة.

© 2026 ariansoleimanzadeh.site — جميع الحقوق محفوظة.

لينكدإن