Funkce půlícího algoritmu v Pythonu

The půlit modul v Pythonu poskytuje jednoduché a rychlé funkce (založené na binárním vyhledávání) pro vyhledávání prvku v seřazeném seznamu, nalezení správné pozice pro vložení nových prvků a vložení nových prvků, což zajišťuje, že seznam zůstane seřazený.

Proč potřebujeme modul Bisect?

  1. Užitečné pro binární vyhledávací operace pro vyhledávání v seřazeném seznamu a pro nalezení bodů vložení.
  2. Poskytuje účinné metody pro vkládání prvků do seřazeného seznamu při zachování pořadí.
  3. Vyhnete se nutnosti ručního třídění po každém vložení, což šetří čas a námahu.
  4. Nabízí funkce jako bisect() bisect_left() bisect_right() a insort() pro čistý optimalizovaný kód.
  5. Ideální pro úkoly, jako je udržování dat seřazených ve výsledkových tabulkách nebo jakýkoli scénář zahrnující vkládání/vyhledávání seřazených dat.

Základní funkce modulu Bisect

Modul bisect nabízí především dva typy funkcí:

  • Nalezení bodu vložení (bez vložení)
  • Vkládání prvků do správné polohy

1. Hledání bodů vložení

Tyto funkce vrátí index, kam by měl být vložen nový prvek, aby byl seznam seřazený.

a) bisect.bisect(): Vrátí textový kurzor úplně vpravo pro prvek. Pokud prvek již existuje, textový kurzor bude za existujícími položkami.

bisect.bisect(list num beg=0 end=len(seznam))

Parametr:

  • seznam: Seřazený seznam.
  • číslo: Prvek k vložení.
  • žebrat: Spustit index pro vyhledávání (volitelné).
  • konec: Koncový index pro vyhledávání (volitelné).

b) bisect.bisect_left(): Vrátí textový kurzor zcela vlevo pro prvek. Pokud prvek existuje, textový kurzor bude před existujícími položkami.

bisect.bisect_left(list num beg=0 end=len(seznam))

c) bisect.bisect_right(): Totožné s funkcí bisect.bisect() vrací textový kurzor úplně vpravo.

bisect.bisect_right(list num beg=0 end=len(seznam))

Příklad: Najděte indexy vložení pro hodnotu 4 v seřazeném seznamu pomocí různých funkcí půlení.

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   

Výstup
5 2 4  

Vysvětlení:

  • půlit (li 4): Vrátí 5, protože najde pozici úplně vpravo za poslední 4 v seznamu (index 4), takže textový kurzor je 5.
  • bisect_left(li 4): Vrátí 2, protože najde pozici zcela vlevo před první 4 v seznamu (index 2).
  • bisect_right(li 4 0 4): Funguje pouze na podseznamu to [0:4] a vrátí 4, protože vloží 4 za poslední 4 v podseznamu.

2. Vkládání prvků

Tyto funkce vloží prvek na správnou pozici, aby bylo zachováno řazení.

a) bisect.insort(): Vloží prvek na místo úplně vpravo. Na rozdíl od funkcí bisect() to ve skutečnosti upravuje seznam vložením prvku.

bisect.insort(list num beg=0 end=len(seznam))

Parametr:

  • seznam: Seřazený seznam.
  • číslo: Prvek k vložení.
  • prosit (volitelné): Počáteční index pro vložení (výchozí 0).
  • konec (volitelné): Koncový index pro vložení (výchozí len(seznam)).

b) bisect.insort_left(): Vloží prvek na pozici zcela vlevo.

bisect.insort_left(list num beg=0 end=len(seznam))

c) bisect.insort_right(): Vloží prvek na pozici úplně vpravo (podobně jako insort()).

bisect.insort_right(list num beg=0 end=len(seznam))

Příklad: Vložte hodnotu 5 do seřazeného seznamu a ponechte jej seřazený pomocí různých strategií vkládání.

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  )   

Výstup
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]  

Vysvětlení:

  • vzniknout (l1 5) zasuňte 5 do správné nejvhodnější polohy – po všech 4s a před 6.
  • insort_left(l2 ​​5) vloží 5 na nejvhodnější pozici vlevo – stejně jako zde insort, protože 5 není v seznamu.
  • insort_right(l3 5 0 4) vloží 5 na index 4 a pracuje pouze s podseznamem l3[0:4] = [1 3 4 4] za poslední ≤ 5 v tomto rozsahu, aniž by to ovlivnilo zbytek seznamu.