A pesquisa de uma matriz de elementos usando a pesquisa binária leva, na pior das hipóteses, iterações porque, a cada passo, reduzimos metade do nosso espaço de pesquisa. Se, em vez disso, utilizássemos 'pesquisa ternária', dois terços do nosso espaço de pesquisa a cada iteração; portanto, o pior caso levar iterações ...
Parece que a pesquisa ternária é mais rápida, então por que usamos a pesquisa binária?
algorithms
algorithm-analysis
runtime-analysis
search-algorithms
binary-search
The Mean Square
fonte
fonte
Respostas:
Se você aplicar a pesquisa binária, você terá muitas comparações. Se você aplicar a pesquisa ternária, terá muitas comparações, pois em cada etapa, será necessário realizar 2 comparações para reduzir o espaço da pesquisa em três partes. Agora, se você fizer as contas, poderá observar que: Como sabemos que , na verdade temos mais comparações com a pesquisa ternária.
A propósito: a pesquisa -ary pode fazer muito sentido, se as comparações forem bastante caras e puderem ser paralelizadas, como então, computadores paralelos podem ser aplicados.n
Observe que o argumento pode ser generalizado para arary search com bastante facilidade. Você só precisa mostrar que a função é estritamente monótona aumentando para valores inteiros de .n f(k)=(k−1)⋅log(2)log(k) k
fonte
O DCTLib está certo, mas esqueça a matemática por um segundo.
Pela sua lógica então, n- ar deve ser o mais rápido. Mas se você pensar bem, n- ar é exatamente igual a uma pesquisa de iteração regular (apenas iterando pela lista 1 por 1, mas na ordem inversa). Primeiro, você seleciona o último item (ou o penúltimo) na lista e compara esse valor ao seu valor de comparação. Em seguida, você remove esse item da sua lista e escolhe o último item na nova lista, que é apenas o penúltimo valor da matriz. Cada vez, você eliminaria apenas 1 valor por vez até encontrar seu valor.
Em vez disso, você deve pensar assim - como faço para eliminar o máximo de valores da lista a cada iteração? Em uma pesquisa binária, você sempre elimina metade da lista. Em uma pesquisa ternária, existe a possibilidade (33,33% de chance, na verdade) de você eliminar 2/3 da lista, mas há uma chance ainda maior (66,66%) de eliminar apenas 1/3 da lista. para calcular O (n), você precisa observar o pior cenário, que é 1/3, menor que 1/2. À medida que você se aproxima cada vez mais de n, fica ainda pior.
Não apenas o pior cenário será aprimorado com a pesquisa binária, mas também o tempo médio . Observando o valor esperado (que parte da lista podemos remover em média), usamos esta fórmula:
(P_lower) x (parte que podemos remover se for menor) + (P_higher) x (parte que podemos remover se for maior) = E
Para pesquisa binária, isso é .5x.5 + .5x.5 = .5 (sempre removemos metade da lista). Para pesquisas ternárias, esse valor é .666x.333 + .333x.666 = 0.44, ou a cada etapa, provavelmente removeremos apenas 44% da lista, tornando-a menos eficiente que a pesquisa binária, em média. Esse valor atinge o pico em 1/2 (metade da lista) e diminui quanto mais você chegar a n (iteração reversa) e 0 (iteração regular).
Ok, então eu menti .. há um pouco de matemática envolvida, mas espero que ajude!
fonte
Observe que o argumento das comparações log (N) vs 2 log (N) é baseado em uma interpretação ingênua do algoritmo. Se eu realmente sentasse e escrevesse isso na montagem x86, os resultados seriam invertidos. O problema é o uso de números inteiros para casos de teste combinados com um compilador insuficientemente inteligente que não pode remover as comparações redundantes. Tente novamente com strings e uma função de comparação de strings apropriada e codifique-a para chamar a função de comparação uma vez por loop e você descobrirá que a pesquisa ternária é mais rápida novamente.
fonte