قائمة المجاورة وتمثيل مصفوفة الرسم البياني

⚡ ملخص ذكي

تُخزّن قوائم التجاور ومصفوفات تمثيل الرسم البياني الرؤوس والحواف في الذاكرة، مما يسمح للخوارزميات باجتياز الشبكات. تستخدم قوائم التجاور قوائم مرتبطة لكل رأس، بينما تستخدم مصفوفات التجاور شبكة مربعة ثنائية الأبعاد.

  • 📐 قائمة الجوار: مصفوفة من V قائمة مرتبطة حيث تخزن كل قائمة في الفهرس i كل رأس مجاور للرأس i، مما يعطي O(V + E) من الذاكرة.
  • 🗺️ مصفوفة التجاور: مصفوفة ثنائية الأبعاد AV × V حيث تحتوي المصفوفة[i][j] على وزن الحافة أو 1 عندما توجد حافة بين الرأس i والرأس j.
  • ⚡ سرعة البحث: تجيب مصفوفة التجاور على سؤال "هل هناك حافة بين i و j؟" في وقت O(1)، بينما تحتاج قائمة التجاور إلى وقت O(degree) لمسح قائمة الجيران.
  • 💾 ذاكرة: تستهلك مصفوفة التجاور دائمًا O(V²) من الذاكرة حتى بالنسبة للرسوم البيانية المتفرقة، في حين أن قائمة التجاور تتناسب مع عدد الحواف الفعلي.
  • 🔍 أفضل ملاءمة: اختر مصفوفة التجاور للرسوم البيانية الكثيفة ذات الاستعلامات المتكررة عن الحواف وقائمة التجاور للرسوم البيانية المتفرقة وأحمال العمل الثقيلة التي تتطلب اجتيازًا مكثفًا.
  • 🛠️ التطبيقات: كلا التمثيلين يدعمان خوارزميات البحث في العرض أولاً، والبحث في العمق أولاً، وخوارزمية ديكسترا، وخوارزمية بيج رانك، وتوجيه شبكة الطرق، وخطوط أنابيب الشبكة العصبية الرسومية المستخدمة في أنظمة الذكاء الاصطناعي.

قائمة المجاورة وتمثيل مصفوفة الرسم البياني

على الرغم من أنها تبدو مختلفة، كل شيء أنواع الرسوم البيانية يمكن تمثيلها بطريقة مماثلة. يوجد عمومًا نوعان من تمثيل الرسوم البيانية:

  1. مصفوفة الجوار
  2. قائمة الجوار

قائمة الجوار

تتكون قائمة التجاور من قوائم متصلة. يُعتبر كل رأس فهرسًا في المصفوفة، ويمثل كل عنصر قائمة متصلة. تحتوي هذه القوائم المتصلة على الرؤوس التي تشترك في حافة مع رأس الفهرس.

فيما يلي مثال على قائمة مجاورة:

قائمة الجوار

لنفترض أن الرسم البياني يحتوي على V من الرؤوس و E من الحواف. التعقيد المكاني لقائمة التجاور هو O(V + E)، والذي يتناسب مع عدد الحواف الحقيقية بدلاً من كل زوج ممكن من الرؤوس.

يصبح تعقيد المساحة في أسوأ الحالات O(V²) إذا كان الرسم البياني المعطى رسمًا بيانيًا كاملاً، لأن كل رأس يتصل بكل رأس آخر.

مصفوفة الجوار

تتكون مصفوفة التجاور من مصفوفة ثنائية الأبعاد. بالنسبة لرسم بياني يحتوي على V رأسًا، سيكون حجم المصفوفة V × V.

قل matrix[i][j] = 5وهذا يعني وجود حافة بين العقدة i والعقدة j حيث يكون الوزن 5.

لنلقِ نظرة على الرسم البياني التالي ومصفوفة التجاور الخاصة به:

مصفوفة الجوار

بنينا مجموعة 2D باستخدام هذه الخطوات:

الخطوة 1) للرأس A حافة مباشرة مع B، ووزنها 5. لذلك، سيتم ملء الخلية في الصف A والعمود B بالقيمة 5. أما بقية الخلايا في الصف A فسيتم ملؤها بالصفر.

الخطوة 2) للرأس B حافة مباشرة مع C، ووزنها 4. لذلك، سيتم ملء الخلية في الصف B والعمود C بالقيمة 4. أما الخلايا المتبقية في الصف B فسيتم ملؤها بالقيمة صفر، لأن B ليس له حافة صادرة إلى أي عقدة أخرى.

الخطوة 3) لا توجد حواف مباشرة بين الرأس C وأي رأس آخر. لذا، سيتم ملء الصف C بالأصفار.

الخطوة 4) للرأس D حافة موجهة مع A و C.

  • ستكون قيمة الخلية في الصف D والعمود A هي 7. وستكون قيمة الخلية في الصف D والعمود C هي 2.
  • سيتم ملء بقية الخلايا في الصف D بالأصفار.

الخطوة 5) للرأس E حافة موجهة مع B و D. ستكون قيمة الخلية في الصف E والعمود B هي 6. ستكون قيمة الخلية في الصف E والعمود D هي 3. أما بقية الخلايا في الصف E فستكون مملوءة بأصفار.

فيما يلي بعض النقاط التي يجب ملاحظتها:

  • لا يحتوي الرسم البياني على حلقات ذاتية عندما يكون القطر الرئيسي لمصفوفة التجاور 0.
  • يكون الرسم البياني موجهاً إذا لم تكن قيم الخلايا عند النقطتين (أ، ب) و(ب، أ) متطابقة. وإلا، يكون الرسم البياني غير موجه.
  • يكون الرسم البياني رسماً بيانياً مرجحاً إذا كانت قيمة أي خلية أكبر من 1.

تكمن المشكلة الرئيسية في مصفوفة التجاور في أنها تتطلب مساحة مربعة. حتى الحواف غير الموجودة تشغل خلايا في الذاكرة.

على سبيل المثال، إذا كان لدينا رسم بياني يحتوي على 100 عقدة، فسنحتاج إلى 10,000 خلية لتخزينه في راماتمع وجود عدد أقل من الحواف في الرسم البياني، قد يكون تخصيص ذاكرة كبيرة كهذه تبذيرًا. لذا فإن تعقيد المساحة باستخدام مصفوفة التجاور هو O(N²)، حيث N هو عدد العقد في الرسم البياني.

قائمة التجاور مقابل مصفوفة التجاور

قبل اختيار التمثيل، من المفيد مقارنة كلا النموذجين جنبًا إلى جنب عبر العمليات التي تهيمن على أحمال العمل الحقيقية للرسوم البيانية:

تشغيلمصفوفة الجوارقائمة الجوار
تعقيد الفضاءO(V²)O(V + E)
أضف رأسًاO(V²)يا (1)
أضف لمسة مميزةيا (1)يا (1)
إزالة حافةيا (1)يا (ه)
تحقق مما إذا كانت الحافة (i, j) موجودةيا (1)O(درجة i)
قم بالتكرار على جيران iيا (الخامس)O(درجة i)
أفضل لالرسوم البيانية الكثيفة، والاستعلامات المتكررة على الحوافالرسوم البيانية المتفرقة، والمهام التي تتطلب اجتيازًا مكثفًا

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

مزايا وعيوب تمثيل الرسوم البيانية

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

مزايا مصفوفة التجاور:

  • استعلامات عن وجود الحواف في وقت ثابت O(1) بين أي زوج من الرؤوس.
  • إن الفهرسة الثابتة تجعل الخوارزميات القائمة على المصفوفات مثل فلويد-وارشال والإغلاق المتعدي سهلة التنفيذ.
  • تتناسب الحواف الموزونة بشكل طبيعي في خلية مصفوفة واحدة.

عيوب مصفوفة التجاور:

  • يهدر O(V²) من الذاكرة عندما يكون الرسم البياني متفرقًا.
  • إضافة رأس جديد تتطلب تغيير حجم المصفوفة بأكملها.
  • يستغرق التكرار على جيران رأس واحد O(V) حتى عندما يكون للرأس عدد قليل من الحواف.

مزايا قائمة التجاور:

  • يستخدم فقط O(V + E) من الذاكرة، وهو قريب من عدد الحواف الحقيقي في الرسوم البيانية المتفرقة.
  • إضافة رأس أو حافة جديدة هي O(1).
  • تقوم خوارزميات الاجتياز مثل BFS و DFS بتكرار الجيران في O(degree)، مما يعطي وقت تشغيل إجمالي قدره O(V + E).

عيوب قائمة التجاور:

  • يستغرق التحقق مما إذا كانت حافة معينة موجودة وقت O(degree) بدلاً من O(1).
  • تكون خاصية التوطين في ذاكرة التخزين المؤقت أضعف لأن القوائم المرتبطة متناثرة عبر الذاكرة.
  • تحتاج الحواف الموزونة إلى حقل مصاحب أو قائمة من الأزواج، مما يزيد من تعقيد بنية البيانات قليلاً.

متى نستخدم قائمة التجاور مقابل مصفوفة التجاور

يعتمد اختيار التمثيل على كثافة الرسم البياني والعمليات التي تُجريها بشكل متكرر. استخدم هذا الدليل السريع لاختيار البنية المناسبة:

  • يفضل استخدام مصفوفة التجاور عندما يكون الرسم البياني كثيفًا (E قريب من V²)، وعندما تتغير الحواف نادرًا، وعندما تسأل خوارزميتك "هل هناك حافة بين i و j؟" عدة مرات.
  • يفضل استخدام قائمة الجوار عندما يكون الرسم البياني متفرقًا (E أصغر بكثير من V²)، وعندما تنمو مجموعة الرؤوس أو الحواف أثناء التنفيذ، وعندما تجتاز الرسم البياني باستخدام BFS أو DFS أو خوارزمية ديكسترا لأقصر مسار.
  • أفضل نموذجًا مختلطًا (قائمة الجوار بالإضافة إلى مجموعة تجزئة من الحواف) عندما تحتاج إلى كل من التكرار السريع للجيران والاستعلامات عن الحواف O(1)، على حساب الذاكرة الإضافية.

تعتمد مكتبات الرسوم البيانية الحديثة مثل NetworkX و igraph بشكل افتراضي على قوائم التجاور لأن معظم الرسوم البيانية في العالم الحقيقي - الشبكات الاجتماعية، وخرائط الطرق، وصفحات الويب، وتبعيات الحزم - تكون متفرقة وتتطلب الكثير من عمليات الاجتياز.

الأسئلة الشائعة

قائمة التجاور هي عبارة عن مصفوفة من V قائمة مرتبطة حيث تخزن كل قائمة في الفهرس i كل رأس مجاور للرأس i. استخدام الذاكرة هو O(V + E)، وهو ما يناسب الرسوم البيانية المتفرقة وخوارزميات الاجتياز مثل BFS و DFS.

مصفوفة التجاور هي مصفوفة ثنائية الأبعاد V × V حيث تحتوي matrix[i][j] على وزن الحافة أو 1 إذا كانت هناك حافة بين الرأس i والرأس j. البحث عن الحافة هو O(1) ولكن الذاكرة دائمًا O(V²).

تُجيب مصفوفة التجاور على استعلامات وجود الحواف في زمن ثابت O(1). أما قائمة التجاور فتُجري عمليات تكرار على الجيران في زمن ثابت O(degree)، وهو أسرع بالنسبة لخوارزميات الاجتياز مثل BFS وDFS وDijkstra. يعتمد الخيار الأمثل على العمليات التي تُهيمن على عبء العمل لديك.

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

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

نعم. بالنسبة للرسوم البيانية الموجهة، تكون المصفوفة غير متناظرة، وتخزن القائمة الجيران الخارجين فقط. أما بالنسبة للرسوم البيانية الموزونة، فتحمل خلية المصفوفة الوزن، بينما تخزن القائمة أزواجًا من الجيران والأوزان.

تُغذي الشبكات العصبية البيانية طبقات التعلم الآلي بمصفوفات التجاور أو موترات الحواف المتفرقة لكشف الاحتيال، والتنبؤ بخصائص الجزيئات، وأنظمة التوصية. كما تعتمد الرسوم البيانية المعرفية على ترميزات قوائم التجاور لتعزيز الذكاء الاصطناعي بالاسترجاع.

نعم. يقوم كل من GitHub Copilot و ChatGPT بإنشاء قوائم التجاور وقوالب المصفوفات لـ Python, C++و Javaلا يزال المطورون بحاجة إلى التحقق من الحالات الشاذة مثل الحواف المكررة والحلقات الذاتية والمعالجة الصحيحة للرسوم البيانية الموجهة أو الموزونة.

تلخيص هذه التدوينة بـ: