logo

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?

  1. 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.
  2. Poskytuje efektívne metódy na vkladanie prvkov do zoradeného zoznamu pri zachovaní poradia.
  3. Vyhýba sa potrebe manuálneho triedenia po každom vložení, čo šetrí čas a námahu.
  4. Ponúka funkcie ako bisect() bisect_left() bisect_right() a insort() pre čistý optimalizovaný kód.
  5. 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.

string.compareto c#

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.

ako dereferencovať ukazovateľ v c

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.