Acabei de ler Esse algoritmo ainda pode ser considerado um algoritmo de Pesquisa Binária? e lembrei que, alguns anos atrás, escrevi um indexador / pesquisei arquivos de log para encontrar entradas de log em grandes arquivos de texto sem formatação por janela de data / hora.
Enquanto fazia isso, decidi tentar a pesquisa de interpolação (não sabia como era chamado, meio que me deparei com a ideia). Então, por algum motivo, continuei com a ideia de alternar etapas de interpolação com etapas binárias de divisão: na etapa 0, eu interpolava para decidir o ponto de teste, depois a etapa 1 usava o ponto médio exato, etc.
Em seguida, comparei o sistema usando pesquisa de interpolação pura, pesquisa binária pura e minha tentativa de combinação. A abordagem alternativa foi uma vencedora clara, tanto no tempo quanto no número de testes necessários antes de encontrar um conjunto de horários escolhidos aleatoriamente.
Inspirado na pergunta vinculada, fiz uma pesquisa rápida por "pesquisa de interpolação alternada e pesquisa binária" e não encontrei nada. Eu também tentei "pesquisa de interpolação com cobertura", conforme sugerido no meu comentário em uma das respostas.
Eu me deparei com uma coisa conhecida? Existe alguma justificativa teórica para ser mais rápido para certos tipos de dados? Os arquivos de log eram geralmente grandes para a época (por exemplo, 1-2 GB de texto com talvez 10 milhões de linhas para pesquisar), e a distribuição de datas / horas neles era complexa, com fortes explosões de atividade, horários de pico em geral e horários de silêncio. Meus testes de referência foram amostrados a partir de uma distribuição uniforme dos tempos-alvo a serem encontrados.
fonte
prefetcht0
instruções ) as duas possibilidades da iteração NEXT antes de carregar o ponto médio atual, para uma pesquisa na memória em hardware x86 moderno. Você não pode fazer isso se não puder prever os próximos endereços de busca antes do tempo. Portanto, os detalhes práticos da implementação podem ser significativos, além de considerações teóricas .