web-dev-qa-db-fra.com

Quel algorithme est plus rapide O(N) ou O (2N)?

À propos des notations Big O, si la complexité temporelle de l’algorithme est O(N) et celle des autres O (2N), laquelle est la plus rapide?

19
deepdive

La définition du grand O est:

O (f (n)) = {g | il existe N et c> 0 tels que g(n) <c * f(n) pour tout n> N}

En anglais, O(f(n)) est l'ensemble des fonctions ayant un taux de croissance éventuel inférieur ou égal à celui de f.

Donc O(n) = O (2n). Ni l'un ni l'autre n'est "plus rapide" que l'autre en termes de complexité asymptotique. Ils représentent les mêmes taux de croissance, à savoir le taux de croissance "linéaire".

Preuve:

O(n) est un sous-ensemble de O (2n): Soit g une fonction dans O (n). Alors il y a N et c> 0 tels que g(n) <c * n pour tout n> N. Donc g(n) <(c/2) * 2n pour tout n> N Ainsi, g est dans O (2n).

O(2n) est un sous-ensemble de O (n): Soit g une fonction de O (2n). Alors il y a N et c> 0 tels que g(n) <c * 2n pour tout n> N. Donc g(n) <2c * n pour tout n> N. Donc g est dans O (n).

Typiquement, quand les gens se réfèrent à une complexité asymptotique ("grand O"), ils se réfèrent aux formes canoniques. Par exemple:

  • logarithmique: O (log n)
  • linéaire: O (n)
  • linearithmique: O (n log n)
  • quadratique: O (n2)
  • exponentielle: O (cn) pour certains c fixe> 1

(Voici une liste plus complète: Tableau des complexités temporelles communes )

Donc, en général, vous écrivez O (n), pas O (2n); O (n log n), pas O (3 n log n + 15 n + 5 log n).

36
Timothy Shields

Le réponse de Timothy Shield est absolument correct, que O(n) et O(2n) se rapportent au même ensemble de fonctions, et ainsi de suite. n'est pas "plus rapide" que l'autre. Il est toutefois important de noter que plus rapide n'est pas un terme génial à appliquer ici.

_ { Article de Wikipedia sur la "notation Big O" utilise le terme "croissance lente", où vous auriez peut-être utilisé "plus rapide", ce qui est préférable. Ces algorithmes sont définis par leur croissance lorsque n augmente.

On pourrait facilement imaginer une fonction O (n ^ 2) plus rapide que O(n), en particulier lorsque n est petit ou si la fonction O(n) nécessite une transformation complexe. La notation indique que pour deux fois plus d'entrées, on peut s'attendre à ce que la fonction O (n ^ 2) prenne environ 4 fois plus longtemps qu'auparavant, où O(n) prendrait environ deux fois plus de temps qu’avant.

5
Jeff Bowman

Théoriquement O(N) et O(2N) sont identiques. 

Mais pratiquement, O(N) aura certainement un temps d'exécution plus court, mais pas significatif. Lorsque N est suffisamment grand, le temps d'exécution des deux sera identique. 

3
Huy Pham

Cela dépend des constantes cachées par la notation asymptotique. Par exemple, un algorithme prenant les étapes 3n + 5 est dans la classe O(n). Donc, un algorithme qui prend 2 + n/1000 étapes. Mais 2n est inférieur à 3n + 5 et supérieur à 2 + n/1000...

C'est un peu comme demander si 5 est inférieur à un nombre non spécifié compris entre 1 et 10. Cela dépend du nombre non spécifié. Le simple fait de savoir qu'un algorithme s'exécute en étapes O(n) n'est pas suffisant pour décider si un algorithme prenant des étapes 2n se terminera plus rapidement ou non.

En fait, c'est même pire que cela: vous demandez si un nombre non spécifié compris entre 1 et 10 est supérieur à un autre nombre non spécifié compris entre 1 et 10. Les ensembles que vous choisissez parmi les mêmes ne signifient pas les numéros que vous choisissez sera égal! O(n) et O(2n) sont des ensembles d’algorithmes, et comme la définition de Big-O annule les facteurs multiplicatifs, ils constituent le même ensemble. Les membres individuels des ensembles peuvent être plus rapides ou plus lents que les autres membres, mais les ensembles sont les mêmes.

1
Craig Gidney