1.5 Pesquisa

1.5 Pesquisa

Encontrar é uma operação importante, também conhecida como recuperação. O objeto a ser pesquisado pode ser uma tabela linear, uma estrutura em árvore ou até mesmo uma estrutura de arquivo.

Os principais métodos de busca são busca sequencial, meia busca e busca baseada em estrutura de árvore, ou seja, método hash.

1.5.1 O conceito básico de pesquisa

Uma chave é o valor de um item de dados em um elemento de dados que identifica um elemento de dados. Uma palavra-chave que pode representar exclusivamente um elemento de dados é chamada de palavra-chave, e uma palavra-chave usada para identificar vários elementos de dados é chamada de palavra-chave secundária. Em outras palavras, para qualquer valor value, pode haver no máximo um registro na tabela de pesquisa cuja chave primária é value, mas o registro cuja chave secundária é value pode ter vários registros.

De acordo com uma determinada chave de valor, o processo de encontrar o registro da palavra-chave Ki=chave na tabela de pesquisa é chamado de pesquisa, também chamado de recuperação. Se tal registro existir na tabela de consulta, diz-se que a pesquisa foi bem-sucedida; caso contrário, diz-se que a pesquisa falhou, ou seja, não há nenhum registro cuja palavra-chave seja chave na tabela de pesquisa. A chave é chamada de destino de pesquisa.

Durante o processo de pesquisa, o número de comparações de palavras-chave é chamado de comprimento da pesquisa. A eficiência do algoritmo de pesquisa é medida usando o comprimento médio da pesquisa (ASL) quando a pesquisa é bem-sucedida e o comprimento da pesquisa quando a pesquisa não é bem-sucedida.

1.5.2 Método de busca sequencial

Se as palavras-chave na tabela de pesquisa estiverem fora de ordem, o método de pesquisa sequencial pode ser usado.

A estratégia de busca sequencial é muito simples: comece de K0, compare o alvo da busca com a palavra-chave sucessivamente, se forem iguais, a busca foi bem-sucedida; caso contrário, continue comparando a próxima palavra-chave. Quando todas as palavras-chave na tabela de pesquisa são comparadas com o destino de pesquisa e não são iguais, a pesquisa falha e o processo de pesquisa termina.

Em uma tabela de pesquisa com n elementos, o comprimento da pesquisa quando a pesquisa não é bem-sucedida é n. A duração da pesquisa quando a pesquisa é bem-sucedida depende do local do destino de pesquisa na tabela de pesquisa. Quando o destino de pesquisa está localizado na primeira posição da tabela de pesquisa, o destino pode ser encontrado por comparação em sequência e o comprimento da pesquisa é 1; quando o destino de pesquisa está na última posição da tabela de pesquisa, o destino pode ser encontrado por comparação em sequência, e o tamanho da pesquisa é 1; Quando está na última posição da tabela de pesquisa, ele precisa comparar n vezes para encontrar o alvo, e o alvo da pesquisa é n; o tamanho médio da pesquisa é (n +1)/2.

A tabela de pesquisa do método de pesquisa sequencial pode ser uma matriz ou uma lista encadeada. mesmo arquivos. As chaves de cada registro na tabela de pesquisa não precisam estar em ordem.

1.5.3 Método de busca no meio do caminho

A eficiência da pesquisa na tabela de pesquisa não ordenada não é alta e o comprimento médio da pesquisa é (n+1)/2 no caso de pesquisa de eficiência igual.

Se a tabela de pesquisa for ordenada, o método de pesquisa intermediária pode ser usado para melhorar efetivamente a eficiência da pesquisa.

O método de pesquisa binária também é chamado de método de pesquisa binária. Ele usa a ordem da tabela de pesquisa e adota a estratégia "dividir para conquistar" para determinar primeiro o intervalo do alvo de pesquisa e cada comparação subsequente pode restringir o intervalo geral do tabela de pesquisa até encontrar o alvo de pesquisa ou até que o intervalo a ser pesquisado esteja vazio.

A comparação de A[mid] com o alvo de pesquisa pode ser dividida nas seguintes situações:

  • A[mid]=chave, a pesquisa foi bem-sucedida;

  • A[mid]>tecla, high=mid, continua a busca dentro do intervalo de busca;

  • A[mid]<tecla, low=mid+1, continue a pesquisar dentro do intervalo de pesquisa.

    Quando baixo>alto, o intervalo de pesquisa está vazio, não há elemento para verificar, não há destino de pesquisa na tabela de pesquisa e a pesquisa falha.

    A primeira pesquisa: mid=(8+0)/2=4, marque a[4]

    A segunda pesquisa: mid=(0+3)/2=1, marque a[1]

    A terceira pesquisa: mid=(2+3)/2=2, marque a[2], encontre a chave

    Durante o processo de pesquisa binária, a sequência de comparação de palavras-chave é, na verdade, parte da sequência de palavras-chave no caminho da raiz para um nó folha.

    Uma operação de arredondamento pode ocorrer ao encontrar a posição do meio. Neste momento, você pode arredondar para cima ou para baixo. Uma vez determinado, deve ser consistente durante toda a pesquisa. No Exemplo 1-2, se mid=[(low+high)/2], a árvore de decisão correspondente é mostrada na Figura 1-28.

1.5.4 Método de busca de bloco

A pesquisa de bloco requer a divisão de uma grande tabela de pesquisa em vários blocos. Os valores em cada bloco estão fora de ordem, mas os blocos devem estar em ordem, ou seja, a ordem geral.

Para qualquer i, todas as palavras-chave no i-ésimo bloco são menores que os valores-chave existentes no i + 1º bloco. Além disso, uma tabela de índice deve ser estabelecida e a maior chave em cada bloco é usada como o valor da chave da tabela de índice, armazenado em uma matriz unidimensional na ordem dos blocos, e a matriz é ordenada pelo valor da chave.

Ao pesquisar, primeiro procure na tabela de índices para determinar o bloco onde está localizada a chave a ser encontrada. Em seguida, procure no bloco correspondente.

Embora a tabela de índice ocupe espaço de armazenamento adicional, a pesquisa da tabela de índice também aumenta uma certa sobrecarga do sistema, mas como a tabela de pesquisa é dividida em blocos, o intervalo de pesquisa é reduzido ao pesquisar dentro do bloco e em comparação com o sequencial método de busca, a eficiência é melhorada.

1.5.5 Operação básica da máquina B-tree, conceito básico da árvore B+

1. O conceito básico da árvore B

Em 1970, Bayer et al propuseram uma árvore de busca balanceada de múltiplas vias chamada B-tree. É definido da seguinte forma:

Uma árvore B de ordem M está vazia ou é uma árvore M-ária que satisfaz as seguintes propriedades:

  1. Cada nó na árvore tem no máximo m subárvores
  2. O nó raiz tem pelo menos duas subárvores
  3. Exceto o nó raiz, cada nó tem pelo menos [m/2] subárvores
  4. Todos os nós de folha aparecem na mesma camada;
  5. Todos os nós contêm dados no seguinte formato: (n,A0,K1,A1,K2,A2,…,Kn,An)

Entre eles, n é o número de palavras-chave, Ki(i=1,...,n) é a palavra-chave e satisfaz K1<K2<...<Kn. Ai(i=0,1,...,n) é um ponteiro para o nó raiz da subárvore, e para i=1,2,...,n-1, todas as palavras-chave de cada nó na subárvore apontadas para por Ai são It é maior que K, mas menor que Ki + 1. Todas as palavras-chave de cada nó na subárvore apontada por A0 são menores que K1, e todas as palavras-chave de cada nó na subárvore apontada por An são maiores que Kn. Para o mesmo nó, todos os ponteiros Ai são Is vazios. Para um nó não folha com n chaves, haverá n+1 subárvores.

Conforme mostrado na Figura 1-29, é uma árvore B de ordem 5 (m=5).

Quando m=3, cada nó contém no máximo duas palavras-chave e três ponteiros, e pelo menos uma palavra-chave e dois ponteiros, então a árvore B de 3ª ordem também é chamada de árvore 2-3.

1.5.6 Tabela de hash

Pesquisa sequencial, pesquisa em bloco, meia pesquisa e pesquisa em estrutura de árvore, etc., são todas operações de "comparação" baseadas em palavras-chave. A pesquisa de hash é um método de pesquisa que não depende de operações de "comparação". O hashing estabelece uma relação entre o valor da chave e seu local de armazenamento, e o acesso aos registros é feito com base no valor da chave. Ou seja, o procedimento armazenado incluindo o elemento de dados também pode realizar o procedimento de pesquisa do elemento de dados. A relação entre o valor da chave e seu local de armazenamento (chamado endereço hash) é dada por uma função hash (ou função hash), e a tabela de consulta que contém os registros também é chamada de tabela hash (tabela hash). Um método de pesquisa em uma tabela hash usando uma função hash é chamado de método hash (ou método hash).

1. Função hash

A função hash é um relacionamento de mapeamento que mapeia palavras-chave para endereços hash, expressos como: addr=H(chave), onde addr é o endereço hash da chave do elemento na tabela hash. Os fatores que afetam a complexidade da função hash incluem o tempo necessário para calcular a função hash, o comprimento da chave, o tamanho da tabela hash, a distribuição da chave e a frequência de pesquisa do registro. Se duas palavras-chave forem mapeadas para o mesmo endereço de hash, isso é chamado de "colisão". Uma função de hash que mapeia cada chave para um local exclusivo na tabela de hash é chamada de função de hash perfeita. Uma função de hash perfeita não causará colisões, caso em que todos os elementos da tabela têm tempo de acesso constante O(1).

Na maioria dos casos, uma função de hash perfeita pode não ser encontrada. Nosso objetivo é encontrar uma boa função de hash que possa razoavelmente misturar elementos na tabela para evitar colisões tanto quanto possível. Uma boa função de hash ainda resulta em tempo de acesso de ordem constante (O(1)) à tabela de hash.

Para um conjunto de dados específico, há muitas maneiras de projetar a função de hash.

1) A função hash do método do resto é: H(key)=key mod P, onde p é um certo número inteiro positivo. O resultado desta função está entre 0 e p-1. Geralmente, p leva o maior número primo não maior que o comprimento da tabela.

2) Método de dobragem

No método de dobramento, a palavra-chave é dividida em vários segmentos e, em seguida, eles são combinados ou dobrados para obter um endereço de hash. Primeiro, a palavra-chave é dividida em várias subseções, cada subseção tem o mesmo comprimento que o subscrito e a última extremidade pode ser um pouco mais curta. A maneira como os segmentos são dobrados pode variar de muitas maneiras.

No método de dobramento por deslocamento, essas subseções são somadas para obter o endereço de hash.

Existem também muitas variantes do método de dobramento de limite. Mas, em geral, as subseções da palavra-chave são invertidas e depois adicionadas

Outras variantes do método de dobramento usam algoritmos diferentes para decidir quais partes da chave inverter.

O método folding também pode ser usado ao criar uma função hash em chaves do tipo string. Por exemplo, divida a string em várias substrings do mesmo comprimento que o subscrito necessário (por byte) e, em seguida, use a função XOR para combinar várias substrings. Esse método também pode converter uma string em um valor, de modo que, após a conversão, outros métodos (como métodos de gatilho) também possam ser usados ​​para tipos de string.

3) Método do centro quadrado

No método do quadrado médio, a palavra-chave é multiplicada por si mesma e, em seguida, o método de extração é usado para extrair os bits correspondentes do resultado do quadrado para obter o endereço de hash.

4) Método de conversão de base

No método de transformação radix, a palavra-chave é convertida em outra raiz numérica.

5) Método de análise digital

O método de análise digital (método de análise de dígitos) extrai o bit especificado na palavra-chave e ativa o processamento para obter o endereço de hash.

6) Método dependente do comprimento
No método dependente do comprimento (método dependente do comprimento), a palavra-chave e o comprimento da palavra-chave são combinados de alguma forma, ou usados ​​diretamente como um endereço de hash, ou posteriormente processados ​​por outros métodos de endereço de hash.

Ao processar cada caractere na string em formato binário, o método dependente do comprimento também pode ser usado para o tipo de string.

2. Resolução de Conflitos

Se uma função hash perfeita pode ser encontrada para um conjunto de dados específico, não há necessidade de considerar o problema do conflito.O chamado conflito refere-se ao mapeamento de vários elementos ou palavras-chave para a mesma posição na tabela hash. Se uma função hash perfeita não puder ser encontrada, ou for impraticável encontrar uma função hash (por exemplo, a sobrecarga de tempo é muito grande), uma função hash razoável é usada e um mecanismo de resolução de conflitos é adicionado.

Existem várias maneiras de lidar com conflitos.

1) Métodos encadeados

O método de encadeamento para lidar com conflitos trata a tabela hash como uma tabela de conjuntos em vez de tabelas de unidades individuais. Cada unidade da tabela de hash contém um ponteiro para uma tabela que consiste em todas as chaves mapeadas para esse endereço.
Usando este método, no pior caso, a função hash não mistura bem os elementos na tabela, então você acaba com uma lista encadeada de n elementos, ou várias listas encadeadas de cerca de n/k elementos. Aqui k é relativamente pequeno valor constante. Nesse caso, a inserção e consulta da tabela hash tornam-se O(n).

2) Método de endereço aberto

O método de endereçamento aberto lida com conflitos procurando outra posição aberta na tabela que seja diferente da posição hash original do elemento. A nova fórmula de cálculo de endereço é:

Hi=(H(key)+di)mod mi = 1,2,'''''',k(k≤m-1) Entre eles, H(key) é a função hash, m é o comprimento do tabela hash, di é a sequência de incrementos.

Se di=1, 2, 3,..., m-1, é chamado de método de sondagem linear e hashing (sondagem linear), também conhecido como sondagem linear;

Se di=1², -1², 2², -2², 3², ..., ±K² (k≤m/2), é chamado de apalpação quadrática, também conhecida como apalpação quadrática;

Se a sequência de números pseudo-aleatórios for usada como a sequência incremental di, ela é chamada de método de re-hashing de números pseudo-aleatórios, também conhecido como detecção de números pseudo-aleatórios.

A vantagem do método de exploração linear é que antes que a sequência de reexploração atinja a posição onde ocorre o conflito (posição base), todas as posições da tabela podem ser utilizadas como posições candidatas à inserção de novos registros, mas sua reexploração pode causar conflitos em registros subseqüentes. Essa tendência de reunir a raiva elementar é chamada de reunião elementar.

Use o fator de preenchimento a para descrever a plenitude da tabela de hash:

a = o número de registros preenchidos na tabela / o comprimento da tabela hash

1.5.7 Correspondência de padrão de string

Strings são um dos tipos de dados processados ​​com mais frequência em programas, e strings também são chamadas de strings para abreviar. Uma string é uma sequência ordenada de zero ou mais strings de caracteres, geralmente registrada como S='a0a1…an-1'(n≥0)

Durante o processo de emparelhamento, uma vez que Tj e p não são iguais, então:

  • Se i>0, então a posição de comparação inicial da string padrão P na próxima comparação é Pnext(i), ou seja, a string padrão P é movida para a direita pelas posições i-next[i] e o ponteiro de a string de destino T não retrocede e ainda aponta para caracteres que não corresponderam na passagem anterior;

  • Se i=0, o ponteiro T da string de destino se move uma posição para a direita, o ponteiro P da string padrão retorna para P0 e continua a executar a próxima comparação correspondente;

  • Se next[i]=0, qualquer caractere em p não precisa ser comparado com Tj, mas P deve ser deslocado para a direita em i+1 posições, e a próxima comparação deve ser realizada a partir de P0 e tj+1.

    Para a string de módulo 'abaabcac', seu próximo valor de função é mostrado na Tabela 1-6.

    Tabela 1-6 O próximo valor da string do módulo "abaabcac"

Localização 01234567
string do módulo abaabac
próximo valor -10011201

1.5.8 Análise e aplicação do algoritmo de busca

A complexidade de tempo e a aplicação do algoritmo de busca podem ser brevemente resumidas conforme mostrado na Figura 1-7

Tabela 1-7 Complexidade de tempo dos algoritmos de pesquisa

algoritmo Horas de operação Observação
pesquisa sequencial Sobre) Aplicável a arrays e listas encadeadas, as palavras-chave podem ser desordenadas
Encontrar ao meio O(log2n) Aplicável a arrays, as chaves são ordenadas
pesquisa de hash O(1) Calcular endereço de hash, encontrar elemento (tempo constante)

Acho que você gosta

Origin blog.csdn.net/weixin_53073551/article/details/131113569
Recomendado
Clasificación