Em aplicativos do mundo real, há um benefício concreto ao usar os algoritmos vez dos \ mathcal {O} (\ log (n)) ?O ( log ( n ) )
É o caso quando se usa, por exemplo, árvores de van Emde Boas, em vez de implementações mais convencionais de árvores de pesquisa binária. Mas, por exemplo, se pegarmos , na melhor das hipóteses, o algoritmo logarítmico duplo supera o algoritmo logarítmico por (aproximadamente) um fator de . E também, em geral, a implementação é mais complicada e complexa.
Dado que eu pessoalmente prefiro o BST do que as árvores VEB, o que você acha?
Pode-se demonstrar facilmente que:
algorithms
complexity-theory
binary-trees
algorithm-analysis
search-trees
Ghassen Hamrouni
fonte
fonte
Respostas:
Não esqueça que ainda cresce exponencialmente (em ) mais rápido que !log ( n ) log ( log n )registron registro( N ) registro( logn )
De fato, se você observar o quociente de e , não há muito impressionante para ver:log ( log ( n ) )registro( N ) registro( log( N ) )
[ fonte ]
Mas, ainda assim, você recebe um fator de cinco a seis para tamanhos de até . Observe que tamanhos maiores não são incomuns na prática, e uma aceleração por esse fator é impressionante ! Pode fazer a diferença entre ter resultados após o almoço ou apenas amanhã. Esteja ciente de que parte da aceleração pode ser devorada por constantes mais altas da implementação da árvore; você teria que plotar (ou analisar) e com as constantes reais do tempo de execução para obter uma imagem real.100000 c ⋅ log( N ) d⋅ log( log( N ) ) c , d
Além disso, o que Dave menciona é importante: se a operação acelerada for executada, digamos, linearmente, com frequência, acelerações constantes se tornam acelerações lineares, ou seja, você pode diminuir a constante principal de todo o seu algoritmo! Como eu disse acima, isso é incrível. Veja o que acontece se você executar a operação vezes:n
[ fonte ]
Agora, se isso não vale a pena, não sei o quê.
fonte
Pode-se imaginar que a diferença de complexidade realmente não importa tanto e que o tempo de execução real é mais importante. Mas se o algoritmo estiver no centro de outro algoritmo, essa diferença poderá ser importante.
De um propósito puramente teórico, a diferença de curso é importante, especialmente se o algoritmo fizer parte de outro. Pode colocar o algoritmo maior em uma classe de complexidade diferente.
fonte
Na verdade, eu já comparei a árvore da van Emde-Boas uma vez. Comparei com uma árvore AA, um mapa de hash e uma matriz de bits.
Os testes executam
size
inserções com números aleatórios no intervalo[0, bound]
, depoissize
pesquisam,size
excluem e depoissize
pesquisam novamente . As exclusões também são feitas em números aleatórios, portanto, primeiro você precisa descobrir se elas estão na estrutura.Aqui estão os resultados (
size
= 2000000,bound
= 10000000) em segundos:Como você pode ver, as árvores van Emde-Boas são duas vezes mais lentas que os mapas de hash, dez vezes mais lentas que as matrizes de bits e 5 vezes mais rápidas que as árvores de pesquisa binária.
É claro que o que precede precisa de um aviso: os testes são artificiais, é possível melhorar o código ou usar um idioma diferente com um compilador cuja saída é mais rápida e assim por diante.
Essa isenção de responsabilidade está no centro do motivo pelo qual usamos a análise assintótica no design de algoritmos: como você não tem idéia do que são as constantes e como as constantes podem mudar dependendo dos fatores ambientais, o melhor que podemos fazer é uma análise assintótica.
fonte