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?
- Užitečné pro binární vyhledávací operace pro vyhledávání v seřazeném seznamu a pro nalezení bodů vložení.
- Poskytuje účinné metody pro vkládání prvků do seřazeného seznamu při zachování pořadí.
- Vyhnete se nutnosti ručního třídění po každém vložení, což šetří čas a námahu.
- Nabízí funkce jako bisect() bisect_left() bisect_right() a insort() pro čistý optimalizovaný kód.
- 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.