Python implementa la búsqueda de dicotomías

Python implementa la búsqueda de dicotomías

La dicotomía es un método de búsqueda relativamente eficiente con una complejidad temporal de O (log2n).

Suponga que hay un número entre 1 y 100. Puede adivinar cuál es el número. Puede obtener tres respuestas cada vez que adivine: correcto, mayor o menor. ¿Cómo asegurarse de adivinar el correcto con el menor número de veces? Mucha gente piensa en adivinar 50 primero. Si la suposición es grande, la respuesta es menor que 50, y luego adivina 25 ... De esta manera, el rango de números se puede reducir a la mitad cada vez, para cualquier número entre 1 y 100., Solo se necesitan 7 veces como máximo para encontrar la respuesta.

Este método de reducir el rango de búsqueda a la mitad cada vez es la idea de búsqueda dicotómica. Este artículo usa Python para implementar la búsqueda dicotómica.

1. Implementación recursiva de la búsqueda de dicotomías de Python

Antes de implementar el código, analice los requisitos previos de la dicotomía:

1. El ejemplo anterior busca un número del 1 al 100, y cada vez que se juzga si es mayor o menor, hay una condición implícita aquí, es decir, del 1 al 100 están ordenados en orden ascendente. Para la dicotomía, la lista de datos debe estar ordenada, generalmente en orden ascendente o descendente.

2. Salte del rango de 1 a 100. Para cualquier conjunto de datos, puede usar la dicotomía para buscar un número determinado.

Ahora veamos el proceso específico de búsqueda de dicotomías. Por ejemplo, busque 77 en [50, 77, 55, 29, 10, 30, 66, 18, 80, 51].

1. Ordene la lista. Por lo general, los datos rara vez se ordenan. Para usar la dicotomía, la lista de datos debe ordenarse primero.

2. Toma la mitad de los datos. Para un conjunto de datos, la cantidad de datos puede ser par o impar, pero independientemente de si es par o impar, se divide por 2.

Entonces, primero encuentre el 50 en la posición media.

3. Determine el tamaño del número en la posición media y el número de destino, reduzca el rango de búsqueda y luego repita el paso 2.

4. Continúe repitiendo 2 y 3 hasta que se encuentren los datos del patrón.

Según el proceso de búsqueda, para implementar el código.

# coding=utf-8
class BinarySearch(object):
    def binary_search(self, array, data):
        """二分查找法递归实现"""
        if len(array) == 0:
            return False
        array.sort()
        mid_index = len(array) // 2
        if array[mid_index] == data:
            return True
        return self.binary_search(array[mid_index + 1:], data) if data > array[mid_index] else \
            self.binary_search(array[:mid_index], data)

binary_search (matriz, datos): busca datos en la matriz de la lista de datos. Para cada búsqueda recursiva, la longitud de la lista de datos se reducirá a la "mitad". Cuando se encuentran los datos de destino o la longitud de la lista de datos es 0, la recursividad termina.

if __name__ == '__main__':
    array = [50, 77, 55, 29, 10, 30, 66, 18, 80, 51]
    search = BinarySearch()
    print('搜索结果:', search.binary_search(array, 77))
    print('搜索结果:', search.binary_search(array, 777))

resultado de la operación:

搜索结果: True
搜索结果: False

Dos, implementación no recursiva de búsqueda de dicotomía de Python

La búsqueda binaria también se puede implementar de forma no recursiva, o buscar 77 en [50, 77, 55, 29, 10, 30, 66, 18, 80, 51] como ejemplo.

1. Ordene la lista.

2. Toma la mitad de los datos. Aquí la estrategia sigue siendo la misma y los datos en la posición intermedia todavía se toman. Sin embargo, debido a que es un método no recursivo, la dicotomía múltiple solo se puede lograr mediante un método circular. Si los datos de destino no se encuentran la primera vez, cuando el índice de la posición media se toma por segunda vez, el índice intermedio necesita se calculará en función del resultado del primer juicio. Por lo tanto, es necesario configurar dos cursores para registrar el índice inicial y el final del índice final de cada dicotomía. Si no se encuentran los datos de destino, el valor del índice inicial o final se modifica para calcular el índice intermedio en el siguiente ciclo. .

3. De acuerdo con el resultado del juicio del primer ciclo, modifique el valor del índice de inicio, vuelva a calcular el índice intermedio y tome los datos en la posición intermedia.

4. Repita el ciclo hasta que se encuentren los datos del patrón. Cuando el valor de inicio es igual al valor de final, el rango se ha reducido a un solo dato. Si el ciclo continúa y el inicio es mayor que final, significa que los datos de destino no se pueden encontrar y el ciclo finaliza.

Según este proceso, para implementar el código.

    def binary_search_normal(self, array, data):
        """二分查找法非递归实现"""
        array.sort()
        start, end = 0, len(array)-1
        while start <= end:
            mid_index = (start + end) // 2
            if array[mid_index] == data:
                return True
            if data > array[mid_index]:
                start = mid_index + 1
            else:
                end = mid_index - 1
        return False

binary_search_normal (matriz, datos): una implementación no recursiva de búsqueda de datos en la matriz de la lista de datos. En cada ciclo, el valor de inicio o fin se modifica de acuerdo con el resultado del juicio. En el siguiente ciclo, se calcula un nuevo min_index de acuerdo con los nuevos valores de inicio y fin, hasta que se encuentran los datos objetivo o una lista de datos completa (inicio > end) se encuentra y el ciclo finaliza.

    print('搜索结果:', search.binary_search_normal(array, 77))
    print('搜索结果:', search.binary_search_normal(array, 777))

resultado de la operación:

搜索结果: True
搜索结果: False

En tercer lugar, la relación entre la búsqueda binaria y el árbol de búsqueda binaria

Para la implementación del árbol de búsqueda binaria en Python, puede consultar: https://blog.csdn.net/weixin_43790276/article/details/105753543 .

Si los datos anteriores [50, 77, 55, 29, 10, 30, 66, 18, 80, 51] se agregan al árbol de búsqueda binaria, la estructura del árbol de búsqueda binaria resultante es la siguiente.

De acuerdo con las características del árbol de búsqueda binaria, al insertar datos en el árbol de búsqueda binaria, primero se juzga el tamaño de los datos insertados y los datos del nodo raíz. El pequeño se inserta en el subárbol izquierdo y el grande es insertado en el subárbol derecho. Por lo tanto, al buscar datos en un árbol de búsqueda binario, puede comparar el tamaño de los datos con el tamaño de los datos del nodo raíz y determinar de forma recursiva si buscar en el subárbol izquierdo o en el subárbol derecho. Cada recursividad reducirá el alcance al subárbol izquierdo o al subárbol derecho hasta que se encuentren los datos de destino. Este método de búsqueda es muy similar a la idea de búsqueda por dicotomía.

El árbol de búsqueda binaria puede entenderse como una estructura de datos realizada por la dicotomía, pero no es del todo cierto, porque el árbol de búsqueda binaria solo satisface la idea de dicotomía y es diferente de la dicotomía.

La dicotomía definitivamente puede reducir el rango de datos a la "mitad" cada vez, porque la longitud de los datos puede ser un número par o impar, y los dos conjuntos de datos después de la dicotomía son iguales o diferentes en 1. En un árbol de búsqueda binaria, el número de nodos en los subárboles izquierdo y derecho depende del orden de la suma, y ​​no necesariamente satisface el mismo número o una diferencia de uno como máximo.

Para cumplir con las características del árbol de búsqueda binaria, pero también para controlar la diferencia en el número de nodos entre los subárboles izquierdo y derecho, es necesario controlar el "equilibrio" del árbol de búsqueda binario. En la estructura de datos, el binario árbol implementado de acuerdo con esta idea Se llama Red Black Tree, y continuaré estudiándolo en el siguiente artículo.

 

 

Supongo que te gusta

Origin blog.csdn.net/weixin_43790276/article/details/104033516
Recomendado
Clasificación