قائمة الانتظار ذات الأولوية

في علوم الحاسوب ، يُعدّ طابور الأولوية نوعًا مجردًا من البيانات، يُشبه الطابور العادي ، حيث يرتبط كل عنصر بأولوية تُحدد ترتيب خدمته. [ 1 ] يُعالج طابور الأولوية العناصر ذات الأولوية الأعلى أولًا. [ 1 ] يجب أن تكون قيم الأولوية من نوع بيانات مُرتب، ويمكن إعطاء أولوية أعلى إما للقيم الأقل أو للقيم الأعلى وفقًا لعلاقة الترتيب المُعطاة. على سبيل المثال، في مكتبة جافا القياسية، يعتبر صنف PriorityQueue العنصر الأدنى ترتيبًا هو ذو الأولوية الأعلى. [ 2 ]

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

العمليات

تحتوي قائمة الانتظار ذات الأولوية على العمليات التالية: [ 3 ] [ 4 ] [ 5 ]

قائمة انتظار ذات أولوية قصوى

  • insert(S, element, priority): [ 4 ] [ 5 ] أضف عنصرًا إلى المجموعة Sمع أولوية مرتبطة به.
  • maximum(S): أعد العنصر ذو الأولوية الأعلى .
    يُعرف هذا أيضًا باسم " find_max".
  • extract_max(S): قم بإزالة العنصر Sذي الأولوية الأعلى من المجموعة ، ثم أعده.
    يُعرف هذا أيضًا باسم " delete", [ 4 ] أو " extract". [ 5 ]
  • increase_key(S, element, k): زيادة الأولوية المرتبطة بعنصر ما إلى القيمة الجديدة k.

قائمة انتظار ذات أولوية دنيا

  • insert(S, element, priority): [ 4 ] [ 5 ] أضف عنصرًا إلى المجموعة Sمع أولوية مرتبطة به.
  • minimum(S): أعد العنصر ذو الأولوية الأقل .
    يُعرف هذا أيضًا باسم " find_min".
  • extract_min(S): قم بإزالة العنصر Sذي الأولوية الأقل من المجموعة ، ثم أعده.
    يُعرف هذا أيضًا باسم " delete", [ 4 ] أو " extract". [ 5 ]
  • decrease_key(S, element, k): تقليل الأولوية المرتبطة بعنصر ما إلى القيمة الجديدة k.

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

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

تطبيق

تطبيقات ساذجة

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

  • أدخل عناصر في مصفوفة غير مرتبة؛ ابحث عن العنصر ذي الأولوية الأعلى واستخرجه.
    الأداء: " insertيؤدي فييا(1){\displaystyle O(1)}زمن ثابت، حيث extract_maxيتم تنفيذ " " فييا(ن){\displaystyle O(n)}زمن خطي.
إدراج (العنصر، الأولوية): node.element ← element أولوية العقدة ← الأولوية list.append(node) extract_max (): أعلى ← 0 لكل عقدة في القائمة: إذا كانت أعلى أولوية < أولوية العقدة: أعلى عقدة ← list.remove(highest) إرجاع أعلى عنصر
  • أدرج العناصر في مصفوفة مرتبة؛ استخرج العنصر الأول
    الأداء: " insertيؤدي فييا(ن){\displaystyle O(n)}زمن خطي، حيث extract_maxيتم تنفيذ " " فييا(1){\displaystyle O(1)}زمن ثابت.
إدراج (العنصر، الأولوية): node.element ← element أولوية العقدة ← الأولوية for i in [0...N]: العنصر ← list.get_at_index(i) إذا كانت أولوية العنصر أقل من أولوية العقدة: list.insert_at_index(node, i + 1) يعود extract_max (): أعلى ← list.get_at_index(0) list.remove(highest) إرجاع أعلى عنصر

التنفيذ المعتاد

لتحسين الأداء، تعتمد قوائم الانتظار ذات الأولوية عادةً على كومة ، مما يعطييا(سجلن){\displaystyle O(\log n)}الأداء في عمليات الإدخال والإزالة، ويا(ن){\displaystyle O(n)}لبناء الكومة مبدئيًا من مجموعة منن{\displaystyle n}العناصر. يمكن أن توفر متغيرات بنية بيانات الكومة الأساسية، مثل أكوام الاقتران أو أكوام فيبوناتشي، حدودًا أفضل لبعض العمليات. [ 6 ]

بدلاً من ذلك، عند استخدام شجرة بحث ثنائية متوازنة ذاتيًا ، فإن عمليات الإضافة والإزالة تستغرق أيضًايا(سجلن){\displaystyle O(\log n)}يستغرق الأمر بعض الوقت، على الرغم من أن بناء الأشجار من تسلسلات العناصر الموجودة يستغرق وقتًا.يا(نسجلن){\displaystyle O(n\log n)}الوقت؛ وهذا أمر شائع في الحالات التي قد يكون فيها الوصول إلى هذه الهياكل البياناتية متاحًا مسبقًا، كما هو الحال مع المكتبات الخارجية أو المكتبات القياسية. من منظور تعقيد المساحة، يتطلب استخدام شجرة البحث الثنائية ذاتية التوازن مع القائمة المرتبطة مساحة تخزين أكبر، نظرًا لأنه يستلزم تخزين مراجع إضافية للعقد الأخرى.

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

أكوام متخصصة

توجد العديد من هياكل بيانات الكومة المتخصصة التي توفر عمليات إضافية أو تتفوق على تطبيقات الكومة لأنواع محددة من المفاتيح، وتحديدًا المفاتيح العددية. لنفترض أن مجموعة المفاتيح الممكنة هي{1،2،...،ج}{\displaystyle \{1,2,...,C\}}.

  • عندما تكون هناك حاجة فقط insertإلى عناصر find-minو extract-minوفي حالة أولويات الأعداد الصحيحة، يمكن إنشاء قائمة انتظار دلوية كمصفوفة منج{\displaystyle C}القوائم المتصلة بالإضافة إلى المؤشرقمة{\displaystyle {\text{أعلى}}}، بدءًاج{\displaystyle C}إدراج عنصر باستخدام مفتاحك{\displaystyle k}يُلحق العنصر بـك{\displaystyle k}القائمة، والتحديثاتقمةمين(قمة،ك){\displaystyle {\text{top}}\gets {\text{min}}({\text{top}},k)}كلاهما في وقت ثابت. extract-minيحذف ويعيد عنصرًا واحدًا من القائمة ذات الفهرسقمة{\displaystyle {\text{أعلى}}}ثم تزدادقمة{\displaystyle {\text{أعلى}}}إذا لزم الأمر حتى يشير مرة أخرى إلى قائمة غير فارغة؛ وهذا يستغرقيا(ج){\displaystyle O(C)}الوقت في أسوأ الحالات. تُفيد هذه الطوابير في فرز رؤوس الرسم البياني حسب درجتها. [ 7 ] : 374
  • تدعم شجرة فان إمده بواس العمليات التالية :​​​​minimummaximuminsertdeletesearchextract-minextract-maxpredecessorsuccessor]يا(سجلسجلج){\displaystyle O(\log \log C)}يستغرق الأمر بعض الوقت، ولكنه يتطلب مساحة للطوابير الصغيرة تبلغ حوالييا(2م/2){\displaystyle O(2^{m/2})}، أينم{\displaystyle m}يمثل عدد البتات في قيمة الأولوية. [ 8 ] يمكن تقليل المساحة بشكل كبير باستخدام التجزئة.
  • تُنفذ شجرة الاندماج التي وضعها فريدمان وويلارد العملية فيminimumيا(1){\displaystyle O(1)}الوقت insertوالعمليات extract-minفييا(سجلن/سجلسجلج){\displaystyle O(\log n/\log \log C)}الوقت. ومع ذلك، يذكر المؤلف أن "خوارزمياتنا ذات أهمية نظرية فقط؛ فالعوامل الثابتة التي تدخل في أوقات التنفيذ تحول دون تطبيقها عمليًا." [ 9 ]

بالنسبة للتطبيقات التي تُجري العديد من عمليات " النظرة الخاطفة " لكل extract-minعملية " "، يمكن تقليل التعقيد الزمني لعمليات النظرة الخاطفة إلىيا(1){\displaystyle O(1)}في جميع تطبيقات الأشجار والأكوام، يتم تخزين العنصر ذي الأولوية الأعلى مؤقتًا بعد كل عملية إدراج وحذف. بالنسبة للإدراج، لا تتجاوز التكلفة الإضافية حدًا أقصى ثابتًا، حيث تتم مقارنة العنصر المُدرج حديثًا بالعنصر الأدنى المُخزن مؤقتًا سابقًا. أما بالنسبة للحذف، فلا تتجاوز التكلفة الإضافية حدًا أقصى قدره "نظرة سريعة"، وهي عادةً أقل تكلفة من تكلفة الحذف، لذا لا يتأثر التعقيد الزمني الإجمالي بشكل ملحوظ.

تُعدّ قوائم الانتظار ذات الأولوية الرتيبة قوائم انتظار متخصصة مُحسّنة لحالة عدم إدخال أي عنصر ذي أولوية أقل (في حالة الكومة الدنيا) من أي عنصر تم استخراجه سابقًا. ويُلبّى هذا الشرط في العديد من التطبيقات العملية لقوائم الانتظار ذات الأولوية.

ملخص أوقات التشغيل

فيما يلي تعقيدات زمنية [ 10 ] لهياكل بيانات الكومة المختلفة. يشير الاختصار am. إلى أن التعقيد المذكور هو التعقيد المُستهلك، وإلا فهو تعقيد أسوأ حالة. لمعرفة معنى " O ( f )" و" Θ ( f )"، راجع ترميز Big O. تفترض أسماء العمليات وجود كومة دنيا.

عمليةالبحث عن الحد الأدنىحذف الحد الأدنىمفتاح التناقصأدخلاندماجmake-heap [ a ]
ثنائي [ 10 ]Θ (1)Θ (log n ) Θ (log n ) Θ (log n ) Θ ( n )Θ ( n )
الانحراف [ 11 ]Θ (1)O (log n ) am. O (log n ) am. O (log n ) am. O (log n ) am. Θ ( n ) am.
يساري [ 12 ]Θ (1)Θ (log n ) Θ (log n ) Θ (log n ) Θ (log n ) Θ ( n )
ذات الحدين [ 10 ] [ 14 ]Θ (1)Θ (log n ) Θ (log n ) Θ (1) صباحًا.Θ (log n ) [ b ] Θ ( n )
التوزيع الثنائي المائل [ 15 ]Θ (1)Θ (log n ) Θ (log n ) Θ (1)Θ (log n ) [ b ] Θ ( n )
2-3 كومة [ 17 ]Θ (1)O (log n ) am. Θ (1)Θ (1) صباحًا.O (log n ) [ b ] Θ ( n )
الانحراف من الأسفل إلى الأعلى [ 11 ]Θ (1)O (log n ) am. O (log n ) am. Θ (1) صباحًا.Θ (1) صباحًا.Θ ( n ) am.
الاقتران [ 18 ]Θ (1)O (log n ) am. o (log n ) am. [ c ] Θ (1)Θ (1)Θ ( n )
الاقتران بالرتب [ 21 ]Θ (1)O (log n ) am. Θ (1) صباحًا.Θ (1)Θ (1)Θ ( n )
فيبوناتشي [ 10 ] [ 22 ]Θ (1)O (log n ) am. Θ (1) صباحًا.Θ (1)Θ (1)Θ ( n )
فيبوناتشي الصارم [ 23 ] [ د ]Θ (1)Θ (log n ) Θ (1)Θ (1)Θ (1)Θ ( n )
برودال [ 24 ] [ د ]Θ (1)Θ (log n ) Θ (1)Θ (1)Θ (1)Θ ( n ) [ 25 ]
  1. عملية بناء الكومة هي عملية إنشاء كومة من سلسلة من n عنصرًا غير مُرتبة. يمكن إنجازها فيزمن Θ ( n ) بينما تعمل خوارزمية دمج العناصر في زمن O (log n ) (حيث يمكن توزيع كلا التعقيدين). [ 11 ] [ 12 ] وتحقق خوارزمية أخرى زمن Θ ( n ) للكومات الثنائية. [ 13 ] 
  2. بالنسبة للأكوام المستمرة (التي لا تدعم تقليل المفتاح )، يُقلل تحويل عام تكلفة دمج العناصر إلى تكلفة إدراجها ، بينما تكون التكلفة الجديدة لحذف الحد الأدنى هي مجموع التكاليف القديمة لحذف الحد الأدنى ودمج العناصر . [ 16 ] هنا، يجعل هذا التحويل دمج العناصر يعمل في زمن Θ (1) (مُستهلك، إذا كانت تكلفة الإدراج كذلك)، بينما لا يزال حذف الحد الأدنى يعمل في زمن O (log n ). عند تطبيقه على أكوام ذات توزيع ثنائي منحرف، ينتج عنه طوابير برودال-أوكاساكي، وهي أكوام مستمرة ذات تعقيدات مثلى في أسوأ الحالات. [ 15 ] 
  3. الحد الأدنى لـΩ(سجلسجلن)،{\displaystyle \Omega (\log \log n),}[ 19 ] الحد الأعلى لـيا(22سجلسجلن).{\displaystyle O(2^{2{\sqrt {\log \log n}}}).}[ 20 ]
  4. تُحقق طوابير برودال وأكوام فيبوناتشي الصارمة أفضل تعقيد في أسوأ الحالات للأكوام. وقد وُصفت في البداية بأنها هياكل بيانات إجرائية. أما طابور برودال-أوكاساكي فهو هيكل بيانات مستمر يحقق نفس المستوى الأمثل، باستثناء أنهلا يدعم خاصية تقليل المفتاح .

تكافؤ قوائم الانتظار ذات الأولوية وخوارزميات الفرز

استخدام قائمة انتظار ذات أولوية للفرز

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

اسمتنفيذ قائمة الانتظار ذات الأولويةأفضلمتوسطأسوأ
فرز الكومةكومةنسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}
سموث سورتليوناردو هيبن{\displaystyle n}نسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}
فرز التحديدمصفوفة غير مرتبةن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}
فرز الإدراجالمصفوفة المرتبةن{\displaystyle n}ن2{\displaystyle n^{2}}ن2{\displaystyle n^{2}}
فرز الشجرةشجرة بحث ثنائية ذاتية التوازننسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}نسجلن{\displaystyle n\log n}

استخدام خوارزمية فرز لإنشاء قائمة انتظار ذات أولوية

يمكن أيضًا استخدام خوارزمية فرز لتنفيذ قائمة انتظار ذات أولوية. على وجه التحديد، يقول ثورب: [ 26 ]

نقدم اختزالًا خطيًا عامًا حتميًا للمساحة من قوائم الانتظار ذات الأولوية إلى الفرز، مما يعني أنه إذا استطعنا الفرز حتىن{\displaystyle n}المفاتيح فيS(ن){\displaystyle S(n)}الوقت لكل مفتاح، ثم هناك قائمة انتظار ذات أولوية تدعم deleteذلك insertوفييا(S(ن)){\displaystyle O(S(n))}في زمن find-minثابت.

أي، إذا كانت هناك خوارزمية فرز يمكنها الفرز فييا(S){\displaystyle O(S)}الوقت لكل مفتاح، حيثS{\displaystyle S}هي وظيفة من وظائفن{\displaystyle n}وباستخدام حجم الكلمة ، [ 27 ] يمكن للمرء استخدام الإجراء المعطى لإنشاء قائمة انتظار ذات أولوية حيث يكون سحب العنصر ذي الأولوية الأعلى هويا(1){\displaystyle O(1)}الوقت، وإضافة عناصر جديدة (وحذف العناصر) هويا(S){\displaystyle O(S)}الوقت. على سبيل المثال، إذا كان لدى المرءيا(نسجلن){\displaystyle O(n\log n)}باستخدام خوارزمية الفرز، يمكن إنشاء قائمة انتظار ذات أولويةيا(1){\displaystyle O(1)}سحب ويا(سجلن){\displaystyle O(\log n)}إدخال.

المكتبات

غالباً ما تعتبر قائمة الانتظار ذات الأولوية بمثابة " بنية بيانات حاوية ".

تُحدد مكتبة القوالب القياسية (STL)، ومعيار C++ لعام 1998، std :: priority_queue كأحد قوالب فئة محول حاويات STL . مع ذلك ، لا تُحدد كيفية خدمة عنصرين لهما نفس الأولوية، وفي الواقع، لن تُعيد التطبيقات الشائعة العناصر وفقًا لترتيبها في قائمة الانتظار. يُنفذ std::priority_queue قائمة انتظار ذات أولوية قصوى، وله ثلاثة مُعاملات: كائن مُقارنة للفرز، مثل كائن دالة (يُستخدم افتراضيًا إذا لم يُحدد)، والحاوية الأساسية لتخزين هياكل البيانات (يُستخدم افتراضيًا )، ومُكرران لبداية ونهاية التسلسل. على عكس حاويات STL الفعلية، لا يسمح std:: priority_queue بتكرار عناصره (فهو يلتزم التزامًا صارمًا بتعريف نوع بياناته المُجرد). تحتوي STL أيضًا على دوال مساعدة لمعالجة حاوية وصول عشوائي أخرى ككومة ثنائية قصوى. كما تحتوي مكتبات Boost على تطبيق في كومة المكتبة.less<T>std::vector<T>

تقوم وحدة heapq في بايثون بتنفيذ كومة ثنائية دنيا فوق قائمة.

تحتوي مكتبة جافا على فئةPriorityQueue ( java.util.PriorityQueue)، والتي تنفذ قائمة انتظار ذات أولوية دنيا ككومة ثنائية.

تحتوي مكتبة .NET على فئة System.Collections.Generic.PriorityQueue ، والتي تنفذ كومة دنيا رباعية مدعومة بمصفوفة.

تحتوي مكتبة Scala على فئة scala.collection.mutable.PriorityQueue ، والتي تنفذ قائمة انتظار ذات أولوية قصوى.

تحتوي مكتبة Go على وحدة حاوية/كومة ، والتي تنفذ كومة دنيا فوق أي بنية بيانات متوافقة.

تحتوي المكتبة القياسية للغة Rust على بنية std::collections::BinaryHeap ، والتي تنفذ قائمة انتظار ذات أولوية مع كومة ثنائية.

يحتوي ملحق مكتبة PHP القياسية على الفئة SplPriorityQueue .

يحتوي إطار عمل Core Foundation الخاص بشركة Apple على بنية CFBinaryHeap ، والتي تنفذ كومة دنيا.

التطبيقات

إدارة النطاق الترددي

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

تتضمن العديد من البروتوكولات الحديثة للشبكات المحلية مفهوم قوائم الانتظار ذات الأولوية في طبقة التحكم في الوصول إلى الوسائط (MAC) لضمان حصول التطبيقات ذات الأولوية العالية (مثل VoIP أو IPTV ) على زمن استجابة أقل من التطبيقات الأخرى التي يمكن خدمتها بأفضل جهد ممكن . ومن الأمثلة على ذلك معيار IEEE 802.11e (وهو تعديل لمعيار IEEE 802.11 يوفر جودة الخدمة ) ومعيار ITU-T G.hn (وهو معيار للشبكات المحلية عالية السرعة التي تستخدم الأسلاك المنزلية الموجودة ( خطوط الكهرباء وخطوط الهاتف والكابلات المحورية )).

عادةً ما يتم ضبط حد (مُنظِّم) لتقييد عرض النطاق الترددي المسموح به لحركة البيانات من قائمة الانتظار ذات الأولوية القصوى، وذلك لمنع حزم البيانات ذات الأولوية العالية من إعاقة حركة البيانات الأخرى. ولا يتم الوصول إلى هذا الحد عادةً بفضل أنظمة التحكم المتقدمة مثل Cisco Callmanager ، التي يمكن برمجتها لمنع المكالمات التي تتجاوز حد عرض النطاق الترددي المُبرمج.

محاكاة الأحداث المنفصلة

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

انظر أيضًا : الجدولة (الحوسبة) ، نظرية الطوابير

خوارزمية ديكسترا

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

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

ترميز هوفمان

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

خوارزميات البحث الأفضل أولاً

تجد خوارزميات البحث الأفضل أولاً ، مثل خوارزمية البحث A* ، أقصر مسار بين رأسين أو عقدتين في رسم بياني مُثقَّل ، حيث تُجرِّب المسارات الواعدة أولاً. يُستخدم طابور ذو أولوية (يُعرف أيضًا باسم قائمة الانتظار ) لتتبع المسارات غير المستكشفة؛ ويُعطى المسار الذي يكون فيه تقدير طول المسار الإجمالي (الحد الأدنى في حالة A*) هو الأصغر، الأولوية القصوى. إذا جعلت قيود الذاكرة البحث الأفضل أولاً غير عملي، فيمكن استخدام متغيرات مثل خوارزمية SMA* بدلاً منها، مع طابور ذي أولوية مزدوج الطرف للسماح بإزالة العناصر ذات الأولوية المنخفضة.

خوارزمية التثليث ROAM

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

خوارزمية بريم للشجرة الممتدة الدنيا

باستخدام قائمة انتظار الأولوية ذات الكومة الدنيا في خوارزمية بريم لإيجاد الشجرة الممتدة الدنيا لرسم بياني متصل وغير موجه ، يمكن تحقيق زمن تشغيل جيد. تستخدم قائمة انتظار الأولوية هذه بنية بيانات الكومة الدنيا التي تدعم عمليات مثل insertو minimumو extract-minو decrease-key. [ 28 ] في هذا التطبيق، يُستخدم وزن الحواف لتحديد أولوية الرؤوس . كلما انخفض الوزن، زادت الأولوية، والعكس صحيح. [ 29 ]

قائمة انتظار ذات أولوية متوازية

يمكن استخدام التوازي لتسريع قوائم الانتظار ذات الأولوية، ولكنه يتطلب بعض التغييرات على واجهة قائمة الانتظار ذات الأولوية. والسبب في هذه التغييرات هو أن التحديث التسلسلي عادةً ما يكون لديه فقطيا(1){\textstyle O(1)}أويا(سجلن){\textstyle O(\log n)}التكلفة، ولا يوجد مكسب عملي من موازاة مثل هذه العملية. أحد التغييرات الممكنة هو السماح بالوصول المتزامن لمعالجات متعددة إلى نفس قائمة الانتظار ذات الأولوية. التغيير الثاني الممكن هو السماح بعمليات الدفعات التي تعمل علىك{\textstyle k}سيتم حذف العناصر، بدلاً من عنصر واحد فقط. على سبيل المثال، extractMinسيؤدي ذلك إلى إزالة العنصر الأول.ك{\textstyle k}العناصر ذات الأولوية القصوى.

الوصول المتوازي المتزامن

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

يتم إدخال العقدة 3 وتعيين مؤشر العقدة 2 إلى العقدة 3. بعد ذلك مباشرة، يتم حذف العقدة 2 وتعيين مؤشر العقدة 1 إلى العقدة 4. الآن لم تعد العقدة 3 قابلة للوصول.

يمكن تنفيذ الوصول المتزامن إلى قائمة انتظار ذات أولوية باستخدام نموذج PRAM للقراءة والكتابة المتزامنة (CRCW). في ما يلي، تُنفَّذ قائمة الانتظار ذات الأولوية كقائمة تخطي . [ 30 ] [ 31 ] بالإضافة إلى ذلك، تُستخدم آلية التزامن الذرية CAS لجعل قائمة التخطي خالية من الأقفال . تتكون عقد قائمة التخطي من مفتاح فريد، وأولوية، ومصفوفة من المؤشرات ، لكل مستوى، إلى العقد التالية، وعلامة delete. deleteتُشير العلامة إلى ما إذا كانت العقدة على وشك الحذف بواسطة عملية ما. يضمن هذا أن تتمكن العمليات الأخرى من الاستجابة للحذف بشكل مناسب.

  • insert(e)أولًا، يتم إنشاء عقدة جديدة بمفتاح وأولوية. بالإضافة إلى ذلك، تُحدد للعقدة عدد من المستويات، مما يُحدد حجم مصفوفة المؤشرات. ثم يُجرى بحث للعثور على الموضع الصحيح لإدراج العقدة الجديدة. يبدأ البحث من العقدة الأولى ومن أعلى مستوى. ثم يتم اجتياز قائمة التخطي نزولًا إلى أدنى مستوى حتى يتم العثور على الموضع الصحيح. أثناء البحث، تُحفظ آخر عقدة تم اجتيازها في كل مستوى كعقدة أصلية للعقدة الجديدة في ذلك المستوى. علاوة على ذلك، تُحفظ العقدة التي يُشير إليها مؤشر العقدة الأصلية في ذلك المستوى كعقدة لاحقة للعقدة الجديدة في ذلك المستوى. بعد ذلك، تُضبط مؤشرات العقدة الأصلية في كل مستوى من مستويات العقدة الجديدة لتشير إلى العقدة الجديدة. أخيرًا، تُضبط مؤشرات العقدة الجديدة في كل مستوى لتشير إلى العقد اللاحقة المناظرة.
  • extract-minأولاً، يتم اجتياز قائمة التخطي حتى الوصول إلى عقدة deleteلم يتم تعيين علامتها. deleteثم يتم تعيين هذه العلامة إلى "صحيح" لتلك العقدة. وأخيراً، يتم تحديث مؤشرات العقد الأبوية للعقدة المحذوفة.

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

عمليات العناصر K

في هذا السياق، يتم تعميم العمليات على قائمة انتظار ذات أولوية لتشمل مجموعة منك{\textstyle k}العناصر. على سبيل المثال، k_extract-minيحذفك{\textstyle k}أصغر عناصر قائمة الانتظار ذات الأولوية ويعيدها.

في بيئة الذاكرة المشتركة ، يمكن تنفيذ قائمة الانتظار ذات الأولوية المتوازية بسهولة باستخدام أشجار البحث الثنائية المتوازية وخوارزميات الأشجار القائمة على الربط . على وجه الخصوص، k_extract-minيتوافق ذلك مع تقسيم على شجرة البحث الثنائية التي تحتوي علىيا(سجلن){\textstyle O(\log n)}التكلفة وتنتج شجرة تحتوي علىك{\textstyle k}k_insertيمكن تطبيق أصغر العناصر من خلال دمج قائمة الانتظار الأصلية ذات الأولوية مع مجموعة عمليات الإدخال. إذا كانت المجموعة مرتبة بالفعل حسب المفتاح، k_insertفإنها تحتوي علىيا(كسجل(1+نك)){\textstyle O(k\log(1+{\frac {n}{k}}))}التكلفة. وإلا، فسنحتاج أولاً إلى فرز الدفعة، وبالتالي ستكون التكلفةيا(كسجل(1+نك)+كسجلك)=يا(كسجلن){\textstyle O(k\log(1+{\frac {n}{k}})+k\log k)=O(k\log n)}يمكن تطبيق عمليات أخرى على قائمة الانتظار ذات الأولوية بطريقة مماثلة. على سبيل المثال، k_decrease-keyيمكن القيام بذلك عن طريق تطبيق عملية حذف العناصر differenceأولاً union، ثم إعادة إدراجها باستخدام المفاتيح المُحدَّثة. جميع هذه العمليات متوازية للغاية، ويمكن الاطلاع على كفاءتها النظرية والعملية في الأبحاث ذات الصلة. [ 32 ] [ 33 ]

يتناول الجزء المتبقي من هذا القسم خوارزمية تعتمد على قائمة الانتظار في الذاكرة الموزعة. نفترض أن لكل معالج ذاكرته المحلية الخاصة وقائمة انتظار ذات أولوية محلية (متسلسلة). أما عناصر قائمة الانتظار ذات الأولوية العامة (المتوازية) فتُوزع على جميع المعالجات.

k_extract-minيتم تنفيذ العملية على قائمة انتظار ذات أولوية باستخدام ثلاثة معالجات. يتم إرجاع العناصر الخضراء وإزالتها من قائمة الانتظار ذات الأولوية.

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

تُستخدم هذه الخاصية عند k_extract-minالتنفيذ، باعتبارها الأصغرم{\textstyle m}تُزال عناصر كل طابور محلي وتُجمع في مجموعة نتائج. وتبقى عناصر مجموعة النتائج مرتبطة بمعالجها الأصلي. عدد العناصرم{\textstyle m}يعتمد ذلك على ما يتم إزالته من كل قائمة انتظار محليةك{\textstyle k}وعدد المعالجاتص{\textstyle p}[ 34 ] عن طريق الاختيار المتوازيك{\textstyle k}يتم تحديد أصغر عناصر مجموعة النتائج. باحتمالية عالية، تكون هذه هي العناصر العالمية.ك{\textstyle k}أصغر العناصر. وإلا،م{\textstyle m}تُزال العناصر مرة أخرى من كل قائمة انتظار محلية وتُضاف إلى مجموعة النتائج. ويستمر هذا حتى الوصول إلى المجموعة العالمية.ك{\textstyle k}أصغر العناصر موجودة في مجموعة النتائج. الآن هذهك{\textstyle k}يمكن إرجاع بعض العناصر. تُعاد جميع العناصر الأخرى من مجموعة النتائج إلى قوائم الانتظار المحلية الخاصة بها. k_extract-minمن المتوقع أن يكون وقت التشغيل هويا(كصسجل(ن)){\textstyle O({\frac {k}{p}}\log(n))}، أينك=Ω(صسجل(ص)){\textstyle k=\Omega (p\cdot \log(p))}ون{\textstyle n}[ 34 ] هو حجم قائمة الانتظار ذات الأولوية.

يمكن تحسين قائمة الانتظار ذات الأولوية بشكل أكبر عن طريق عدم إعادة العناصر المتبقية من مجموعة النتائج مباشرةً إلى قوائم الانتظار المحلية بعد k_extract-minإجراء عملية ما. هذا يوفر عناء نقل العناصر ذهابًا وإيابًا باستمرار بين مجموعة النتائج وقوائم الانتظار المحلية.

بإزالة عدة عناصر دفعة واحدة، يمكن تحقيق تسريع كبير. لكن لا تستطيع جميع الخوارزميات استخدام هذا النوع من قوائم الانتظار ذات الأولوية. على سبيل المثال، لا يمكن لخوارزمية ديكسترا العمل على عدة عقد في وقت واحد. تأخذ الخوارزمية العقدة ذات أقصر مسافة من قائمة الانتظار ذات الأولوية، وتحسب مسافات جديدة لجميع العقد المجاورة لها. إذا قمت بإزالةك{\textstyle k}يمكن للعقد، التي تعمل في عقدة واحدة، أن تغير المسافة إلى عقدة أخرى.ك{\textstyle k}العقد. لذا فإن استخدام عمليات العناصر k يُدمر خاصية تحديد التصنيفات في خوارزمية ديكسترا.

انظر أيضاً

مراجع

  1. 1 2 ميلر الابن، روبرت ج. (1960). "طوابير الأولوية" (ملف PDF) . حوليات الإحصاء الرياضي . 31. جامعة ستانفورد: 86-103 . doi : 10.1214/aoms/1177705990 .
  2. "PriorityQueue (Java SE 9 & JDK 9 )" . docs.oracle.com . تم الاطلاع عليه بتاريخ 13-03-2025 .
  3. ^ كورمين، توماس هـ . ليسرسون، تشارلز إي . ريفست، رونالد ل . شتاين، كليفورد (2022) [1990]. “الفصل 6.5: قوائم الانتظار ذات الأولوية”. مقدمة للخوارزميات ( الطبعة الرابعة). مطبعة معهد ماساتشوستس للتكنولوجيا وماكجرو هيل. ص 172 – 176. ISBN   0-262-04630-X.
  4. 1 2 3 4 5 رونغرين، روبرت؛ أياني، رسول (1997-04-01). "دراسة مقارنة لخوارزميات طوابير الأولوية المتوازية والمتسلسلة" . معاملات ACM في النمذجة والمحاكاة الحاسوبية. 7 ( 2): 157-209 . doi : 10.1145/249204.249205 . ISSN 1049-3301 . 
  5. 1 2 3 4 5 أياني، ر. (ديسمبر 1990). "خوارزمية LR: عمليات متزامنة على قوائم الانتظار ذات الأولوية". وقائع ندوة IEEE الثانية حول المعالجة المتوازية والموزعة 1990. ص 22-25 . doi : 10.1109/SPDP.1990.143500 . ISBN  0-8186-2087-0.
  6. كورمن، توماس هـليسرسون، تشارلز إيريفست، رونالد لشتاين، كليفورد (2001) [1990]. "الفصل 20: أكوام فيبوناتشي". مقدمة في الخوارزميات ( الطبعة الثانية). مطبعة معهد ماساتشوستس للتكنولوجيا وماكجرو هيل. الصفحات 476-497 . ISBN   0-262-03293-7.الطبعة الثالثة، صفحة 518.
  7. سكينا، ستيفن (2010). دليل تصميم الخوارزميات ( الطبعة الثانية). سبرينغر ساينس + بيزنس ميديا . ISBN  978-1-849-96720-4.
  8. ب. فان إمده بواس. الحفاظ على النظام في غابة في وقت أقل من لوغاريتمي. في وقائع الندوة السنوية السادسة عشرة حول أسس علوم الحاسوب ، الصفحات 75-84. جمعية مهندسي الكهرباء والإلكترونيات، 1975.
  9. مايكل ل. فريدمان ودان إي. ويلارد. تجاوز حدود نظرية المعلومات باستخدام أشجار الاندماج. مجلة علوم الحاسوب والنظم ، 48(3): 533-551، 1994
  10. 1 2 3 4 كورمين، توماس هـ . ليسرسون، تشارلز إي . ريفست، رونالد ل. (1990). مقدمة في الخوارزميات ( الطبعة الأولى). مطبعة معهد ماساتشوستس للتكنولوجيا وماكجرو هيل. رقم ISBN  0-262-03141-8.
  11. 1 2 3 سليتور، دانيال دومينيك ؛ تارجان، روبرت إندري (فبراير 1986). "الأكوام ذاتية التعديل" . مجلة SIAM للحوسبة . 15 (1): 52-69 . CiteSeerX 10.1.1.93.6678 . doi : 10.1137/0215004 . ISSN 0097-5397 .  
  12. 1 2 تارجان، روبرت (1983). "3.3. أكوام اليسار". هياكل البيانات وخوارزميات الشبكات . ص 38-42 . doi : 10.1137/1.9781611970265 . ISBN  978-0-89871-187-5.
  13. هايوارد، رايان؛ ماكديارميد، كولين (1991). "تحليل الحالة المتوسطة لبناء الكومة عن طريق الإدخال المتكرر" (ملف PDF) . مجلة الخوارزميات . 12 : 126-153 . CiteSeerX 10.1.1.353.7888 . doi : 10.1016/0196-6774(91)90027-v . مؤرشف من الأصل (ملف PDF) بتاريخ 2016-02-05 . تم الاطلاع عليه بتاريخ 2016-01-28 . 
  14. "الكومة ذات الحدين | موسوعة الرياضيات والعلوم الرائعة" . brilliant.org . تم الاطلاع عليه بتاريخ 30-09-2019 .
  15. 1 2 برودال، جيرث ستولتينغ؛ أوكاساكي، كريس (نوفمبر 1996)، "طوابير الأولوية الوظيفية البحتة المثلى"، مجلة البرمجة الوظيفية ، 6 (6): 839-857 ، doi : 10.1017/s095679680000201x
  16. أوكاساكي، كريس (1998). "10.2. التجريد الهيكلي". هياكل البيانات الوظيفية البحتة ( الطبعة الأولى). الصفحات 158-162 . ISBN   9780521631242.
  17. تاكاوكا، تاداو (1999)، نظرية الأكوام 2-3 (ملف PDF) ، ص 12 
  18. إياكونو، جون (2000)، "تحسين الحدود العليا لأكوام الاقتران"، وقائع ورشة العمل الإسكندنافية السابعة حول نظرية الخوارزميات (ملف PDF) ، سلسلة محاضرات في علوم الحاسوب، المجلد 1851، دار نشر سبرينغر، الصفحات 63-77 ، arXiv : 1110.4428 ، CiteSeerX 10.1.1.748.7812 ، doi : 10.1007/3-540-44985-X_5 ، ISBN    3-540-67690-2
  19. فريدمان، مايكل لورانس (يوليو 1999). "حول كفاءة أكوام الاقتران وهياكل البيانات ذات الصلة" (ملف PDF) . مجلة رابطة آلات الحوسبة . 46 (4): 473-501 . doi : 10.1145/320211.320214 .
  20. بيتي، سيث (2005). نحو تحليل نهائي لأكوام الاقتران (ملف PDF) . وقائع ندوة FOCS '05 السنوية السادسة والأربعين لمؤسسة IEEE حول أسس علوم الحاسوب. الصفحات 174-183 . CiteSeerX 10.1.1.549.471 . doi : 10.1109/SFCS.2005.75 . ISBN   0-7695-2468-0.
  21. ^ هيوبلر، بيرنهارد. سين، سيدهارتا؛ تارجان ، روبرت إي. (نوفمبر 2011). "أكوام الاقتران بالرتبة" (PDF) . سيام ج. الحوسبة . 40 (6): 1463–1485 . دوى : 10.1137/100785351 .
  22. فريدمان، مايكل لورانس ؛ تارجان، روبرت إي. (يوليو 1987). "أكوام فيبوناتشي واستخداماتها في خوارزميات تحسين الشبكات المحسّنة" (ملف PDF) . مجلة رابطة آلات الحوسبة . 34 (3): 596-615 . CiteSeerX 10.1.1.309.8927 . doi : 10.1145/28869.28874 . 
  23. برودال، جيرث ستولتينغ ؛ لاغوجيانيس، جورج؛ تارجان، روبرت إي. (2012). أكوام فيبوناتشي الصارمة (ملف PDF) . وقائع الندوة الرابعة والأربعين حول نظرية الحوسبة - STOC '12. الصفحات 1177-1184 . CiteSeerX 10.1.1.233.1740 . doi : 10.1145/2213977.2214082 . ISBN   978-1-4503-1245-5.
  24. برودال، جيرث س. ( 1996)، "طوابير الأولوية الفعالة في أسوأ الحالات" (ملف PDF) ، وقائع الندوة السنوية السابعة لجمعية ACM-SIAM حول الخوارزميات المنفصلة ، ​​الصفحات 52-58 
  25. غودريتش، مايكل تتاماسيا، روبرتو (2004). "7.3.6. بناء الكومة من الأسفل إلى الأعلى". هياكل البيانات والخوارزميات في جافا ( الطبعة الثالثة). ص 338-341 . ISBN   0-471-46983-1.
  26. ثورب، ميكيل (2007). "التكافؤ بين قوائم الانتظار ذات الأولوية والفرز". مجلة ACM . 54 (6): 28. doi : 10.1145/1314690.1314692 . S2CID 11494634 . 
  27. "نسخة مؤرشفة" (PDF) . مؤرشفة (PDF) من الأصل بتاريخ 20 يوليو 2011. تم الاطلاع عليها بتاريخ 10 فبراير 2011 .{{cite web}}: CS1 maint: archived copy as title ( link )
  28. ^ كورمين، توماس هـ . ليسرسون، تشارلز إي . ريفست، رونالد ل . شتاين، كليفورد (2009) [1990]. مقدمة للخوارزميات ( الطبعة الثالثة). مطبعة معهد ماساتشوستس للتكنولوجيا وماكجرو هيل. ص. 634. ردمك   0-262-03384-4."من أجل تطبيق خوارزمية بريم بكفاءة، نحتاج إلى طريقة سريعة لاختيار حافة جديدة لإضافتها إلى الشجرة التي تشكلها الحواف في A."
  29. "خوارزمية بريم" . موقع Geek for Geeks. ١٨ نوفمبر ٢٠١٢. مؤرشف من الأصل في ٩ سبتمبر ٢٠١٤. تم الاطلاع عليه في ١٢ سبتمبر ٢٠١٤ .
  30. 1 2 سونديل، هاكان؛ تسيغاس، فيليباس (2005). "قوائم انتظار ذات أولوية متزامنة سريعة وخالية من الأقفال لأنظمة متعددة الخيوط" . وقائع الندوة الدولية للمعالجة المتوازية والموزعة . المجلد 65. الصفحات 609-627 . CiteSeerX 10.1.1.67.1310 . doi : 10.1109/IPDPS.2003.1213189 . ISBN    0-7695-1926-1. S2CID 20995116 . 
  31. ليندين، جونسون (2013)، "قائمة انتظار ذات أولوية متزامنة قائمة على قائمة التخطي مع الحد الأدنى من التنازع على الذاكرة" ، التقرير الفني 2018-003 (باللغة الألمانية)
  32. بليلوش، جاي إي؛ فيريزوفيتش، دانيال؛ صن، ييهان (2016)، "Just Join for Parallel Ordered Sets"، ندوة حول الخوارزميات والهياكل المتوازية، وقائع الندوة الثامنة والعشرين لجمعية ACM حول الخوارزميات والهياكل المتوازية (SPAA 2016) ، ACM، الصفحات 253-264 ، arXiv : 1602.02120 ، doi : 10.1145/2935764.2935768 ، ISBN  978-1-4503-4210-0، S2CID 2897793 
  33. بليلوش، جاي إي؛ فيريزوفيتش، دانيال؛ صن، ييهان ( 2018)، "PAM: الخرائط المتوازية المعززة"، وقائع ندوة ACM SIGPLAN الثالثة والعشرين حول مبادئ وممارسات البرمجة المتوازية ، ACM، الصفحات 290-304 
  34. 1 2 ساندرز، بيتر؛ ميلهورن، كورت؛ ديتزفيلبينجر، مارتن؛ ديمينتييف، رومان (2019). الخوارزميات المتسلسلة والمتوازية وهياكل البيانات - مجموعة الأدوات الأساسية . دار نشر سبرينغر الدولية. الصفحات 226-229 . doi : 10.1007/978-3-030-25209-0 . ISBN  978-3-030-25208-3. S2CID 201692657 . 

للمزيد من القراءة