Funkcije algoritma za raspolavljanje u Pythonu
The prepoloviti modul u Pythonu pruža jednostavne i brze (temeljene na binarnom pretraživanju) funkcije za pretraživanje elementa na sortiranom popisu pronalaženje točne pozicije za umetanje novih elemenata i umetanje novih elemenata osiguravajući da popis ostane sortiran.
Zašto nam je potreban modul Bisect?
- Korisno za operacije binarnog pretraživanja za pretraživanje u sortiranom popisu i za lociranje točaka umetanja.
- Pruža učinkovite metode za umetanje elemenata u sortirani popis uz održavanje reda.
- Izbjegava potrebu za ručnim sortiranjem nakon svakog umetanja štedeći vrijeme i trud.
- Nudi funkcije kao što su bisect() bisect_left() bisect_right() i insort() za čisti optimizirani kod.
- Idealno za zadatke kao što je održavanje rangiranih podataka na pločama s najboljim rezultatima ili bilo koji scenarij koji uključuje sortirano umetanje/pretragu podataka.
Osnovne funkcije modula Bisect
Bisect modul uglavnom nudi dvije vrste funkcionalnosti:
- Pronalaženje točke umetanja (bez umetanja)
- Umetanje elemenata na ispravan položaj
1. Pronalaženje točaka umetanja
Ove funkcije vraćaju indeks gdje novi element treba biti umetnut kako bi popis bio sortiran.
a) raspoloviti.popoloviti(): Vraća krajnju desnu točku umetanja za element. Ako element već postoji, točka umetanja bit će iza postojećih unosa.
bisect.bisect(list num beg=0 end=len(list))
Parametar:
- popis: Poredani popis.
- broj: Element za umetanje.
- moliti: Početni indeks za pretraživanje (nije obavezno).
- kraj: Završni indeks za pretraživanje (nije obavezno).
b) bisect.bisect_left(): Vraća krajnju lijevu točku umetanja za element. Ako element postoji, točka umetanja bit će ispred postojećih unosa.
bisect.bisect_left(list num beg=0 end=len(list))
c) bisect.bisect_right(): Identično bisect.bisect() vraća krajnju desnu točku umetanja.
bisect.bisect_right(list num beg=0 end=len(list))
Primjer: Pronađite indekse umetanja za vrijednost 4 u sortiranom popisu koristeći različite funkcije bisekte.
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
Izlaz
5 2 4
Obrazloženje:
- raspoloviti (li 4): Vraća 5 jer pronalazi krajnju desnu poziciju nakon zadnja 4 na popisu (indeks 4), tako da je točka umetanja 5.
- prepoloviti_lijevo(li 4): Vraća 2 jer pronalazi krajnju lijevu poziciju prije prva 4 na popisu (indeks 2).
- prepoloviti_desno(li 4 0 4): Radi samo na podlisti to[0:4] i vraća 4 jer umeće 4 nakon zadnja 4 u podpopisu.
2. Umetanje elemenata
Ove funkcije umeću element na odgovarajuću poziciju kako bi se održalo sortiranje.
a) bisect.insort(): Umeće element na krajnju desnu poziciju. Za razliku od funkcija bisect(), ovo zapravo mijenja popis umetanjem elementa.
bisect.insort(list num beg=0 end=len(list))
Parametar:
- popis: Poredani popis.
- broj: Element za umetanje.
- moliti (neobavezno): Početni indeks za umetanje (zadano 0).
- kraj (opcionalno): Završni indeks za umetanje (zadani len(list)).
b) bisect.insort_left(): Umeće element na krajnju lijevu poziciju.
bisect.insort_left(list num beg=0 end=len(list))
c) bisect.insort_right(): Umeće element na krajnju desnu poziciju (slično insort()).
bisect.insort_right(list num beg=0 end=len(list))
Primjer: Umetnite vrijednost 5 u sortirani popis i zadržite je sortiranom pomoću različitih strategija umetanja.
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 )
Izlaz
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]
Obrazloženje:
- nastati (l1 5) umeće 5 na najprikladniju desnu poziciju – nakon svih 4 i prije 6.
- umetni_lijevo(l2 5) umeće 5 na krajnje lijevo prikladno mjesto – isto kao i insort ovdje jer 5 nije na popisu.
- umetni_desno(l3 5 0 4) umeće 5 u indeks 4 radeći samo na podlisti l3[0:4] = [1 3 4 4] nakon posljednjeg ≤ 5 u tom rasponu bez utjecaja na ostatak liste.