Algoritmo de Little Luo - Algoritmo de bisección


¿Qué pueden hacer dos puntos?

二分是一种常用的算法技巧,用于在有序数组或有序序列中查找某个元素的位置。

La idea básica del algoritmo binario es reducir continuamente el intervalo de búsqueda hasta que se encuentra el elemento de destino o se determina que el elemento de destino no existe. El método de implementación específico consiste en determinar primero los límites izquierdo y derecho del intervalo de búsqueda y luego calcular el valor del elemento en la posición media. Si el valor es igual al valor objetivo, se encuentra el elemento objetivo; si el valor es mayor que el valor objetivo, significa que el elemento objetivo debe buscarse en la mitad izquierda. De lo contrario, busque en la mitad derecha. Siga reduciendo el intervalo de búsqueda hasta que se encuentre el elemento de destino o se determine que el elemento de destino no existe.

于是我们引入红蓝二分的思想来更好的引入二分

1. Dicotomía del aprendizaje

La complejidad temporal del algoritmo binario es O(log n), donde n es el tamaño de la matriz o secuencia, que tiene mejor eficiencia temporal que la complejidad temporal O(n) de la enumeración violenta

Condiciones y dificultades de uso

Aunque el algoritmo binario parece simple, en realidad tiene algunas condiciones y dificultades de uso:

  1. Lo más doloroso es la condición de contorno :
    al implementar el algoritmo binario, la condición de contorno es muy crítica. Las condiciones de contorno incluyen los puntos inicial y final del intervalo de búsqueda y cómo se calculan los elementos intermedios. Si las condiciones de contorno son incorrectas, puede dar lugar a errores en el algoritmo o entrar en un bucle infinito.

  2. La matriz debe estar ordenada :
    dado que la idea central del algoritmo binario es reducir gradualmente el intervalo de búsqueda, es necesario asegurarse de que la matriz esté ordenada. Si la matriz no está ordenada, primero debe ordenarse, lo que aumentará la complejidad del algoritmo.

  3. Lo más importante es poder ver que puede usar bifen (diseño de transición de estado):
    como: programación dinámica + bifen leetcode.300 , la gente común realmente no sabe cómo usar bifen .

introducción al tema

Dicotomía roja y azul
Comencemos con una dicotomía simple
Ahora quiero encontrar el número en una matriz:

list_num = [ i for i in range(0,100,2)]

# 找22在这个数组的哪里,或者22有没有在这个数组里面
left = -1
right = len(list_num)
while left+1!=right:
	mid = (left+right)//2
	if list_num[mid]<=22:
		left = mid
	else:
		right = mid
return left

Esto está escrito por una clásica dicotomía rojo-azul.Vea su condición izquierda+1!=derecha, por lo que no tendremos la intersección de izquierda y derecha.
Pero nuestra respuesta ya ha sido puesta en izquierda y derecha.

Expliquemos en detalle qué es la dicotomía roja y azul
. izquierda, derecha es el límite de la dicotomía roja y azul. Como su nombre indica, uno es el límite derecho y el otro es el límite izquierdo. Los bordes no se cruzarán, sino que solo serán adyacentes si se cumple la condición izquierda+1==derecha. Es decir, cuando el bucle While sale

Luego está la izquierda inicial, ¿cuál es el valor inicial de la derecha: izquierda
: -1
derecha: len (lista)
De esta manera, no tenemos que pensar en el problema de los límites, porque o bien el área de la lista está completamente ocupado por la izquierda, o está ocupado por la derecha.
E inteligentemente pasamos por alto el problema de los límites de los dos puntos usando el método de diseño azuly
de puntos Muchos algoritmos no están escritos por usted, ¡pero puede ver que se pueden usar!
inserte la descripción de la imagen aquí

2. La función binaria integrada de Python

Esta biblioteca es realmente fácil de usar, está integrada y funciona bien en competencias algorítmicas.

Las funciones binarias en Python se pueden implementar usando la biblioteca estándar bisect. El módulo bisect proporciona dos funciones: bisect_left() y bisect_right(). Estas funciones utilizan el algoritmo de búsqueda binaria para encontrar la posición de un elemento específico en una secuencia ordenada.

La diferencia entre estas dos funciones es que cuando hay varios elementos idénticos, la función bisect_left() devuelve la posición de la primera aparición, mientras que bisect_right() devuelve la posición de la última aparición.

import bisect

lst = [1, 3, 4, 4, 4, 6, 8, 9]
x = 4

Usa bisect_left() para encontrar la posición de x

idx_left = bisect.bisect_left(lst, x)
print("bisect_left(): ", idx_left)

Usa bisect_right() para encontrar la posición de x

idx_right = bisect.bisect_right(lst, x)
print("bisect_right(): ", idx_right)
输出:
bisect_left():  2
bisect_right():  5
在上面的示例中,列表lst中有多个值为4的元素。
bisect_left()函数返回第一个出现的位置2,
而bisect_right()函数返回最后一个出现的位置5

Supongo que te gusta

Origin blog.csdn.net/L2489754250/article/details/129491645
Recomendado
Clasificación