Suponha que eu tenha uma lista de funções, por exemplo
Como os classifico assintoticamente, ou seja, após a relação definida por
,
assumindo que eles são realmente comparáveis aos pares (veja também aqui )? Usar a definição de parece estranho, e muitas vezes é difícil provar a existência de constantes adequadas e .
Trata-se de medidas de complexidade, por isso estamos interessados no comportamento assintótico como , e assumimos que todas as funções assumem apenas valores não negativos ( ).
Respostas:
Se você deseja uma prova rigorosa, o lema a seguir geralmente é útil. mais útil que as definições.
Com isso, você poderá ordenar a maioria das funções apresentadas na análise de algoritmos¹. Como exercício, prove!
Claro que você deve poder calcular os limites de acordo. Alguns truques úteis para dividir funções complicadas em funções básicas são:
De maneira mais geral: se você tiver uma função convexa, continuamente diferenciável e aumentando estritamente para que você possa reescrever seu quociente comoh
,f( N )g( N )= h ( f∗( N ) )h ( g∗( N ) )
com eg∗∈ ohms ( 1 )
,limn → ∞f∗( N )g∗( N )= ∞
então
.limn → ∞f( N )g( N )= ∞
Veja aqui uma prova rigorosa desta regra (em alemão).
Considere continuações de suas funções sobre os reais. Agora você pode usar a regra do L'Hôpital ; esteja atento às suas condições²!
Quando os fatoriais aparecerem, use a fórmula de Stirling :
Também é útil manter um conjunto de relações básicas que você prova uma vez e usa com frequência, como:
logaritmos crescem mais lentamente que os polinômios,
para todos α , β > 0 .( logn )α∈ O ( nβ) α , β> 0
ordem dos polinômios:
para todos osα<β.nα∈ O ( nβ) α < β
os polinômios crescem mais lentamente que os exponenciais:
para todosαec>1.nα∈ o ( cn) α c > 1
Pode acontecer que o lema acima não seja aplicável porque o limite não existe (por exemplo, quando as funções oscilam). Nesse caso, considere a seguinte caracterização das classes Landau usando limões superior / inferior :
Verifique aqui e aqui se você está confuso com a minha notação.
Ben Nota bene: Meu colega escreveu uma função do Mathematica que faz isso com êxito em muitas funções, portanto o lema realmente reduz a tarefa à computação mecânica.
² Veja também aqui .
fonte
Limit[f[n]/g[n], n -> Infinity]
e realizar uma distinção entre maiúsculas e minúsculas.Outra dica: às vezes, aplicar uma função monótona (como log ou exp) às funções torna as coisas mais claras.
fonte
Skiena fornece uma lista ordenada das relações de dominância entre as funções mais comuns em seu livro, The Algorithm Design Manual:
Aquiα(n) denota a função inversa de Ackermann .
fonte
Dica: desenhe gráficos dessas funções usando algo como Wolfram Alpha para ter uma ideia de como elas crescem. Observe que isso não é muito preciso, mas se você tentar por números suficientemente grandes, deverá ver os padrões comparativos de crescimento. Obviamente, isso não substitui uma prova.
Por exemplo, tente: log de plotagem (log (n)) de 1 a 10000 para ver um gráfico ou log de plotagem individual (log (n)) e log de plotagem (n) de 1 a 10000 para ver uma comparação.
fonte
Sugiro proceder de acordo com as definições de várias notações. Comece com um par de expressões arbitrário e determine a ordem delas, conforme descrito abaixo. Em seguida, para cada elemento adicional, encontre sua posição na lista classificada usando a pesquisa binária e comparando como abaixo. Então, por exemplo, vamos classificarnregistroregistron e 2n , as duas primeiras funções de n, para iniciar a lista.
Usamos a propriedade quen = 2registron reescrever a primeira expressão como nregistroregistron= ( 2registron)registroregistron= 2registron logregistron . Poderíamos então usar a definição para mostrar quenregistroregistron= 2registron logregistron∈ O ( 2n) , já que para qualquer constante c > 0 , há um n0 0 tal que para n ≥ n0 0 , c ( nregistroregistron)=c(2lognloglogn)<2n .
Next, we try3n . We compare it to 2n , the largest element we have placed so far. Since 3n=(2log3)n=2nlog3 , we similarly show that 2n∈o(3n)=o(2nlog3) .
Etc.
fonte
Aqui está uma lista da Wikipedia : Quanto menor na tabela, maior a classe de complexidade;Na m eTempo constanteTempo inverso de AckermannTempo logarítmico iteradoLog-logarítmicoTempo logarítmicoTempo polilogarítmicoPoder fracionárioTempo linearhora "n log star n"Tempo quaseilinearTempo quadráticoTempo cúbicoTempo polinomialTempo quase polinomialTempo subexponencial (primeira definição)Tempo subexponencial (segunda definição)Tempo exponencial (com expoente linear)Tempo exponencialTempo fatorialTempo de execuçãoO (1)O (um(n))O ( log∗n )O (nlogn )O ( logn )p o l y( logn )O ( nc) , onde 0 < c < 1O (n)O (n log∗n )O (n logn )O ( n2)O ( n3)p o l y( n ) = 2O ( logn )2O (poly( logn ) )O ( 2nϵ) , ϵ > 02o (n)2O (n)2p o l y( N )O (n!)
Nota :p o l y( x ) = xO (1)
fonte