Funcțiile algoritmului Bisect în Python
The împărţi în două modulul din Python oferă funcții simple și rapide (pe bază de căutare binară) pentru a căuta un element într-o listă sortată, găsiți poziția corectă pentru a insera elemente noi și a insera elemente noi, asigurându-vă că lista rămâne sortată.
De ce avem nevoie de modulul Bisect?
- Util pentru operațiuni de căutare binară pentru a căuta într-o listă sortată și pentru a localiza punctele de inserare.
- Oferă metode eficiente de inserare a elementelor într-o listă sortată, menținând ordinea.
- Evita necesitatea sortarii manuale dupa fiecare inserare economisind timp si efort.
- Oferă funcții precum bisect() bisect_left() bisect_right() și insort() pentru codul optimizat curat.
- Ideal pentru sarcini precum menținerea datelor clasate în clasamente sau orice scenariu care implică inserarea/căutarea datelor sortate.
Funcțiile de bază ale modulului Bisect
Modulul bisect oferă în principal două tipuri de funcționalități:
- Găsirea punctului de inserare (fără inserare)
- Introducerea elementelor în poziția corectă
1. Găsirea punctelor de inserare
Aceste funcții returnează indexul în care ar trebui să fie inserat noul element pentru a menține lista sortată.
a) bisect.bisect(): Returnează punctul de inserare din dreapta pentru element. Dacă elementul există deja, punctul de inserare va fi după intrările existente.
bisect.bisect(list num beg=0 end=len(list))
Parametru:
- listă: Lista sortată.
- num: Element de inserat.
- implora: Începeți indexul pentru căutare (opțional).
- Sfârşit: Încheierea indexului pentru căutare (opțional).
b) bisect.bisect_left(): Returnează punctul de inserare din stânga pentru element. Dacă elementul există, punctul de inserare va fi înaintea intrărilor existente.
bisect.bisect_left(list num beg=0 end=len(lista))
c) bisect.bisect_right(): Identic cu bisect.bisect() returnează punctul de inserare din dreapta.
bisect.bisect_right(list num beg=0 end=len(lista))
Exemplu: Găsiți indici de inserție pentru valoarea 4 într-o listă sortată folosind diferite funcții bisect.
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
Ieșire
5 2 4
Explicaţie:
- bisect (li 4): Returnează 5 deoarece găsește poziția cea mai din dreapta după ultimele 4 din listă (index 4), deci punctul de inserare este 5.
- bisect_left(li 4): Returnează 2 deoarece găsește poziția cea mai din stânga înaintea primelor 4 din listă (index 2).
- bisect_right(li 4 0 4): Funcționează numai pe sublistă că[0:4] și returnează 4 deoarece inserează 4 după ultimele 4 din sublistă.
2. Inserarea elementelor
Aceste funcții introduc elementul în poziția corectă pentru a menține sortarea.
a) bisect.insort(): Inserează elementul în poziția cea mai din dreapta. Spre deosebire de funcțiile bisect(), aceasta modifică de fapt lista prin inserarea elementului.
bisect.insort(list num beg=0 end=len(lista))
Parametru:
- listă: Lista sortată.
- num: Element de inserat.
- cerși (opțional): Index de pornire pentru inserare (implicit 0).
- sfârșit (opțional): Index final pentru inserare (len (listă) implicită).
b) bisect.insort_left(): Inserează elementul în poziția cea mai din stânga.
bisect.insort_left(list num beg=0 end=len(lista))
c) bisect.insort_right(): Inserează elementul în poziția cea mai din dreapta (similar cu insort()).
bisect.insort_right(list num beg=0 end=len(lista))
Exemplu: Introduceți valoarea 5 într-o listă sortată, menținând-o sortată folosind diferite strategii de inserare.
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 )
Ieșire
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]
Explicaţie:
- apare(l1 5) introduce 5 în poziția cea mai potrivită din dreapta - după toate cele 4 și înainte de 6.
- sortare_stânga(l2 5) inserează 5 în poziția cea mai potrivită din stânga – la fel ca în sortare aici, deoarece 5 nu este în listă.
- insort_right(l3 5 0 4) inserează 5 la indexul 4 lucrând numai pe sublista l3[0:4] = [1 3 4 4] după ultimii ≤ 5 din acel interval fără a afecta restul listei.