1.5 Buscar

1.5 Buscar

Encontrar es una operación importante, también conocida como recuperación. El objeto a buscar puede ser una tabla lineal, una estructura de árbol o incluso una estructura de archivos.

Los principales métodos de búsqueda son la búsqueda secuencial, la búsqueda a medias y la búsqueda basada en la estructura de árbol, es decir, el método hash.

1.5.1 El concepto básico de búsqueda

Una clave es el valor de un elemento de datos en un elemento de datos que identifica un elemento de datos. Una palabra clave que puede representar de forma única un elemento de datos se denomina palabra clave, y una palabra clave utilizada para identificar varios elementos de datos se denomina palabra clave secundaria. En otras palabras, para cualquier valor de valor, puede haber como máximo un registro en la tabla de búsqueda cuya clave principal sea valor, pero el registro cuya clave secundaria sea valor puede tener varios registros.

De acuerdo con una clave de valor dada, el proceso de encontrar el registro de la palabra clave Ki=clave en la tabla de búsqueda se denomina búsqueda, también llamada recuperación. Si existe tal registro en la tabla de búsqueda, se dice que la búsqueda fue exitosa; de lo contrario, se dice que la búsqueda falló, es decir, no hay ningún registro cuya palabra clave sea clave en la tabla de búsqueda. La clave se denomina objetivo de búsqueda.

Durante el proceso de búsqueda, el número de comparaciones de palabras clave se denomina longitud de búsqueda. La eficiencia del algoritmo de búsqueda se mide usando la longitud de búsqueda promedio (ASL) cuando la búsqueda tiene éxito y la longitud de búsqueda cuando la búsqueda no tiene éxito.

1.5.2 Método de búsqueda secuencial

Si las palabras clave en la tabla de búsqueda están desordenadas, se puede usar el método de búsqueda secuencial.

La estrategia de la búsqueda secuencial es muy simple: comienza desde K0, compara el objetivo de búsqueda con la palabra clave a su vez, si son iguales, la búsqueda es exitosa; de lo contrario, continúa comparando la siguiente palabra clave. Cuando todas las palabras clave de la tabla de búsqueda se comparan con el objetivo de búsqueda y no son iguales, la búsqueda falla y el proceso de búsqueda finaliza.

En una tabla de búsqueda con n elementos, la longitud de la búsqueda cuando la búsqueda no se realiza correctamente es n. La duración de la búsqueda cuando la búsqueda se realiza correctamente depende de la ubicación del destino de búsqueda en la tabla de búsqueda. Cuando el objetivo de búsqueda se encuentra en la primera posición de la tabla de búsqueda, el objetivo se puede encontrar comparándolo en secuencia y la longitud de la búsqueda es 1; cuando el objetivo de búsqueda se encuentra en la última posición de la tabla de búsqueda, el objetivo se puede encontrar encontrado por comparación en secuencia, y la longitud de búsqueda es 1; cuando está en la última posición de la tabla de búsqueda, necesita comparar n veces para encontrar el objetivo, y el objetivo de búsqueda es n; la longitud de búsqueda promedio es (n +1)/2.

La tabla de consulta del método de búsqueda secuencial puede ser una matriz o una lista enlazada. incluso archivos. No es necesario que las claves de cada registro en la tabla de búsqueda estén en orden.

1.5.3 Método de búsqueda a mitad de camino

La eficiencia de búsqueda en la tabla de búsqueda desordenada no es alta, y la longitud de búsqueda promedio es (n+1)/2 en el caso de búsqueda de igual eficiencia.

Si se ordena la tabla de búsqueda, se puede usar el método de búsqueda a mitad de camino para mejorar efectivamente la eficiencia de la búsqueda.

El método de búsqueda binaria también se denomina método de búsqueda binaria. Utiliza el orden de la tabla de búsqueda y adopta la estrategia de "divide y vencerás" para determinar primero el rango del objetivo de búsqueda, y cada comparación posterior puede reducir el rango general de la búsqueda. tabla de búsqueda hasta que encuentre el objetivo de búsqueda o hasta que el rango de búsqueda esté vacío.

La comparación de A[mid] con el objetivo de búsqueda se puede dividir en las siguientes situaciones:

  • A[mid]=clave, la búsqueda es exitosa;

  • A[mid]>tecla, high=mid, continuar buscando dentro del rango de búsqueda;

  • A[mid]<tecla, low=mid+1, continúa buscando dentro del rango de búsqueda.

    Cuando bajo>alto, el rango de búsqueda está vacío, no hay ningún elemento para verificar, no hay un objetivo de búsqueda en la tabla de búsqueda y la búsqueda falla.

    La primera búsqueda: mid=(8+0)/2=4, marque a[4]

    La segunda búsqueda: mid=(0+3)/2=1, marque a[1]

    La tercera búsqueda: mid=(2+3)/2=2, marque a[2], encuentre la clave

    Durante el proceso de búsqueda binaria, la secuencia de comparación de palabras clave es en realidad una parte de la secuencia de palabras clave en la ruta desde la raíz hasta un nodo hoja.

    Puede ocurrir una operación de redondeo al encontrar la posición media.En este momento, puede redondear hacia arriba o hacia abajo. Una vez determinado, debe ser consistente a lo largo de la búsqueda. En el ejemplo 1-2, si mid=[(low+high)/2], el árbol de decisión correspondiente se muestra en la figura 1-28.

1.5.4 Método de búsqueda de bloque

La búsqueda de bloques requiere dividir una tabla de búsqueda grande en varios bloques. Los valores en cada bloque están fuera de orden, pero los bloques deben estar en orden, es decir, el orden general.

Para cualquier i, todas las palabras clave en el bloque i-ésimo son más pequeñas que los valores clave existentes en el bloque i + 1. Además, se debe establecer una tabla de índice y se usa la clave más grande en cada bloque como el valor clave de la tabla de índice, almacenado en una matriz unidimensional en el orden de los bloques, y la matriz se ordena por valor clave.

Al buscar, primero busque en la tabla de índice para determinar el bloque donde se encuentra la clave que se encuentra. Luego busca en el bloque correspondiente.

Aunque la tabla de índice ocupa espacio de almacenamiento adicional, la búsqueda de la tabla de índice también aumenta una cierta cantidad de sobrecarga del sistema, pero debido a que la tabla de búsqueda está dividida en bloques, el rango de búsqueda se reduce cuando se busca dentro del bloque y se compara con la búsqueda secuencial. método de búsqueda, se mejora la eficiencia.

1.5.5 Funcionamiento básico de la máquina B-tree, concepto básico del árbol B+

1. El concepto básico del árbol B

En 1970, Bayer et al propusieron un árbol de búsqueda balanceado multidireccional llamado B-tree. Se define de la siguiente manera:

Un árbol B de orden M está vacío o es un árbol M-ario que satisface las siguientes propiedades:

  1. Cada nodo en el árbol tiene como máximo m subárboles
  2. El nodo raíz tiene al menos dos subárboles.
  3. Excepto el nodo raíz, cada nodo tiene al menos [m/2] subárboles
  4. Todos los nodos de hoja aparecen en la misma capa;
  5. Todos los nodos contienen datos en el siguiente formato: (n,A0,K1,A1,K2,A2,…,Kn,An)

Entre ellos, n es el número de palabras clave, Ki(i=1,...,n) es la palabra clave y satisface K1<K2<...<Kn. Ai(i=0,1,...,n) es un apuntador al nodo raíz del subárbol, y para i=1,2,...,n-1, todas las palabras clave de cada nodo en el subárbol señalaron a por Ai son It es mayor que K, pero menor que Ki + 1. Todas las palabras clave de cada nodo en el subárbol apuntado por A0 son más pequeñas que K1, y todas las palabras clave de cada nodo en el subárbol apuntado por An son más grandes que Kn. Para el mismo nodo, todos los punteros Ai son Is vacíos. Para un nodo que no sea hoja con n claves, habrá n+1 subárboles.

Como se muestra en la Figura 1-29, es un árbol B de 5 órdenes (m=5).

Cuando m=3, cada nodo contiene como máximo dos palabras clave y tres punteros, y al menos una palabra clave y dos punteros, por lo que el árbol B de tercer orden también se denomina árbol 2-3.

1.5.6 Tabla hash

La búsqueda secuencial, la búsqueda de bloques, la búsqueda a medias y la búsqueda en estructura de árbol, etc., son todas operaciones de "comparación" basadas en palabras clave. La búsqueda hash es un método de búsqueda que no se basa en operaciones de "comparación". Hashing establece una relación entre el valor de la clave y su ubicación de almacenamiento, y el acceso a los registros se realiza en función del valor de la clave. Es decir, el procedimiento almacenado que incluye el elemento de datos también puede realizar el procedimiento de búsqueda del elemento de datos. La relación entre el valor clave y su ubicación de almacenamiento (llamada dirección hash) viene dada por una función hash (o función hash), y la tabla de búsqueda que contiene los registros también se denomina tabla hash (tabla hash). Un método de búsqueda en una tabla hash que utiliza una función hash se denomina método hash (o método hash).

1. Función hash

La función hash es una relación de mapeo que asigna palabras clave a direcciones hash, expresadas como: addr=H(clave), donde addr es la dirección hash de la clave del elemento en la tabla hash. Los factores que afectan la complejidad de la función hash incluyen el tiempo requerido para calcular la función hash, la longitud de la clave, el tamaño de la tabla hash, la distribución de la clave y la frecuencia de búsqueda del registro. Si dos palabras clave se asignan a la misma dirección hash, se denomina "colisión". Una función hash que asigna cada clave a una ubicación única en la tabla hash se denomina función hash perfecta. Una función hash perfecta no causará colisiones, en cuyo caso todos los elementos de la tabla tienen un tiempo de acceso constante O(1).

En la mayoría de los casos, es posible que no se encuentre una función hash perfecta. Nuestro objetivo es encontrar una buena función hash que pueda razonablemente mezclar elementos en la tabla para evitar colisiones tanto como sea posible. Una buena función hash aún da como resultado un tiempo de acceso de orden constante (O (1)) a la tabla hash.

Para un conjunto de datos específico, hay muchas formas de diseñar la función hash.

1) La función hash del método del resto es: H(key)=key mod P, donde p es un cierto número entero positivo. El resultado de esta función está entre 0 y p-1. Generalmente, p toma el número primo más grande que no sea mayor que la longitud de la tabla.

2) Método de plegado

En el método de plegado, la palabra clave se divide en varios segmentos y luego se combinan o pliegan para obtener una dirección hash. Primero, la palabra clave se divide en varias subsecciones, cada subsección tiene la misma longitud que el subíndice y el último extremo puede ser un poco más corto. La forma en que se pliegan los segmentos puede variar de muchas formas.

En el método de plegado por turnos, estas subsecciones se suman para obtener la dirección hash.

También hay muchas variantes del método de plegado de límites. Pero en general, las subsecciones de la palabra clave se invierten y luego se agregan

Otras variantes del método de plegado utilizan diferentes algoritmos para decidir qué partes de la llave invertir.

El método de plegado también se puede usar cuando se crea una función hash en claves de tipo cadena. Por ejemplo, divida la cadena en varias subcadenas de la misma longitud que el subíndice requerido (por byte) y luego use la función XOR para combinar varias subcadenas. Este método también puede convertir una cadena en un valor, de modo que después de la conversión, también se pueden usar otros métodos (como los métodos de activación) para los tipos de cadena.

3) Método del centro cuadrado

En el método del cuadrado medio, la palabra clave se multiplica por sí misma y luego se usa el método de extracción para extraer los bits correspondientes del resultado cuadrado para obtener la dirección hash.

4) Método de conversión base

En el método de transformación de base, la palabra clave se convierte en otra base numérica.

5) método de análisis digital

El método de análisis digital (método de análisis de dígitos) extrae el bit especificado en la palabra clave y activa el procesamiento para obtener la dirección hash.

6) Método dependiente de la longitud
En el método dependiente de la longitud (método dependiente de la longitud), la palabra clave y la longitud de la palabra clave se combinan de alguna manera, o se usan directamente como una dirección hash, o se procesan posteriormente mediante otros métodos de dirección hash.

Al procesar cada carácter de la cadena en formato binario, el método dependiente de la longitud también se puede utilizar para el tipo de cadena.

2. Resolución de conflictos

Si se puede encontrar una función hash perfecta para un conjunto de datos específico, no hay necesidad de considerar el problema del conflicto. El llamado conflicto se refiere al mapeo de múltiples elementos o palabras clave en la misma posición en la tabla hash. Si no se puede encontrar una función hash perfecta, o no es práctico encontrar una función hash (por ejemplo, la sobrecarga de tiempo es demasiado grande), se usa una función hash razonable y se agrega un mecanismo de resolución de conflictos.

Hay varias formas de manejar los conflictos.

1) Métodos encadenados

El método de encadenamiento para manejar conflictos trata la tabla hash como una tabla de conjuntos en lugar de tablas de unidades individuales. Cada unidad de la tabla hash contiene un puntero a una tabla que consta de todas las claves asignadas a esa dirección.
Usando este método, en el peor de los casos, la función hash no procesa bien los elementos en la tabla, por lo que termina con una lista enlazada de n elementos, o varias listas enlazadas de aproximadamente n/k elementos. Aquí k es relativamente pequeño valor constante. En este caso, la inserción y búsqueda de la tabla hash se convierte en O(n).

2) método de dirección abierta

El método de direccionamiento abierto maneja los conflictos buscando otra posición abierta en la tabla que sea diferente de la posición hash original del elemento.La nueva fórmula de cálculo de dirección es:

Hi=(H(key)+di)mod mi = 1,2,'''''',k(k≤m-1) Entre ellos, H(key) es la función hash, m es la longitud de la tabla hash, di es la secuencia de incrementos.

Si di=1, 2, 3,..., m-1, se denomina sondeo lineal y método hash (sondeo lineal), también conocido como sondeo lineal;

Si di=1², -1², 2², -2², 3², ..., ±K² (k≤m/2), se llama sondeo cuadrático, también conocido como sondeo cuadrático;

Si la secuencia de números pseudoaleatorios se utiliza como la secuencia incremental di, se denomina método de rehashing de números pseudoaleatorios, también conocido como detección de números pseudoaleatorios.

La ventaja del método de exploración lineal es que antes de que la secuencia de reexploración llegue a la posición donde se produce el conflicto (posición base), todas las posiciones de la tabla pueden utilizarse como posiciones candidatas para insertar nuevos registros, pero su reexploración puede causar conflictos en registros posteriores. Esta tendencia a reunir la ira elemental se llama reunión elemental.

Utilice el factor de relleno a para describir la plenitud de la tabla hash:

a = el número de registros llenados en la tabla / la longitud de la tabla hash

1.5.7 Coincidencia de patrones de cadenas

Las cadenas son uno de los tipos de datos que se procesan con más frecuencia en los programas, y las cadenas también se conocen como cadenas para abreviar. Una cadena es una secuencia ordenada de cero o más cadenas de caracteres, generalmente registrada como S='a0a1…an-1'(n≥0)

Durante el proceso de emparejamiento, una vez que Tj y p no son iguales, entonces:

  • Si i>0, entonces la posición inicial de comparación de la cadena de patrón P en la siguiente comparación es Pnext(i), es decir, la cadena de patrón P se mueve hacia la derecha en posiciones i-next[i], y el puntero de la cadena de destino T no retrocede y sigue apuntando a Caracteres que no coincidieron en la pasada anterior;

  • Si i=0, el puntero T de la cadena objetivo se mueve una posición a la derecha, el puntero P de la cadena patrón vuelve a P0 y continúa realizando la siguiente comparación coincidente;

  • Si next[i]=0, ningún carácter en p necesita compararse con Tj, pero P debe desplazarse a la derecha en posiciones i+1, y la siguiente comparación debe realizarse desde P0 y tj+1.

    Para la cadena de módulo 'abaabcac', su siguiente valor de función se muestra en la Tabla 1-6.

    Tabla 1-6 El siguiente valor de la cadena del módulo "abaabcac"

Ubicación 01234567
cadena de módulo abaabac
siguiente valor -10011201

1.5.8 Análisis y aplicación del algoritmo de búsqueda

La complejidad temporal y la aplicación del algoritmo de búsqueda se pueden resumir brevemente como se muestra en la Figura 1-7

Tabla 1-7 Complejidad temporal de los algoritmos de búsqueda

algoritmo horas de operación Observación
búsqueda secuencial En) Aplicable a matrices y listas vinculadas, las palabras clave se pueden desordenar
encontrar por la mitad O(registro2n) Aplicable a arreglos, las claves están ordenadas
búsqueda de hash O(1) Calcular dirección hash, encontrar elemento (tiempo constante)

Guess you like

Origin blog.csdn.net/weixin_53073551/article/details/131113569