Funciones del algoritmo de bisección en Python
El bisecar El módulo en Python proporciona funciones simples y rápidas (basadas en búsqueda binaria) para buscar un elemento en una lista ordenada, encontrar la posición correcta para insertar nuevos elementos e insertar nuevos elementos asegurando que la lista permanezca ordenada.
¿Por qué necesitamos el módulo Bisect?
- Útil para operaciones de búsqueda binaria para buscar en una lista ordenada y localizar puntos de inserción.
- Proporciona métodos eficientes para insertar elementos en una lista ordenada manteniendo el orden.
- Evita la necesidad de clasificación manual después de cada inserción ahorrando tiempo y esfuerzo.
- Ofrece funciones como bisect() bisect_left() bisect_right() e insort() para código limpio y optimizado.
- Ideal para tareas como mantener datos clasificados en tablas de clasificación o cualquier escenario que implique inserción/búsqueda de datos ordenados.
Funciones principales del módulo Bisect
El módulo bisect ofrece principalmente dos tipos de funcionalidades:
- Encontrar el punto de inserción (sin inserción)
- Insertar elementos en la posición correcta
1. Encontrar puntos de inserción
Estas funciones devuelven el índice donde se debe insertar el nuevo elemento para mantener la lista ordenada.
a) bisect.bisect(): Devuelve el punto de inserción más a la derecha del elemento. Si el elemento ya existe, el punto de inserción estará después de las entradas existentes.
bisect.bisect(lista número inicio=0 final=len(lista))
Parámetro:
- lista: Lista ordenada.
- número: Elemento a insertar.
- mendigar: Índice de inicio para la búsqueda (opcional).
- fin: Índice final para la búsqueda (opcional).
b) bisect.bisect_left(): Devuelve el punto de inserción más a la izquierda del elemento. Si el elemento existe, el punto de inserción estará antes de las entradas existentes.
bisect.bisect_left(lista número inicio=0 final=len(lista))
c) bisect.bisect_right(): Idéntico a bisect.bisect() devuelve el punto de inserción más a la derecha.
bisect.bisect_right(lista número inicio=0 final=len(lista))
Ejemplo: Encuentre índices de inserción para el valor 4 en una lista ordenada usando diferentes funciones de bisección.
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
Producción
5 2 4
Explicación:
- bisectar(li 4): Devuelve 5 porque encuentra la posición más a la derecha después de los últimos 4 en la lista (índice 4), por lo que el punto de inserción es 5.
- bisect_left(li 4): Devuelve 2 porque encuentra la posición más a la izquierda antes de los primeros 4 en la lista (índice 2).
- bisect_right(li 4 0 4): Funciona solo en sublista eso[0:4] y devuelve 4 porque inserta 4 después de los últimos 4 en la sublista.
2. Insertar elementos
Estas funciones insertan el elemento en la posición adecuada para mantener la clasificación.
a) bisect.insort(): Inserta el elemento en la posición más a la derecha. A diferencia de las funciones bisect(), esto en realidad modifica la lista insertando el elemento.
bisect.insort(lista número inicio=0 final=len(lista))
Parámetro:
- lista: Lista ordenada.
- número: Elemento a insertar.
- suplicar (opcional): Índice de inicio para la inserción (predeterminado 0).
- final (opcional): Índice final para inserción (len (lista) predeterminada).
b) bisect.insort_left(): Inserta el elemento en la posición más a la izquierda.
bisect.insort_left(lista número inicio=0 final=len(lista))
c) bisect.insort_right(): Inserta el elemento en la posición más a la derecha (similar a insort()).
bisect.insort_right(lista número inicio=0 final=len(lista))
Ejemplo: Inserte el valor 5 en una lista ordenada mientras la mantiene ordenada usando diferentes estrategias de inserción.
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 )
Producción
[1 3 4 4 4 5 6 7] [1 3 4 4 4 5 6 7] [1 3 4 4 5 4 6 7]
Explicación:
- surgir(l1 5) inserta 5 en la posición adecuada más a la derecha, después de todos los 4 y antes del 6.
- insort_left(l2 5) inserta 5 en la posición adecuada más a la izquierda, lo mismo que ordenar aquí ya que 5 no está en la lista.
- insort_right(l3 5 0 4) inserta 5 en el índice 4 trabajando solo en la sublista l3[0:4] = [1 3 4 4] después del último ≤ 5 en ese rango sin afectar el resto de la lista.