Funkcie bisectového algoritmu v Pythone
The rozpoliť modul v Pythone poskytuje jednoduché a rýchle funkcie (založené na binárnom vyhľadávaní) na vyhľadávanie prvku v zoradenom zozname, nájdenie správnej pozície na vloženie nových prvkov a vloženie nových prvkov, čím sa zabezpečí, že zoznam zostane zoradený.
Prečo potrebujeme modul Bisect?
- Užitočné pre binárne operácie vyhľadávania na vyhľadávanie v zoradenom zozname a na nájdenie bodov vloženia.
- Poskytuje efektívne metódy na vkladanie prvkov do zoradeného zoznamu pri zachovaní poradia.
- Vyhýba sa potrebe manuálneho triedenia po každom vložení, čo šetrí čas a námahu.
- Ponúka funkcie ako bisect() bisect_left() bisect_right() a insort() pre čistý optimalizovaný kód.
- Ideálne pre úlohy, ako je udržiavanie údajov zoradených v rebríčkoch alebo akýkoľvek scenár zahŕňajúci vkladanie/vyhľadávanie triedených údajov.
Základné funkcie modulu Bisect
Modul bisect ponúka hlavne dva typy funkcií:
- Nájdenie bodu vloženia (bez vloženia)
- Vkladanie prvkov do správnej polohy
1. Nájdenie bodov vloženia
Tieto funkcie vrátia index, kam by mal byť vložený nový prvok, aby bol zoznam zoradený.
a) bisect.bisect(): Vráti bod vloženia úplne vpravo pre prvok. Ak prvok už existuje, kurzor bude za existujúcimi položkami.
bisect.bisect(list num beg=0 end=len(zoznam))
Parameter:
- zoznam: Zoradený zoznam.
- číslo: Prvok na vloženie.
- prosiť: Spustiť index pre vyhľadávanie (voliteľné).
- koniec: Koniec indexu pre vyhľadávanie (voliteľné).
b) bisect.bisect_left(): Vráti bod vloženia úplne vľavo pre prvok. Ak prvok existuje, kurzor bude pred existujúcimi položkami.
bisect.bisect_left(list num beg=0 end=len(zoznam))
c) bisect.bisect_right(): Rovnaké ako bisect.bisect() vráti bod vloženia úplne vpravo.
bisect.bisect_right(list num beg=0 end=len(zoznam))
Príklad: Nájdite indexy vloženia pre hodnotu 4 v zoradenom zozname pomocou rôznych funkcií rozdelenia.
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
Vysvetlenie:
- rozpoliť (li 4): Vráti 5, pretože nájde pozíciu úplne vpravo po poslednej 4 v zozname (index 4), takže bod vloženia je 5.
- bisect_left(li 4): Vráti 2, pretože nájde pozíciu úplne vľavo pred prvými 4 v zozname (index 2).
- bisect_right(li 4 0 4): Funguje iba na podzozname to[0:4] a vráti 4, pretože vloží 4 za posledné 4 v podzozname.
2. Vkladanie prvkov
Tieto funkcie vkladajú prvok na správnu pozíciu, aby sa zachovalo zoradenie.
a) bisect.insort(): Vloží prvok na miesto úplne vpravo. Na rozdiel od funkcií bisect() to v skutočnosti upravuje zoznam vložením prvku.
bisect.insort(list num beg=0 end=len(zoznam))
Parameter:
- zoznam: Zoradený zoznam.
- číslo: Prvok na vloženie.
- prosiť (voliteľné): Počiatočný index na vkladanie (predvolená hodnota 0).
- koniec (voliteľné): Koncový index pre vloženie (predvolená dĺžka (zoznam)).
b) bisect.insort_left(): Vloží prvok na pozíciu úplne vľavo.
bisect.insort_left(list num beg=0 end=len(zoznam))
c) bisect.insort_right(): Vloží prvok na pozíciu úplne vpravo (podobne ako insort()).
bisect.insort_right(list num beg=0 end=len(zoznam))
Príklad: Vložte hodnotu 5 do zoradeného zoznamu a ponechajte ho zoradený pomocou rôznych stratégií vkladania.
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]
Vysvetlenie:
- vzniknúť(l1 5) zasuňte 5 do pravej najvhodnejšej polohy – po všetkých 4 sekundách a pred 6.
- insort_left(l2 5) vloží 5 na najvhodnejšiu pozíciu vľavo – rovnako ako tu vložiť, pretože 5 nie je v zozname.
- insort_right(l3 5 0 4) vloží 5 do indexu 4 a pracuje len s podzoznamom l3[0:4] = [1 3 4 4] za posledným ≤ 5 v tomto rozsahu bez ovplyvnenia zvyšku zoznamu.