Supposons que j'ai une liste de fonctions, par exemple
Comment puis-je les trier asymptotiquement, c'est-à-dire après la relation définie par
,
en supposant qu'ils soient effectivement comparables deux à deux (voir aussi ici )? L'utilisation de la définition de semble délicate et il est souvent difficile de prouver l'existence de constantes appropriées et .
Il s’agit de mesures de complexité. Nous nous intéressons donc au comportement asymptotique sous la forme , et supposons que toutes les fonctions prennent uniquement des valeurs non négatives ( ).∀ n , f ( n ) ≥ 0
Réponses:
Si vous voulez une preuve rigoureuse, le lemme suivant est souvent utile resp. plus pratique que les définitions.
Avec cela, vous devriez pouvoir commander la plupart des fonctions à venir dans l'analyse d'algorithme¹. En exercice, prouvez-le!
Bien entendu, vous devez pouvoir calculer les limites en conséquence. Voici quelques astuces utiles pour décomposer des fonctions complexes en fonctions de base:
Plus généralement: si vous avez une fonction convexe, continuellement différentiable et strictement croissante, vous pouvez ainsi ré-écrire votre quotient en tant queh
,F( n )g( n )= h ( f*( n ) )h ( g*( n ) )
avec etg*∈ Ohm ( 1 )
,limn→∞f∗(n)g∗(n)=∞
puis
.limn→∞f(n)g(n)=∞
Voir ici pour une preuve rigoureuse de cette règle (en allemand).
Considérez les continuations de vos fonctions sur les réels. Vous pouvez maintenant utiliser la règle de L'Hôpital ; soyez conscient de ses conditions²!
Lorsque les factorielles apparaissent, utilisez la formule de Stirling :
Il est également utile de conserver un pool de relations de base que vous avez prouvées une fois et que vous utilisez souvent, telles que:
les logarithmes croissent plus lentement que les polynômes, c.-à-d.
pour tout α , β > 0 .(logn)α∈o(nβ) α,β>0
ordre des polynômes:
pour toutα<β.nα∈o(nβ) α<β
les polynômes croissent plus lentement que les exponentielles:
pour toutαetc>1.nα∈o(cn) α c>1
Il peut arriver qu’au-dessus du lemme ne soit pas applicable car la limite n’existe pas (par exemple, lorsque les fonctions oscillent). Dans ce cas, considérons la caractérisation suivante des classes de Landau en utilisant des limes supérieures / inférieures :
Check here and here if you are confused by my notation.
¹ Nota bene: My colleague wrote a Mathematica function that does this successfully for many functions, so the lemma really reduces the task to mechanical computation.
² See also here.
la source
Limit[f[n]/g[n], n -> Infinity]
and perform a case distinction.Another tip: sometimes applying a monotone function (like log or exp) to the functions makes things clearer.
la source
Skiena provides a sorted list of the dominance relations between the most common functions in his book, The Algorithm Design Manual:
Hereα(n) denotes the inverse Ackermann function.
la source
Tip: draw graphs of these functions using something like Wolfram Alpha to get a feeling for how they grow. Note that this is not very precise, but if you try it for sufficiently large numbers, you should see the comparative patterns of growth. This of course is no substitute for a proof.
E.g., try: plot log(log(n)) from 1 to 10000 to see an individual graph or plot log(log(n)) and plot log(n) from 1 to 10000 to see a comparison.
la source
I suggest proceeding according to the definitions of various notations. Start with some arbitrary pair of expressions, and determine the order of those, as outlined below. Then, for each additional element, find its position in the sorted list using binary search and comparing as below. So, for example, let's sortnloglogn and 2n , the first two functions of n, to get the list started.
We use the property thatn=2logn to rewrite the first expression as nloglogn=(2logn)loglogn=2lognloglogn . We could then proceed to use the definition to show that nloglogn=2lognloglogn∈o(2n) , since for any constant c>0 , there is an n0 such that for n≥n0 , c(nloglogn)=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.
la source
Here a list from Wikipedia, The lower in the table the bigger complexity class;NameConstant timeInverse Ackermann timeIterated logarithmic timeLog-logarithmicLogarithmic timePolylogarithmic timeFractional powerLinear time"n log star n" timeQuasilinear timeQuadratic timeCubic timePolynomial timeQuasi-polynomial timeSub-exponential time (first definition)Sub-exponential time (second definition)Exponential time(with linear exponent)Exponential timeFactorial timeRunning TimeO(1)O(a(n))O(log∗n)O(nlogn)O(logn)poly(logn)O(nc),where 0<c<1O(n)O(nlog∗n)O(nlogn)O(n2)O(n3)poly(n)=2O(logn)2O(poly(logn))O(2nϵ),ϵ>02o(n)2O(n)2poly(n)O(n!)
note :poly(x)=xO(1)
la source