Funzioni dell'algoritmo di bisezione in Python
IL bisecare Il modulo in Python fornisce funzioni semplici e veloci (basate sulla ricerca binaria) per cercare un elemento in un elenco ordinato, trovare la posizione corretta per inserire nuovi elementi e inserire nuovi elementi garantendo che l'elenco rimanga ordinato.
Perché abbiamo bisogno del modulo Bisect?
- Utile per operazioni di ricerca binaria per cercare in un elenco ordinato e per individuare punti di inserimento.
- Fornisce metodi efficienti per inserire elementi in un elenco ordinato mantenendo l'ordine.
- Evita la necessità di smistamento manuale dopo ogni inserimento risparmiando tempo e fatica.
- Offre funzioni come bisect() bisect_left() bisect_right() e insort() per un codice pulito e ottimizzato.
- Ideale per attività come il mantenimento dei dati classificati nelle classifiche o qualsiasi scenario che coinvolga l'inserimento/ricerca di dati ordinati.
Funzioni principali del modulo Bisect
Il modulo bisect offre principalmente due tipi di funzionalità:
- Trovare il punto di inserimento (senza inserimento)
- Inserimento degli elementi nella posizione corretta
1. Trovare i punti di inserimento
Queste funzioni restituiscono l'indice in cui inserire il nuovo elemento per mantenere ordinato l'elenco.
a) bisect.bisect(): Restituisce il punto di inserimento più a destra per l'elemento. Se l'elemento esiste già il punto di inserimento sarà dopo le voci esistenti.
bisect.bisect(num elenco beg=0 end=len(elenco))
Parametro:
- lista: Elenco ordinato.
- numero: Elemento da inserire.
- elemosinare: Indice iniziale per la ricerca (facoltativo).
- FINE: Indice finale per la ricerca (facoltativo).
b) bisect.bisect_left(): Restituisce il punto di inserimento più a sinistra per l'elemento. Se l'elemento esiste, il punto di inserimento sarà prima delle voci esistenti.
bisect.bisect_left(num elenco beg=0 end=len(elenco))
c) bisect.bisect_right(): Identico a bisect.bisect() restituisce il punto di inserimento più a destra.
bisect.bisect_right(num elenco beg=0 end=len(elenco))
Esempio: Trova gli indici di inserimento per il valore 4 in un elenco ordinato utilizzando diverse funzioni di bisezione.
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
Produzione
5 2 4
Spiegazione:
- bisecare(li 4): Restituisce 5 perché trova la posizione più a destra dopo gli ultimi 4 nell'elenco (indice 4), quindi il punto di inserimento è 5.
- bisect_left(li 4): Restituisce 2 perché trova la posizione più a sinistra prima dei primi 4 nell'elenco (indice 2).
- bisect_right(li 4 0 4): Funziona solo sulla sottolista quello[0:4] e restituisce 4 perché inserisce 4 dopo gli ultimi 4 nella sottolista.
2. Inserimento di elementi
Queste funzioni inseriscono l'elemento nella posizione corretta per mantenere l'ordinamento.
a) bisect.insort(): Inserisce l'elemento nella posizione più a destra. A differenza delle funzioni bisect(), questa modifica effettivamente l'elenco inserendo l'elemento.
bisect.insort(num elenco beg=0 end=len(elenco))
Parametro:
- lista: Elenco ordinato.
- numero: Elemento da inserire.
- supplicare (facoltativo): Indice iniziale per l'inserimento (default 0).
- fine (facoltativo): Indice finale per l'inserimento (len(list) predefinito).
b) bisect.insort_left(): Inserisce l'elemento nella posizione più a sinistra.
bisect.insort_left(num elenco beg=0 end=len(elenco))
c) bisect.insort_right(): Inserisce l'elemento nella posizione più a destra (simile a insort()).
bisect.insort_right(num elenco beg=0 end=len(elenco))
Esempio: Inserisci il valore 5 in un elenco ordinato mantenendolo ordinato utilizzando diverse strategie di inserimento.
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 )
Produzione
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]
Spiegazione:
- insort(l1 5) inserisce 5 nella posizione adatta più a destra – dopo tutti i 4 e prima del 6.
- insort_left(l2 5) inserisce 5 nella posizione adatta più a sinistra – come insort qui poiché 5 non è nell'elenco.
- insort_right(l3 5 0 4) inserisce 5 nell'indice 4 lavorando solo sulla sottolista l3[0:4] = [1 3 4 4] dopo l'ultimo ≤ 5 in quell'intervallo senza influenzare il resto della lista.