Python'da Bisect Algoritma Fonksiyonları

ikiye bölmek Python'daki modül, sıralanmış bir listede bir öğeyi aramak için doğru konumu bulmak, yeni öğeler eklemek ve listenin sıralı kalmasını sağlamak için yeni öğeler eklemek için basit ve hızlı (ikili aramaya dayalı) işlevler sağlar.

Neden Bisect Modülüne ihtiyacımız var?

  1. Sıralanmış bir listede arama yapmak ve ekleme noktalarını bulmak için ikili arama işlemlerinde kullanışlıdır.
  2. Sırayı korurken sıralanmış bir listeye öğe eklemek için etkili yöntemler sağlar.
  3. Her eklemeden sonra manuel sıralama ihtiyacını ortadan kaldırarak zamandan ve emekten tasarruf sağlar.
  4. Temiz optimize edilmiş kod için bisect() bisect_left() bisect_right() ve insort() gibi işlevler sunar.
  5. Skor tablolarının sıralanmış verilerini korumak veya sıralanmış veri ekleme/arama içeren herhangi bir senaryo gibi görevler için idealdir.

Bisect Modülünün Temel İşlevleri

Bisect modülü temel olarak iki tür işlevsellik sunar:

  • Ekleme noktasını bulma (eklemeden)
  • Elemanları doğru konuma yerleştirme

1. Ekleme Noktalarını Bulma

Bu işlevler, listenin sıralı kalması için yeni öğenin eklenmesi gereken dizini döndürür.

a) bisect.bisect(): Öğe için en sağdaki ekleme noktasını döndürür. Öğe zaten mevcutsa, ekleme noktası mevcut girişlerden sonra olacaktır.

bisect.bisect(liste numarası beg=0 end=len(list))

Parametre:

  • liste: Sıralanmış liste.
  • numara: Eklenecek öğe.
  • yalvarıyorum: Arama için dizini başlatın (isteğe bağlı).
  • son: Arama için bitiş dizini (isteğe bağlı).

b) bisect.bisect_left(): Öğenin en soldaki ekleme noktasını döndürür. Öğe mevcutsa ekleme noktası mevcut girişlerden önce olacaktır.

bisect.bisect_left(liste numarası beg=0 end=len(list))

c) bisect.bisect_right(): bisect.bisect() ile aynı, en sağdaki ekleme noktasını döndürür.

bisect.bisect_right(liste numarası beg=0 end=len(list))

Örnek: Farklı ikiye bölme işlevlerini kullanarak sıralanmış bir listede 4 değeri için ekleme indekslerini bulun.

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   

Çıkış
5 2 4  

Açıklama:

  • ikiye böl(li 4): Listedeki son 4'ten (dizin 4) sonra en sağdaki konumu bulduğu için 5 değerini döndürür, dolayısıyla ekleme noktası 5 olur.
  • bisect_left(li 4): Listedeki ilk 4'ten önceki en soldaki konumu bulduğu için 2 değerini döndürür (dizin 2).
  • bisect_right(li 4 0 4): Yalnızca alt listede çalışır şu[0:4] ve alt listedeki son 4'ten sonra 4'ü eklediğinden 4 değerini döndürür.

2. Eleman Ekleme

Bu işlevler, sıralamayı korumak için öğeyi uygun konuma ekler.

a) bisect.insort(): Öğeyi en sağ konuma ekler. bisect() işlevlerinden farklı olarak bu aslında öğeyi ekleyerek listeyi değiştirir.

bisect.insort(liste numarası beg=0 end=len(list))

Parametre:

  • liste: Sıralanmış liste.
  • numara: Eklenecek öğe.
  • yalvarıyorum (isteğe bağlı): Ekleme için başlangıç ​​dizini (varsayılan 0).
  • son (isteğe bağlı): Ekleme için bitiş dizini (varsayılan uzunluk(liste)).

b) bisect.insort_left(): Öğeyi en sol konuma ekler.

bisect.insort_left(liste numarası beg=0 end=len(list))

c) bisect.insort_right(): Öğeyi en sağdaki konuma ekler (insort() işlevine benzer).

bisect.insort_right(liste numarası beg=0 end=len(list))

Örnek: Farklı ekleme stratejileri kullanarak sıralanmış halde tutarak 5 değerini sıralanmış bir listeye ekleyin.

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  )   

Çıkış
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]  

Açıklama:

  • ortaya çık(l1 5) 5'i en sağdaki uygun konuma ekler - 4'lerden sonra ve 6'dan önce.
  • insort_left(l2 ​​5) 5'i en soldaki uygun konuma ekler - listede 5 olmadığı için buradaki sıralamayla aynıdır.
  • insort_right(l3 5 0 4) listenin geri kalanını etkilemeden yalnızca l3[0:4] = [1 3 4 4] alt listesinde bu aralıktaki son ≤ 5'ten sonra çalışarak dizin 4'e 5 ekler.