web-dev-qa-db-fra.com

Est O (journal n) + O (journal n) = O (n)?

Nous savons que la recherche binaire prend O (log n) dans la grosse notation, mais si nous devons exécuter deux fois un algorithme de O (log n), C'est la même chose que O (n) complexité de temps?

Par exemple, si j'ai une méthode pour calculer la première occurrence d'un nombre dans une matrice triée avec des doublons et une autre méthode pour calculer la dernière occurrence. Chacune des deux méthodes prend O (log n) Pour exécuter, donc à la fin si je veux connaître le nombre d'occurrences d'un nombre spécifique dans la matrice en utilisant les deux méthodes que j'aurais un = O (2 log n), non? Peut-on déduire que O (2 log n) est égal à O (n) ou moins?

5
Walter R

Non, O(log n) + O(log n) n'est pas O(n). C'est toujours O(log n). Lorsque nous avons une formule Big-O multipliée par une constante, c'est équivalent à la valeur sans la constante multipliée . Donc:

O(k * g) = O(g)

k est un facteur constant, non nul et g est une fonction de sélection.

Une opération O(log n) Une opération est une opération qui prend un certain nombre d'étapes proportionnelles au logarithme (la base contribue simplement à un facteur constant) de la taille de l'entrée, indiquée par n. Lorsque vous avez plusieurs opérations de la même commande Big-O, vous pouvez les ajouter ensemble comme vous l'avez fait et sortez avec quelque chose comme O(2 * log n), mais la notation Big-O n'est pas concernée par des facteurs multiplicatifs constants, Nous ignorons donc les 2 et écrire O(log n).

La raison pour laquelle nous ne sommes pas concernés de facteurs constants* Est-ce que nous examinons le potentiel de croissance d'un algorithme basé sur la taille de l'intrant. Nous ne l'utilisons pas pour calculer le nombre exact d'étapes, juste pour voir comment le nombre d'étapes pourrait augmenter.

Regardons des chiffres réels pour nous donner un exemple moins abstraite mathématiquement. Nous avons un algorithme qui fonctionne dans O(log n) temps et prend exactement journal2(N) étapes. Nous avons une méthode où nous l'exécutons une fois avec une entrée de taille 8. Il faut 3 étapes à compléter. Nous avons une autre méthode où nous l'exécutons deux fois, il faut donc 6 étapes pour compléter. Ce n'est pas la comparaison que nous nous soucions, cependant. Nous voulons savoir sur le croissance. Nous exécutons à nouveau la première méthode avec une taille d'entrée de 16. Il faut 4 étapes pour compléter, + 33% de plusieurs étapes. Nous exécutons la deuxième méthode avec une taille d'entrée de 16. Il faut 8 étapes pour terminer également + 33% d'autres étapes . Nous pouvons voir que, bien que le nombre d'étapes soit différent, la croissance est la même entre les fonctions. Le taux de croissance est O(log n) Malgré combien de fois cela s'appelle, et c'est Le taux de croissance que nous sommes intéressés.


* Nous ne sommes pas non plus concernés par des pièces de fonction de liaison de la croissance inférieure, alors O(n + log n) est équivalente à O(n).

14
cbojar

O (journal n) et O (2 log n) sont des sous-ensembles de O (n). Ils sont également égaux à O (log n).

Vous devez vous rappeler que O (log n) est un SET, il est (de manière informelle) "" l'ensemble de toutes les fonctions qui ne poussent pas de manière significative plus rapide que f(x) = Journal x ". Donc, toutes les suivantes sont vraies

  • O(log n) = O(2 log n)
  • O(log n) ⊂ O(n)
  • O(2 log n) ⊂ O(n)
  • ∀F: F ∈ O (2 log n) ⇒ F ∈ O (N)

Vous pouvez facilement vérifier cela en branchant les fonctions dans la définition de O (g).

Malheureusement, il y a beaucoup d'abus de notation à cet égard. Par exemple, f ∈ O(g) est souvent écrit f = o (g), même s'il n'a pas de sens: F est une fonction, O(g) est un ensemble de fonctions. Un Apple ne peut jamais être égal à un ensemble de pommes! De même, il est souvent écrit que O(f) = O (g), lorsque ce qui est vraiment signifié est que O(f) ⊂ O (g). Et enfin, les gens prétendent parfois que f(n) = 2n est un élément de O(n) mais non de O (n²), ce qui est faux. O(n) est un sous-ensemble de O (n²), donc toute fonction qui est dans O(n) est également dans O (n²).

5
Jörg W Mittag

Pour les grandes valeurs de N, les constantes sont ignorées dans la notation Big O.

D'où

O(log n)+O(log n)=O(2log n)->O(log n)

0
Temp Id