QuickSelect: شرح خوارزمية التحديد السريع مع أمثلة التعليمات البرمجية

ما هو QuickSelect؟

QuickSelect عبارة عن خوارزمية تحديد للعثور على أصغر عنصر K-th في قائمة لم يتم فرزها.

شرح الخوارزمية

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

إذا كان فهرس العنصر المقسم (المحور) أكبر من k ، فإن الخوارزمية تتكرر للجزء الأيسر. إذا كان الفهرس (pivot) هو نفسه k ، فقد وجدنا أصغر عنصر k ويتم إرجاعه. إذا كان الفهرس أقل من k ، فإن الخوارزمية تتكرر للجزء الأيمن.

التحديد Psudocode

Input : List, left is first position of list, right is last position of list and k is k-th smallest element. Output : A new list is partitioned. quickSelect(list, left, right, k) if left = right return list[left] // Select a pivotIndex between left and right pivotIndex := partition(list, left, right, pivotIndex) if k = pivotIndex return list[k] else if k < pivotIndex right := pivotIndex - 1 else left := pivotIndex + 1 

تقسيم

القسم هو العثور على المحور كما هو مذكور أعلاه. (كل عنصر على اليسار أقل من المحور وكل عنصر على اليمين أكثر من المحور) هناك خوارزميتان لإيجاد محور القسم.

  • قسم لوموتو
  • قسم هور

قسم لوموتو

يختار هذا القسم المحور الذي يكون عادةً العنصر الأخير في المصفوفة. تحتفظ الخوارزمية بالفهرس i أثناء قيامها بمسح المصفوفة باستخدام فهرس آخر j بحيث تكون العناصر من lo إلى i (شاملة) أقل من المحور أو مساوية له ، والعناصر i + 1 إلى j-1 (شاملة) أكبر من محور.

يتدهور هذا المخطط O(n^2)عندما تكون المصفوفة جاهزة بالفعل.

algorithm Lomuto(A, lo, hi) is pivot := A[hi] i := lo for j := lo to hi - 1 do if A[j] < pivot then if i != j then swap A[i] with A[j] i := i + 1 swap A[i] with A[hi] return i 

قسم هور

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

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

algorithm Hoare(A, lo, hi) is pivot := A[lo] i := lo - 1 j := hi + 1 loop forever do i := i + 1 while A[i]  pivot if i >= j then return j swap A[i] with A[j]