وظائف خوارزمية المنتصف في بايثون
ال شطر توفر الوحدة النمطية في Python وظائف بسيطة وسريعة (قائمة على البحث الثنائي) للبحث عن عنصر في قائمة مفروزة والعثور على الموضع الصحيح لإدراج عناصر جديدة وإدراج عناصر جديدة لضمان بقاء القائمة مرتبة.
لماذا نحتاج إلى وحدة Bisect؟
- مفيد لعمليات البحث الثنائية للبحث في قائمة مرتبة وتحديد نقاط الإدراج.
- يوفر طرقًا فعالة لإدراج العناصر في قائمة مرتبة مع الحفاظ على النظام.
- يتجنب الحاجة إلى الفرز اليدوي بعد كل عملية إدخال مما يوفر الوقت والجهد.
- يقدم وظائف مثل bisect() bisect_left() bisect_right() وinsort() للحصول على تعليمات برمجية نظيفة ومحسنة.
- مثالية لمهام مثل الحفاظ على البيانات المصنفة في لوحات المتصدرين أو أي سيناريو يتضمن إدراج/بحث البيانات المصنفة.
الوظائف الأساسية لوحدة المنتصف
توفر الوحدة المنصفة بشكل أساسي نوعين من الوظائف:
- العثور على نقطة الإدراج (بدون الإدراج)
- إدخال العناصر في الموضع الصحيح
1. العثور على نقاط الإدراج
تقوم هذه الوظائف بإرجاع الفهرس حيث يجب إدراج العنصر الجديد للحفاظ على ترتيب القائمة.
أ) منصف. منصف (): إرجاع نقطة الإدراج الموجودة في أقصى اليمين للعنصر. إذا كان العنصر موجودًا بالفعل، فستكون نقطة الإدراج بعد الإدخالات الموجودة.
bisect.bisect(list num beg=0 end=len(list))
المعلمة:
- قائمة: قائمة مرتبة.
- رقم: العنصر المراد إدراجه.
- توسل: ابدأ فهرس البحث (اختياري).
- نهاية: فهرس النهاية للبحث (اختياري).
ب) bisect.bisect_left(): إرجاع نقطة الإدراج الموجودة في أقصى اليسار للعنصر. إذا كان العنصر موجودًا، فستكون نقطة الإدراج قبل الإدخالات الموجودة.
bisect.bisect_left(list num beg=0 end=len(list))
ج) bisect.bisect_right(): مطابق للدالة bisect.bisect() التي تُرجع نقطة الإدراج الموجودة في أقصى اليمين.
bisect.bisect_right(list num beg=0 end=len(list))
مثال: ابحث عن فهارس الإدراج للقيمة 4 في قائمة مرتبة باستخدام دوال منقسمة مختلفة.
Python import bisect li = [ 1 3 4 4 4 6 7 ] print ( bisect . bisect ( li 4 )) # right print ( bisect . bisect_left ( li 4 )) # left print ( bisect . bisect_right ( li 4 0 4 )) # subright
الإخراج
5 2 4
توضيح:
- منصف (لي 4): إرجاع 5 لأنه يعثر على الموضع الموجود في أقصى اليمين بعد آخر 4 في القائمة (الفهرس 4) لذا فإن نقطة الإدراج هي 5.
- bisect_left(لي 4): تُرجع 2 لأنها تعثر على الموضع الموجود في أقصى اليسار قبل أول 4 في القائمة (الفهرس 2).
- bisect_right(لي 4 0 4): يعمل فقط على القائمة الفرعية ذلك[0:4] ويعيد 4 لأنه يُدرج 4 بعد آخر 4 في القائمة الفرعية.
2. إدراج العناصر
تقوم هذه الوظائف بإدراج العنصر في الموضع المناسب للحفاظ على الفرز.
أ) bisect.insort(): إدراج العنصر في الموضع الموجود في أقصى اليمين. على عكس الدالة bisect()، فإن هذا يعدل القائمة عن طريق إدراج العنصر.
bisect.insort(list num beg=0 end=len(list))
المعلمة:
- قائمة: قائمة مرتبة.
- رقم: العنصر المراد إدراجه.
- التسول (اختياري): بدء الفهرس للإدراج (الافتراضي 0).
- النهاية (اختياري): فهرس النهاية للإدراج (الافتراضي len(list)).
ب) bisect.insort_left(): إدراج العنصر في الموضع الموجود في أقصى اليسار.
bisect.insort_left(list num beg=0 end=len(list))
ج) bisect.insort_right(): إدراج العنصر في الموضع الموجود في أقصى اليمين (على غرار insort()).
bisect.insort_right(list num beg=0 end=len(list))
مثال: أدخل القيمة 5 في قائمة مرتبة مع إبقائها مرتبة باستخدام استراتيجيات الإدراج المختلفة.
Python import bisect l1 = [ 1 3 4 4 4 6 7 ] l2 = [ 1 3 4 4 4 6 7 ] l3 = [ 1 3 4 4 4 6 7 ] bisect . insort ( l1 5 ) # right print ( l1 ) bisect . insort_left ( l2 5 ) # left print ( l2 ) bisect . insort_right ( l3 5 0 4 ) # subright print ( l3 )
الإخراج
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]
توضيح:
- تنشأ (ل1 5) يُدرج الرقم 5 في الموضع المناسب على أقصى اليمين - بعد كل الأرقام 4 وقبل الرقم 6.
- insort_left(l2 5) يُدرج الرقم 5 في الموضع المناسب في أقصى اليسار - كما هو الحال في الإدخال هنا نظرًا لأن الرقم 5 ليس موجودًا في القائمة.
- insort_right(l3 5 0 4) إدراج 5 في الفهرس 4 يعمل فقط على القائمة الفرعية l3[0:4] = [1 3 4 4] بعد آخر ≥ 5 في هذا النطاق دون التأثير على بقية القائمة.