2009-04-15 9 views
9

Ma question provient de la poste "Plain English Explanation of Big O". Je ne connais pas la signification exacte de la complexité logarithmique. Je sais que je peux faire une régression entre le temps et le nombre d'opérations et calculer la valeur X-carré, et déterminer ainsi la complexité. Cependant, je veux connaître une méthode pour le déterminer rapidement sur papier.Comment savoir quand Big O est Logarithmique?

Comment déterminez-vous la complexité logarithmique? Y a-t-il de bons repères?

Répondre

10

Vous ne savez pas si c'est ce que vous voulez dire, mais ... la complexité logarithmique survient généralement lorsque vous travaillez avec une structure de données étalée comme un arbre binaire équilibré, qui contient 1 nœud à la racine, 2 enfants, 4 petits-enfants, 8 arrière-petits-enfants, etc. Au fond, à chaque niveau, le nombre de nœuds est multiplié par un facteur (2), mais un seul d'entre eux est impliqué dans l'itération. Ou comme un autre exemple, une boucle dans laquelle l'indice double à chaque étape:

for (int i = 1; i < N; i *= 2) { ... } 

Des choses comme ça sont les signatures de complexité logarithmique.

+0

+1 très intéressant. Je cherche quelque chose comme vos exemples plus. Est-ce que l'algorithme logartihmique est: for (int i = BIG_number; i> N; i * = 1/2) {...} –

+1

1/2 est zéro en division entière, mais si vous utilisez "i/= 2" à la place , Oui, ça l'est. (Si c'est l'algorithme particulier que vous vous posez, cela aurait peut-être été une bonne idée de l'inclure dans votre question.) –

5

Master theorem fonctionne habituellement.

+0

Assez difficile à penser, mais très bien une fois que vous maîtrisez. – samoz

14

Pas rigoureux, mais si vous avez un algorithme qui divise essentiellement le travail à faire de moitié à chaque itération, alors vous avez une complexité logarithmique. L'exemple classique est la recherche binaire.

+3

pas nécessairement. Je comprends ce que vous voulez dire mais ce n'est pas parce que vous divisez le travail en deux que vous obtenez une complexité logarithmique, vous pourriez même avoir un temps exponentiel. Vous devez également noter comment les solutions sont recombinées et comment les problèmes divisés sont également résolus. Il y a beaucoup de cas où l'étape de recombinaison domine. Voir Master Theorem ou mieux résoudre la récurrence sans le théorème. Il y a beaucoup de surprises sous une simple récurrence. – unj2

+2

@unjaan: Je pense que vous me comprenez mal. Je n'ai pas seulement dit diviser le travail en deux, j'ai dit "le travail devait être fait de moitié à chaque itération". Ce que je veux dire, c'est que si à chaque étape il reste la moitié du travail à faire par rapport à l'étape précédente, alors vous avez une complexité logarithmique (pour le travail, lire des calculs). –

4

Si vous voulez juste savoir sur Big Oh logarithmique, soyez à l'affût de quand vos données sont coupées dans la moitié de chaque étape de la récurrence. Ceci est dû au fait que si vous traitez des données qui sont 1/2 aussi grandes que l'étape précédente, il s'agit d'une série infinie.

+2

Pas nécessairement 1/2.1/c fonctionne, tant que 'c' est constant. –

+1

mais 1/2 est plus 'intuiative' –

+0

Eh bien habituellement quand on parle de Big O, log signifie base de journal 2. – samoz

3

Voici une autre façon de le dire. Supposons que votre algorithme soit linéaire en nombre de chiffres dans la taille du problème.

Ainsi, vous avez peut-être un nouvel algorithme pour factoriser un grand nombre, que vous pouvez montrer comme étant linéaire dans le nombre de chiffres. Un nombre à 20 chiffres prend ainsi deux fois plus de temps qu'un facteur à 10 chiffres en utilisant votre algorithme. Cela aurait une complexité de log. (Et cela vaut quelque chose pour l'inventeur.)

La sectionnement a le même comportement. Il faut environ 10 étapes de bissection pour réduire la longueur de l'intervalle d'un facteur de 1024 = 2^10, mais seulement 20 pas couperont l'intervalle d'un facteur de 2^20.

La complexité du journal ne signifie pas toujours qu'un algorithme est rapide sur tous les problèmes. Le facteur linéaire devant l'O (log (n)) peut être important. Donc votre algorithme peut être terrible sur de petits problèmes, ne pas devenir utile jusqu'à ce que la taille du problème soit sensiblement grande que d'autres algorithmes meurent d'une mort exponentielle (ou polynomiale).

+0

Bien expliqué avec la taille du gros problème. –

Questions connexes