قائمة التخطي

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

وصف

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

تُبنى قائمة التخطي على طبقات. الطبقة السفلية1{\displaystyle 1}هي قائمة مرتبطة مرتبة عادية . كل طبقة أعلى تعمل كـ "مسار سريع" للقوائم الموجودة أسفلها، حيث يوجد عنصر في الطبقةأنا{\displaystyle i}يظهر في الطبقةأنا+1{\displaystyle i+1}باحتمالية ثابتةص{\displaystyle p}(قيمتان شائعتان الاستخدام لـص{\displaystyle p}نكون1/2{\displaystyle 1/2}أو1/4{\displaystyle 1/4}في المتوسط، يظهر كل عنصر في1/(1-ص){\displaystyle 1/(1-p)}القوائم، ويظهر العنصر الأطول (عادةً ما يكون عنصر رأس خاص في مقدمة قائمة التخطي) في جميع القوائم. تحتوي قائمة التخطي علىسجل1/صن{\displaystyle \log _{1/p}n\,}(أي أساس اللوغاريتم)1/ص{\displaystyle 1/p}لن{\displaystyle n}) قوائم.

يبدأ البحث عن عنصر مستهدف من العنصر الأول في القائمة العلوية، ويستمر أفقيًا حتى يصبح العنصر الحالي أكبر من أو يساوي العنصر المستهدف. إذا كان العنصر الحالي مساويًا للعنصر المستهدف، فقد تم العثور عليه. أما إذا كان العنصر الحالي أكبر من العنصر المستهدف، أو إذا وصل البحث إلى نهاية القائمة المتصلة، تُكرر العملية بعد العودة إلى العنصر السابق والنزول عموديًا إلى القائمة الأدنى التالية. يبلغ عدد الخطوات المتوقع في كل قائمة متصلة على الأكثر1/ص{\displaystyle 1/p}ويمكن ملاحظة ذلك من خلال تتبع مسار البحث عكسيًا من الهدف حتى الوصول إلى عنصر يظهر في القائمة الأعلى التالية أو الوصول إلى بداية القائمة الحالية. وبالتالي، فإن التكلفة الإجمالية المتوقعة للبحث هي1صسجل1/صن{\displaystyle {\tfrac {1}{p}}\log _{1/p}n}وهويا(سجلن){\displaystyle {\mathcal {O}}(\log n)\,}، متىص{\displaystyle p}هو ثابت. باختيار قيم مختلفة لـص{\displaystyle p}من الممكن استبدال تكاليف البحث بتكاليف التخزين. على سبيل المثال، القيمةص=1/هـ{\displaystyle p=1/e}يقلل من متوسط ​​وقت البحث في قوائم التخطي، بينما القيمةص=1/2{\displaystyle p=1/2}يبسط ذلك عملية تنفيذها.

تفاصيل التنفيذ

إدراج عناصر في قائمة التخطي

يمكن أن تحتوي العناصر المستخدمة في قائمة التخطي على أكثر من مؤشر واحد لأنها يمكن أن تشارك في أكثر من قائمة واحدة.

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

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

بدلاً من ذلك، يمكن جعل بنية المستوى شبه عشوائية بالطريقة التالية:

اجعل جميع العقد من المستوى 1 j ← 1 طالما أن عدد العقد في المستوى j أكبر من 1، لكل عقدة رقم i في المستوى j ، إذا كان i فرديًا ولم تكن i هي العقدة الأخيرة في المستوى j اختر عشوائيًا ما إذا كنت تريد ترقيته إلى المستوى j+1 أما إذا كان i زوجيًا ولم تتم ترقية العقدة i-1 قم بترقيته إلى المستوى j+1 نهاية الشرط، كرر j ← j + 1 يكرر

على غرار النسخة غير العشوائية، لا يتم إجراء التوزيع شبه العشوائي إلا عندما يكون هناك سبب آخر لتشغيلهايا(ن){\displaystyle {\mathcal {O}}(n)}العملية (التي تزور كل عقدة).

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

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

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

قائمة تخطي قابلة للفهرسة

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

لكل رابط، قم أيضًا بتخزين عرض الرابط. يُعرَّف العرض بأنه عدد روابط الطبقة السفلية التي يتم اجتيازها بواسطة كل رابط من روابط "المسار السريع" في الطبقة العليا.

على سبيل المثال، إليك عرض الروابط في المثال الموجود أعلى الصفحة:

 1 10 o---> o---------------------------------------------------------> o المستوى الأعلى 1 3 2 5 o---> o--------------> o--------> o-----------> o المستوى 3 1 2 1 2 3 2 o---> o---------> o---> o--------> o--------------> o--------> o المستوى 2 1 1 1 1 1 1 1 1 1 1 1 o---> o---> o---> o---> o---> o---> o---> o---> o---> o---> o المستوى السفلي الرأس 1 2 3 4 5 6 7 8 9 10 لا شيء عقدة عقدة عقدة عقدة عقدة عقدة عقدة عقدة

لاحظ أن عرض الرابط ذي المستوى الأعلى يساوي مجموع عروض الروابط المكونة له (أي أن الرابط ذو العرض 10 يمتد على الروابط ذات العروض 3 و2 و5 التي تقع أسفله مباشرة). وبالتالي، فإن مجموع جميع العروض متساوٍ في كل مستوى (10 + 1 = 1 + 3 + 2 + 5 = 1 + 2 + 1 + 2 + 3 + 2).

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

على سبيل المثال، للعثور على العقدة في الموضع الخامس (العقدة 5)، انتقل عبر رابط بعرض 1 في المستوى الأعلى. الآن، يلزم أربع خطوات أخرى، لكن العرض التالي في هذا المستوى هو 10، وهو كبير جدًا، لذا انزل مستوى واحدًا. انتقل عبر رابط بعرض 3. بما أن خطوة أخرى بعرض 2 ستكون بعيدة جدًا، انزل إلى المستوى الأدنى. الآن، انتقل عبر الرابط الأخير بعرض 1 للوصول إلى المجموع التراكمي المستهدف وهو 5 (1+3+1).

دالة lookupByPositionIndex(i) العقدة ← الرأس i ← i + 1 # لا تحسب الرأس كخطوة للمستوى من الأعلى إلى الأسفل do while i ≥ node.width[level] do # إذا لم تكن الخطوة التالية بعيدة جدًا i ← i - node.width[level] # اطرح العرض الحالي node ← node.next[level] # تقدم للأمام عند المستوى الحالي repeat repeat return node.value end function

تم تفصيل طريقة تنفيذ الفهرسة هذه في كتاب "A skip list cookbook" بقلم ويليام بو [ 7 ]

تاريخ

تم وصف قوائم التخطي لأول مرة في عام 1989 بواسطة ويليام بو . [ 8 ]

وكما قال المؤلف:

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

ويليام بو، الصيانة المتزامنة لقوائم التخطي (1989)

الاستخدامات

قائمة التطبيقات والأطر التي تستخدم قوائم التخطي:

تُستخدم قوائم التخطي أيضًا في التطبيقات الموزعة (حيث تمثل العقد أجهزة حاسوب فعلية، وتمثل المؤشرات اتصالات الشبكة) ولتنفيذ قوائم انتظار ذات أولوية متزامنة قابلة للتوسع بدرجة عالية مع تقليل التنازع على الأقفال، [ 17 ] أو حتى بدون أقفال ، [ 18 ] [ 19 ] [ 20 ] بالإضافة إلى القواميس المتزامنة الخالية من الأقفال . [ 21 ] كما توجد العديد من براءات الاختراع الأمريكية لاستخدام قوائم التخطي في تنفيذ قوائم انتظار ذات أولوية (بدون أقفال) وقواميس متزامنة. [ 22 ]

انظر أيضاً

مراجع

  1. 1 2 باباداكيس، توماس (1993). قوائم التخطي والتحليل الاحتمالي للخوارزميات (ملف PDF) (أطروحة دكتوراه). جامعة واترلو.
  2. بو، و. (1990). "قوائم التخطي: بديل احتمالي للأشجار المتوازنة" (ملف PDF) . مجلة اتصالات رابطة مكائن ​​الحوسبة . 33 (6): 668-676 . doi : 10.1145/78973.78977 . S2CID 207691558 . 
  3. مونرو، ج. إيان ؛ باباداكيس، توماس؛ سيدجويك، روبرت (1992). "قوائم التخطي الحتمية" (ملف PDF) . وقائع الندوة السنوية الثالثة لجمعية ACM-SIAM حول الخوارزميات المنفصلة (SODA '92) . أورلاندو، فلوريدا، الولايات المتحدة الأمريكية: جمعية الرياضيات الصناعية والتطبيقية، فيلادلفيا، بنسلفانيا، الولايات المتحدة الأمريكية. الصفحات 367-375 . S2CID 7477119 .  
  4. بيثيا، داريل؛ رايتر، مايكل ك. (21-23 سبتمبر 2009). هياكل البيانات ذات التوقيت غير المتوقع (ملف PDF) . ESORICS 2009، الندوة الأوروبية الرابعة عشرة حول أبحاث أمن الحاسوب. سان مالو، فرنسا. الصفحات 456-471، القسم 4 "قوائم التخطي". doi : 10.1007/978-3-642-04444-1_28 . ISBN 978-3-642-04443-4.
  5. سين، سانديب (1991). "بعض الملاحظات حول قوائم التخطي". رسائل معالجة المعلومات . 39 (4): 173-176 . doi : 10.1016/0020-0190(91)90175-H .
  6. شاه، غوري (2003). هياكل البيانات الموزعة لأنظمة الند للند (ملف PDF) (أطروحة دكتوراه). جامعة ييل.
  7. ويليام بو. "كتاب طبخ قوائم التخطي" . 1990. القسم 3.4 عمليات القوائم الخطية .
  8. بو، ويليام (أبريل 1989). الصيانة المتزامنة لقوائم التخطي (PS، PDF) (تقرير فني). قسم علوم الحاسوب، جامعة ميريلاند. CS-TR-2222.
  9. وثائق Apache Portable Runtime APR 1.6
  10. مقال LWN
  11. "LKML: Con Kolivas: [ إعلان ] مُجدول قوائم تخطي الطوابير المتعددة، الإصدار 0.120" . lkml.org . تم الاطلاع عليه بتاريخ 11-05-2017 .
  12. خادم Cyrus IMAP. ملف مصدر قائمة التخطي
  13. خريطة Q
  14. "تنفيذ مجموعة مرتبة باستخدام Redis" . GitHub .
  15. نواك، مات. "استخدام لغة رست لتوسيع نطاق استخدام لغة إليكسير لـ 11 مليون مستخدم متزامن" . مدونة ديسكورد . تم الاطلاع عليه بتاريخ 23 يوليو 2023 .
  16. "MemTable" . GitHub . تم الاسترجاع في 12-12-2023 .
  17. شافيت، ن.؛ لوتان، إ. (2000). "قوائم انتظار الأولوية المتزامنة القائمة على قوائم التخطي" (ملف PDF) . وقائع المؤتمر الدولي الرابع عشر للمعالجة المتوازية والموزعة. IPDPS 2000. ص 263. CiteSeerX 10.1.1.116.3489 . doi : 10.1109/IPDPS.2000.845994 . ISBN   978-0-7695-0574-9. S2CID 8664407 . 
  18. سونديل، هـ.؛ تسيغاس، ب. (2003). "طوابير أولوية متزامنة سريعة وخالية من الأقفال لأنظمة متعددة الخيوط". وقائع الندوة الدولية للمعالجة المتوازية والموزعة . ص 11. CiteSeerX 10.1.1.113.4552 . doi : 10.1109/IPDPS.2003.1213189 . ISBN   978-0-7695-1926-5. S2CID 20995116 . 
  19. فوميتشيف، ميخائيل؛ روبرت، إريك (2004). القوائم المرتبطة وقوائم التخطي الخالية من الأقفال (ملف PDF) . وقائع الندوة السنوية لجمعية الحوسبة الآلية حول مبادئ الحوسبة الموزعة (PODC). الصفحات 50-59 . doi : 10.1145/1011767.1011776 . ISBN  1581138024.
  20. باجباي، ر.؛ دارا، ك.ك.؛ كريشناسوامي، ف. (2008). "QPID: طابور أولوية موزع مع مراعاة موضع العنصر". ندوة IEEE الدولية لعام 2008 حول المعالجة المتوازية والموزعة مع التطبيقات . ص 215. doi : 10.1109/ISPA.2008.90 . ISBN  978-0-7695-3471-8. S2CID 15677922 . 
  21. سونديل، إتش كيه؛ تسيغاس، بي. (2004). "قواميس متزامنة قابلة للتوسع وخالية من الأقفال" (ملف PDF) . وقائع ندوة ACM لعام 2004 حول الحوسبة التطبيقية - SAC '04 . ص 1438. doi : 10.1145/967900.968188 . ISBN  978-1581138122. S2CID 10393486 . 
  22. ↑ براءة اختراع أمريكية رقم 7937378