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?

  1. Útil para operaciones de búsqueda binaria para buscar en una lista ordenada y localizar puntos de inserción.
  2. Proporciona métodos eficientes para insertar elementos en una lista ordenada manteniendo el orden.
  3. Evita la necesidad de clasificación manual después de cada inserción ahorrando tiempo y esfuerzo.
  4. Ofrece funciones como bisect() bisect_left() bisect_right() e insort() para código limpio y optimizado.
  5. 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.