أكثر

مصفوفة تجاور للمضلعات باستخدام Java

مصفوفة تجاور للمضلعات باستخدام Java


أحاول إنشاء مصفوفة مجاورة من مجموعة من المضلعات. وهذا يعني أن لدي مجموعة من المضلعات وأريد تحديد المضلعات التي لها حافة مشتركة أو "تلمس" بعضها البعض. بمجرد أن أجد هذه المعلومات ، أريد إنشاء مصفوفة n x n تشير إلى ما إذا كان كل مضلع يلامس أو لا يلمس المضلع الآخر. شيء من هذا القبيل:

بولي 1 بولي 2 بولي 3 بولي 1 0 1 0 بولي 2 1 0 1 بولي 3 0 1 0

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

تحرير: لدي المضلع كرسم ملف الشكل. أعتقد أن المصفوفة المثلثية ستكون جيدة بسبب التناظر.


لقد قمت بتعديل تطبيق Floyd-Warshall الخاص بك لتهيئة المساعد بشكل صحيح للعناصر القطرية للمصفوفة المجاورة ، والتي يجب أن يكون لها قيمة 0. كما قمت بتغيير طريقة floydWarshall لعدم إعادة تخصيص الضبط ، والذي تم تخصيصه بالفعل في الرئيسي طريقة. لقد أزلت أيضًا مكالمة مكررة إلى floydWarshall في طريقة arrayCondenser. لقد قمت أيضًا بتعديل طريقة arrayCondenser لحساب المصفوفة المكثفة ، وإضافة طريقة printCondensedGrid لعرض المصفوفة المكثفة:

أعتقد أن التهيئة أدناه (تم نقلها إلى طريقة التهيئة) يجب أن تعكس صورتك بشكل أكثر دقة.

في الصفوف الزوجية ، توجد حواف من كل عقدة إلى العقدة على يمينها. في الصفوف الفردية ، توجد حواف من كل عقدة إلى العقدة على يسارها. في كل عمود زوجي ، توجد حواف من كل عقدة إلى العقدة أدناه. في كل عمود فردي ، توجد حواف من كل عقدة إلى العقدة أعلاه.

لقد قمت أيضًا بتغيير أبعاد المصفوفة لتعكس حقيقة أن هناك 100 عقدة وليس 99.

لاختبار التهيئة ، أضفت طريقة اختبار testInit. تعمل هذه الطريقة عبر كل عقدة في الرسم البياني وتتحقق من العقد على اليسار واليمين والأعلى والأسفل لمعرفة ما إذا كانت هناك حواف لتلك العقد. يمكنك فحص إخراج طريقة الاختبار ومقارنتها بالصورة أعلاه.

يتم استدعاء كل من التهيئة و testInit من main.

تعديل: لقد نفذت اقتراح جين باستخدام مصفوفة 100 × 4 حيث تمثل الأرقام الأربعة اتجاهات N و S و E و W ، لأن هذه هي الاتجاهات الوحيدة التي يمكن أن توجد فيها الروابط. اقترح الجين 4 بتات ، لكنني استخدمت 4 مواقع مصفوفة تستخدم مساحة أكبر ، لكنني وضعت العقد المجاورة الفعلية في تلك المواقع (إذا كانت غير صفرية).

إذا كنت تريد الاحتفاظ بالفهرسة الأصلية ، فيمكنك تعديل عبارات if في طريقة التهيئة كما يلي:


الدروس

المؤلفون: جوستين بلانفورد ، فريتز كيسلر ، إيمي جريفين ، ديفيد أوسوليفان ، برنامج MGIS ، جامعة ولاية بنسلفانيا.

تعد وحدة البرامج التعليمية هذه جزءًا من مبادرة الموارد التعليمية المفتوحة لكلية علوم الأرض والمعادن في ولاية بنسلفانيا.

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


إيجاد أطوال المسار بواسطة قوة مصفوفة المحاذاة لرسم بياني غير موجه

عرفت من كتاب مارك نيومان - الشبكات: مقدمة (صفحة 137 ، المعادلة: 6.31) هذا ، إذا كان $ A $ هو المصفوفة المجاورة لرسم بياني ، فإن $ ij

محتويات

لرسم بياني بسيط مع مجموعة قمة الرأس يو = <ش1, …, شن > ، المصفوفة المجاورة هي مصفوفة مربعة n × n A بحيث يكون عنصرها Aاي جاي هو واحد عندما يكون هناك حافة من الرأس شأنا إلى قمة الرأس شي ، وصفر في حالة عدم وجود حافة. [1] العناصر القطرية للمصفوفة كلها صفرية ، حيث لا يُسمح بالحواف من الرأس إلى نفسها (الحلقات) في الرسوم البيانية البسيطة. من المفيد أيضًا في بعض الأحيان في نظرية الرسم البياني الجبري استبدال العناصر غير الصفرية بمتغيرات جبرية. [2] نفس المفهوم يمكن أن يمتد إلى المخططات والرسوم البيانية ذات الحلقات عن طريق تخزين عدد الحواف بين كل رأسين في عنصر المصفوفة المقابل ، ومن خلال السماح بعناصر قطرية غير صفرية. يمكن حساب التكرارات إما مرة واحدة (كحافة واحدة) أو مرتين (كحافتين لحافة الرأس) ، طالما يتم اتباع اصطلاح ثابت. غالبًا ما تستخدم الرسوم البيانية غير الموجهة الاصطلاح الأخير لحلقات العد مرتين ، بينما تستخدم الرسوم البيانية الموجهة عادة الاصطلاح السابق.

تحرير رسم بياني ثنائي

يمكن كتابة المصفوفة المجاورة A لرسم بياني ثنائي الأجزاء له رأسان r و s بالشكل

أين ب هو ص × س مصفوفة ، و 0ص,ص و 0س,س تمثل ص × ص و س × س مصفوفات صفرية. في هذه الحالة ، تمثل المصفوفة الأصغر B بشكل فريد الرسم البياني ، ويمكن تجاهل الأجزاء المتبقية من A باعتبارها زائدة عن الحاجة. يُطلق على B أحيانًا اسم مصفوفة الانحراف.

رسميا ، دعونا جي = (يو, الخامس, ه) رسم بياني ثنائي الأجزاء به أجزاء يو = <ش1, …, شص >, الخامس = <الخامس1, …, الخامسس > والحواف E. مصفوفة biadjacency هي ص × س 0-1 مصفوفة ب فيها بأنا,ي = 1 إذا وفقط إذا (شأنا, الخامسي) ∈ ه .

إذا كان G هو رسم بياني متعدد الأجزاء أو رسم بياني مرجح ، فإن العناصر باي جاي تعتبر عدد الأضلاع بين الرؤوس أو وزن الحافة (شأنا, الخامسي) ، على التوالى.

المصفوفة المجاورة للرسم البياني الثنائي هي أحادية النمط تمامًا. هذا يعني أن محدد كل مصفوفة فرعية مربعة لها هو 1 أو 0 أو +1.

تحرير الاختلافات

أن (أ, ب, ج) - مصفوفة الضرب A لرسم بياني بسيط لها أأنا,ي = أ لو (أنا, ي) حافة ، b إذا لم تكن كذلك ، و c على القطر. مصفوفة Seidel المجاورة هي مصفوفة الضرب (−1 ، 1 ، 0). تُستخدم هذه المصفوفة في دراسة الرسوم البيانية المنتظمة والمخططات البيانية ثنائية. [3]

ال مصفوفة المسافة لديه موقف (أنا, ي) المسافة بين الرؤوس vأنا و vي . المسافة هي طول أقصر مسار يربط بين الرؤوس. ما لم يتم توفير أطوال الحواف بشكل صريح ، فإن طول المسار هو عدد الحواف فيه. تشبه مصفوفة المسافة قوة عالية لمصفوفة الجوار ، ولكن بدلاً من معرفة ما إذا كان هناك رأسان متصلان أم لا (أي مصفوفة الاتصال ، التي تحتوي على قيم منطقية) ، فإنها تعطي المسافة الدقيقة بينهما.

تحرير الرسوم البيانية غير الموجهة

الاصطلاح المتبع هنا (للرسوم البيانية غير الموجهة) هو أن كل حافة تضيف 1 إلى الخلية المناسبة في المصفوفة ، وتضيف كل حلقة 2. [4] وهذا يسمح بإيجاد درجة الرأس بسهولة عن طريق أخذ مجموع القيم إما في الصف أو العمود الخاص به في المصفوفة المجاورة.

الإحداثيات هي 0–23.
الحقول البيضاء هي الأصفار ، الحقول الملونة هي الآحاد.

تحرير الرسوم البيانية الموجهة

يمكن أن تكون مصفوفة التقارب للرسم البياني الموجه غير متماثلة. يمكن للمرء أن يحدد مصفوفة التقارب للرسم البياني الموجه إما على هذا النحو

  1. عنصر غير صفري أاي جاي يشير إلى حافة من i إلى j أو
  2. يشير إلى حافة من j إلى i.

يشيع استخدام التعريف السابق في نظرية الرسم البياني وتحليل الشبكة الاجتماعية (على سبيل المثال ، علم الاجتماع والعلوم السياسية والاقتصاد وعلم النفس). [5] هذا الأخير أكثر شيوعًا في العلوم التطبيقية الأخرى (مثل الأنظمة الديناميكية والفيزياء وعلوم الشبكة) حيث يُستخدم A أحيانًا لوصف الديناميكيات الخطية على الرسوم البيانية. [6]

باستخدام التعريف الأول ، يمكن حساب الدرجات الداخلية للرأس عن طريق جمع إدخالات العمود المقابل والدرجة الخارجية للقمة عن طريق جمع إدخالات الصف المقابل. عند استخدام التعريف الثاني ، يتم إعطاء الدرجة الداخلية للرأس بواسطة مجموع الصف المقابل ويتم إعطاء الدرجة الخارجية بواسطة مجموع العمود المقابل.

الإحداثيات هي 0–23.
نظرًا لتوجيه الرسم البياني ، فإن المصفوفة ليست بالضرورة متماثلة.

تحرير الرسوم البيانية تافهة

تحتوي مصفوفة التقارب للرسم البياني الكامل على جميع الآحاد ما عدا على طول القطر حيث لا يوجد سوى الأصفار. مصفوفة التقارب للرسم البياني الفارغ هي مصفوفة صفرية.

تحرير الطيف

المصفوفة المجاورة لرسم بياني بسيط غير موجه متماثلة ، وبالتالي فهي تحتوي على مجموعة كاملة من قيم eigenvalues ​​الحقيقية وأساس متعامد eigenvector. مجموعة قيم eigenvalues ​​للرسم البياني هي نطاق من الرسم البياني. [7] من الشائع الإشارة إلى قيم eigenvalues ​​بواسطة λ 1 ≥ λ 2 ≥ ⋯ ≥ λ n. geq lambda _ <2> geq cdots geq lambda _.>

بالنسبة إلى الرسوم البيانية المنتظمة d ، فإن d هي أول قيمة ذاتية لـ A للمتجه الخامس = (1 ، ... ، 1) (من السهل التحقق من أنها قيمة ذاتية وهي الحد الأقصى بسبب الحد أعلاه). تعدد هذه القيمة الذاتية هو عدد المكونات المتصلة لـ G ، على وجه الخصوص λ 1 & gt λ 2 & gt lambda _ <2>> للرسوم البيانية المتصلة. يمكن إظهار أنه لكل قيمة ذاتية λ i > ، عكسه - λ i = λ n + 1 - i = لامدا _> هي أيضًا قيمة ذاتية لـ A إذا كان G هو رسم بياني ثنائي القسم. [8] على وجه الخصوص - d هي قيمة ذاتية من الرسوم البيانية ثنائية الأجزاء.

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

افترض رسمين بيانيين موجهين أو غير موجهين جي1 و جي2 مع المصفوفات المجاورة أ1 و أ2 أعطي. جي1 و جي2 تكون متشابهة إذا وفقط في حالة وجود مصفوفة تبديل P مثل ذلك

بخاصة، أ1 و أ2 متشابهة وبالتالي لها نفس الحد الأدنى من كثيرات الحدود ، وكثيرات الحدود المميزة ، والقيم الذاتية ، والمحدد والتتبع. وبالتالي يمكن أن تكون هذه بمثابة ثوابت تماثل الأشكال للرسوم البيانية. ومع ذلك ، قد يمتلك رسمان بيانيان نفس مجموعة قيم eigenvalues ​​ولكن لا يكونا متشابهين. [9] ويقال أن هذه العوامل الخطية تكون متساوية الأطياف.

قوى المصفوفة تحرير

إذا كانت A هي المصفوفة المجاورة للرسم البياني G الموجه أو غير الموجه ، فإن المصفوفة أ ن (أي منتج المصفوفة لـ n نسخ من A) له تفسير مثير للاهتمام: العنصر (أنا, ي) يعطي عدد مناحي الطول (الموجهة أو غير الموجهة) n من قمة الرأس i إلى قمة j. إذا كانت n هي أصغر عدد صحيح غير سالب ، مثل العنصر i ، j ، (أنا, ي) من أ ن موجب ، ثم n هي المسافة بين الرأس i والرأس j. هذا يعني ، على سبيل المثال ، أن عدد المثلثات في الرسم البياني غير الموجه G هو بالضبط أثر أ 3 مقسومًا على 6. يمكن استخدام مصفوفة التقارب لتحديد ما إذا كان الرسم البياني متصلًا أم لا.

يمكن استخدام مصفوفة التقارب كهيكل بيانات لتمثيل الرسوم البيانية في برامج الكمبيوتر لمعالجة الرسوم البيانية. هيكل البيانات الرئيسي البديل ، المستخدم أيضًا لهذا التطبيق ، هو قائمة الجوار. [10] [11]

نظرًا لأن كل إدخال في المصفوفة المجاورة يتطلب بتة واحدة فقط ، فيمكن تمثيله بطريقة مضغوطة جدًا ، مع احتلال | الخامس | 2/8 بايت لتمثيل رسم بياني موجه ، أو (باستخدام تنسيق مثلثي معبأ وتخزين الجزء المثلثي السفلي فقط من المصفوفة) تقريبًا | الخامس | 2/16 بايت لتمثيل رسم بياني غير موجه. على الرغم من إمكانية تمثيلات أكثر إيجازًا إلى حد ما ، فإن هذه الطريقة تقترب من الحد الأدنى لنظرية المعلومات للحد الأدنى من البتات اللازمة لتمثيل جميع الرسوم البيانية n -vertex. [12] لتخزين الرسوم البيانية في ملفات نصية ، يمكن استخدام عدد أقل من وحدات البت لكل بايت للتأكد من أن جميع البايتات هي أحرف نصية ، على سبيل المثال باستخدام تمثيل Base64. [13] إلى جانب تجنب المساحة المهدورة ، فإن هذا الاكتناز يشجع على مكانة المرجع. ومع ذلك ، بالنسبة إلى الرسم البياني المتفرق الكبير ، تتطلب قوائم التقارب مساحة تخزين أقل ، لأنها لا تضيع أي مساحة لتمثيل الحواف ليس الحالي. [11] [14]

الشكل البديل لمصفوفة التقارب (الذي يتطلب مساحة أكبر) يستبدل الأرقام الموجودة في كل عنصر من عناصر المصفوفة بمؤشرات كائنات الحافة (عند وجود الحواف) أو المؤشرات الفارغة (عند عدم وجود حافة). [14] من الممكن أيضًا تخزين أوزان الحواف مباشرةً في عناصر مصفوفة متجاورة. [11]

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


تجاور أداة WinBUGS

Adjacency For WinBUGS Tool هي تخصيص لـ ArcMap. تعالج الأداة بشكل متكرر كل مضلع داخل طبقة محددة وتقوم بإنشاء ملف نصي للتجاور متعدد الأضلاع حيث يتم تحديد كل مضلع بواسطة قيمة Adj_ID فريدة. يتم استخدام إخراج هذه الأداة في WinBUGS (وحدة الإحصاء الحيوي في MRC) من خلال التوزيعات الانحدار التلقائي الشرطي للسيارة و car.l1 و mv.car.

"لقد عملنا مع فئة من النماذج تسمى نماذج العد المكاني الهرمي (http://www.umesc.usgs.gov/terrestrial/migratory_birds/bird_conservation.html). هذه الطرز مزودة بطرق مونت كارلو لسلسلة ماركوف في WinBUGS. لاستيعاب إمكانية الارتباط المكاني بين الاستجابات ، نستخدم مكونًا مكانيًا مشروطًا للانحدار الذاتي (CAR المكاني). تتطلب CAR المكانية هذه مصفوفة مجاورة ، أي مصفوفة تربط وحدة مساحية واحدة بمجموعة من الوحدات المساحية المجاورة. من متطلبات هذه المصفوفة التناظر. يمكن لـ GeoBUGS داخل برنامج WinBUGS تسهيل إنشاء مصفوفة التقارب هذه ، ولكننا نجد أنه من الأنسب إجراء جميع عمليات التعيين في ArcGIS. على هذا النحو ، فإن الأداة التي تسهل إنشاء المصفوفة المجاورة لاستخدامها في WinBUGS تكون مفيدة للغاية. "
الدكتور واين ثوجمارتين

  1. حفظ الملف: المجاورة لـWinBUGS.zip على القرص الصلب المحلي الخاص بك
  2. استخراج المحتويات
  3. نقرتين متتاليتين المجاورة لـWinBUGS.esriAddIn ملف
  4. يفتح برنامج ArcMap 10
  5. اضغط على يعدل أو يكيف القائمة و تخصيص الوضع ... العنصر
  6. على ال يعدل أو يكيف انقر فوق مربع الحوار أوامر التبويب
  7. قم بالتمرير لأسفل وانقر فوق أدوات Fox في ملف فئات قائمة
  8. اسحب تجاور WinBUGS زر إلى شريط أدوات على ملف برنامج ArcMap 10 واجهه المستخدم

الشكل 1. إن تجاور WinBUGS الحوار.

  1. انقر على المجاورة لـ WinBUGS زر لفتح تجاور WinBUGS الحوار (الشكل 1).
  2. اختر ملف شكل مضلع قابل للتحرير.
  3. انقر على تصفح زر وتحديد دليل الإخراج.
  4. انقر حسنا زر.
  5. تنفيذ البرنامج:
    1. المجلد المحدد من قبل المستخدم في ملف دليل الإخراج تم إنشاء نص.
      1. سيكون لاسم المجلد البنية التالية: دليل المستخدم المحدد + اسم الطبقة +_الملاصقة_+ رقم تكراري.
      2. سيتم استبدال الأحرف الموجودة في اسم المجلد الجديد والتي تمثل مشكلة لـ ArcMap بأحرف شرطة سفلية.
      3. وتشمل الشخصيات الإشكالية

      1. Raw.txt: يحتوي كل سطر في ملف الإخراج على قائمة بالأرقام. الرقم الأول في القائمة هو Adj_ID من مضلع الإدخال ، جميع الأرقام اللاحقة في القائمة هي Adj_ID قيم المضلعات المجاورة لمضلع الإدخال. مضلع الإدخال فقط Adj_ID سيتم إدراجه إذا لم يكن له جيران متجاورون.
      2. Adj.txt: مطابق لـ Raw.txt ملف مع استثناء واحد ، البادئة Adj_ID تم حذف قيمة مضلع الإدخال. إذا لم يكن مضلع الإدخال يحتوي على أي مجاورات متجاورة ، فسيتم إدخال سطر فارغ.
      3. Num.txt: يحتوي على عدد الجيران لكل مضلع إدخال.
      4. SumNumNeigh.txt: مجموع القيم الموجودة في ملف Num.txt.

      تأثير علوم UMESC

      أصبح الحساب البايزي وسيلة متزايدة الأهمية للتحليل الإحصائي للبيانات. هذه الطرق مناسبة تمامًا لنمذجة البيانات المعقدة ، بما في ذلك البيانات المكانية ، وتوجد برامج مثل WinBUGS و R لتسهيل هذه الحسابات. لسوء الحظ ، تتطلب هذه البيانات المكانية المعقدة إعدادًا دقيقًا للتحليل المناسب. تسهل أداة Adjacency هذا التحليل من خلال تنسيق البيانات المكانية بسهولة في ArcGIS ، وهو نظام المعلومات الجغرافية السائد عالميًا. تساعد أدوات مثل Adjacency Tool على سد فجوة المعلومات بين البرامج الإحصائية وأنظمة المعلومات الجغرافية.


      مصفوفة التجاور للمضلعات باستخدام Java - نظم المعلومات الجغرافية

      الرسم البياني هو هيكل بيانات يتكون من المكونين التاليين:
      1. مجموعة محدودة من الرؤوس تسمى أيضًا العقد.
      2. مجموعة محدودة من الزوج المرتب من النموذج (u ، v) تسمى حافة. تم ترتيب الزوج لأن (u ، v) ليس هو نفسه (v ، u) في حالة الرسم البياني الموجه (di-graph). يشير زوج النموذج (u ، v) إلى وجود حافة من قمة الرأس u إلى قمة الرأس v. وقد تحتوي الحواف على وزن / قيمة / تكلفة.
      تُستخدم الرسوم البيانية لتمثيل العديد من التطبيقات الواقعية: تُستخدم الرسوم البيانية لتمثيل الشبكات. قد تتضمن الشبكات مسارات في مدينة أو شبكة هاتف أو شبكة دائرة. تُستخدم الرسوم البيانية أيضًا في الشبكات الاجتماعية مثل LinkedIn و Facebook. على سبيل المثال ، في Facebook ، يتم تمثيل كل شخص برأس (أو عقدة). كل عقدة عبارة عن هيكل وتحتوي على معلومات مثل معرف الشخص والاسم والجنس والإعدادات المحلية. شاهد هذا لمزيد من تطبيقات الرسم البياني.
      فيما يلي مثال على رسم بياني غير موجه يحتوي على 5 رؤوس.

      الشكلان التاليان هما أكثر تمثيلات الرسم البياني استخدامًا.
      1. مصفوفة الجوار
      2. قائمة الجوار
      هناك تمثيلات أخرى مثل مصفوفة الوقوع وقائمة الوقوع. اختيار تمثيل الرسم البياني هو موقف محدد. يعتمد الأمر كليًا على نوع العمليات التي سيتم إجراؤها وسهولة استخدامها.
      مصفوفة الجوار:
      Adjacency Matrix هي مصفوفة ثنائية الأبعاد بحجم V x V حيث V هي عدد الرؤوس في الرسم البياني. لنفترض أن المصفوفة ثنائية الأبعاد تكون متجاورة [] [] ، فإن ميزة تعديل الفتحة [i] [j] = 1 تشير إلى وجود حافة من الرأس i إلى الرأس j. مصفوفة الجوار للرسم البياني غير المباشر دائمًا ما تكون متماثلة. تُستخدم مصفوفة Adjacency أيضًا لتمثيل الرسوم البيانية الموزونة. إذا كان المجاور [i] [j] = w ، فهناك حافة من الرأس i إلى الرأس j بالوزن w.

      مصفوفة الجوار للرسم البياني المثال أعلاه هي:

      الايجابيات: التمثيل أسهل في التنفيذ والمتابعة. تستغرق إزالة الحافة وقتًا (1). تعتبر الاستعلامات مثل ما إذا كان هناك حافة من قمة الرأس & # 8216u & # 8217 إلى قمة الرأس & # 8216v & # 8217 فعالة ويمكن إجراؤها O (1).
      سلبيات: تستهلك مساحة أكبر O (V ^ 2). حتى لو كان الرسم البياني متناثرًا (يحتوي على عدد أقل من الحواف) ، فإنه يستهلك نفس المساحة. إضافة رأس هو الوقت O (V ^ 2).
      يرجى الاطلاع على نموذج تطبيق Python لمصفوفة المجاورة.
      قائمة الجوار:
      يتم استخدام مجموعة من القوائم. حجم المصفوفة يساوي عدد الرؤوس. دع المصفوفة تكون مصفوفة []. مصفوفة الإدخال [i] تمثل قائمة الرؤوس المجاورة لـ أناقمة ال. يمكن أيضًا استخدام هذا التمثيل لتمثيل رسم بياني مرجح. يمكن تمثيل أوزان الحواف كقوائم من أزواج. فيما يلي تمثيل القائمة المجاورة للرسم البياني أعلاه.

      لاحظ أنه في التنفيذ أدناه ، نستخدم المصفوفات الديناميكية (المتجه في C ++ / ArrayList في Java) لتمثيل قوائم التقارب بدلاً من القائمة المرتبطة. تطبيق المتجه له مزايا سهولة التخزين المؤقت.


      تنفيذ الرسم البياني العام لقائمة التجاور

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

      لكن ما لدي حتى الآن. ويتم تنفيذ ذلك في Java. هي في الأساس فئة edgeNode لها نوع عام ووزن في حالة وزن الرسم البياني بالفعل.

      لدي فئة رسم بياني بها قائمة من الحواف قيمة لعدد الرؤوس وقيمة int للحواف بالإضافة إلى قيمة منطقية لما إذا كان موجهاً أم لا. يطرح السؤال سؤالي الأول ، إذا كان الرسم البياني موجهًا بالفعل ، ألا يجب أن يكون لدي قيمة في صنف edgeNode الخاص بي؟ أو هل سأحتاج فقط إلى إضافة رؤوس أخرى إلى LinkedList الخاصة بي؟ هذا يعني أن الرسم البياني الموجه أكبر بمقدار 2X من الرسم البياني غير الموجه ، أليس كذلك؟

      أخيرًا ، هل لدى أي شخص طريقة قياسية لتهيئة الرسم البياني هناك؟ كنت أفكر في القراءة في ملف محدد بشُرط رأسية ولكن هذا هو عام 1997.

      أعتقد أنه عندما أقوم بإضافة حواف إذا كانت القيمة المنطقية صحيحة ، سأضيف حافة ثانية. حتى الآن ، كل هذا يتوقف على الملف الذي أكتبه. لذلك إذا كتبت ملفًا يحتوي على الرؤوس والأوزان التالية.

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

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

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


      العثور على أقصر مسار في رسم بياني غير موجه متصل بالكامل

      أحاول حل مشكلة لدي قائمة من الإحداثيات ثنائية الأبعاد ، وأريد أن أجد أقصر طريق يربط بينها جميعًا.

      في البداية اعتقدت أن هذه حالة تتعلق بمشكلة بائع متجول ، ومع ذلك:

      • لست بحاجة للعودة إلى مدينة البداية ، والتي أعتقد أن TSP يريدها منك.
      • في هذا المستوى ثنائي الأبعاد حيث نعمل مع مقياس المسافة الإقليدية ، تظل متباينة المثلث ثابتة ، والتي لا تهتم بها خوارزميات TSP العادية ، إذا كنت أتذكرها بشكل صحيح.
      • لا توجد قاعدة "يمكنك فقط زيارة العقدة مرة واحدة" في هذه المشكلة ، يمكن أن يشكل "أقصر مسار" شجرة.

      ثم فكرت بعد ذلك في "عمل رسم بياني واستخدام خوارزمية Prim أو Kruskal لإيجاد (طول) الحد الأدنى من الشجرة الممتدة". ومع ذلك ، فإن تمثيلات الرسم البياني المستخدمة بشكل شائع هي إما مصفوفة مجاورة ، والتي تبدو مضيعة للرسم البياني غير المباشر ، أو قائمة متجاورة ، والتي تكون أبطأ بالنسبة للرسم البياني المتناثر (والرسم البياني المتصل بالكامل هو بالطبع عكس متناثر) .

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


      إقرارات مجال الكائن

      ثم لا تحتاج إلى تحديد منشئ على الإطلاق.

      كقاعدة عامة ، يُفضل استخدام الواجهة كنوع بدلاً من التنفيذ. هذا يجعل من السهل تغيير عمليات التنفيذ في المستقبل. كلاهما لأنك تحدد التنفيذ في أماكن أقل ولأن هذا يفرض عليك كتابة التعليمات البرمجية للواجهة.

      المتغيرات الزائدة عن الحاجة

      لماذا تهتم مع NumVertices؟ لما لا

      ثم لا يتعين عليك الاحتفاظ يدويًا بمتغير إضافي يتتبع المعلومات التي لديك بالفعل.

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

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

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

      لغة غير متسقة

      في عدة مواضع ، تقوم بفرض أنه لكي يكون هناك مسار بين رأسين ، يجب أن يكون كلا الرأسين في الرسم البياني. ومع ذلك ، عند إضافة حافة ، لا تفعل ذلك.

      في كلتا الحالتين ، لديك فقط حواف في الرسم البياني بين رأسين في الرسم البياني.

      الآن ، بدلاً من التحقق دائمًا من الوجود ، نفترض أن الأشياء ستكون موجودة حتى يتم إخبارنا بأنها ليست كذلك. يعمل هذا التغيير في النمط دائمًا تقريبًا عندما يتم اتباع مفتاح يحتوي على مفتاح get على الفور.

      وبالمثل ، نتحقق الآن مما إذا كانت الإضافة قد فعلت أي شيء بعد استدعائها بدلاً من التحقق مما إذا كانت ستعمل ثم استدعائها.

      نظرًا لأن دوائر قصيرة لمشغل & amp & amp ؛ أمبير ، فإن هذا له نفس التأثير كما لو كان الشرط الثاني في ثانية إذا كان داخل الأول.


      شاهد الفيديو: 073 طباعة المصفوفة بالعكس