Grande notation O imbriquée

8

Disons que j'ai un graphique |G| avec |E|=O(V2)bords. Je veux exécuter BFS surg qui a une durée de O(V+E).

Il semble naturel d'écrire que le temps d'exécution sur ce graphique serait O(O(V2)+V) puis simplifier pour O(V2).

Y a-t-il des pièges à utiliser un tel raccourci "supprimer-le-nested-O" (pas seulement dans ce cas, mais plus généralement)?

Le chat unfun
la source
4
Si vous travaillez sur la définition de big-O, vous verrez que les Os imbriqués sont à la fois naturels et redondants, et que la règle de suppression du O interne est correcte.
Dave Clarke
Comme V est dans O (V ^ 2), je suppose que vous pourriez remplacer O (V ^ 2) par V si vous ne saviez pas ce que vous faisiez?
The Unfun Cat
3
Si vous ne savez pas ce que vous faites, vous pouvez faire des choses arbitrairement mauvaises.
Dave Clarke
4
En effet. = n'est pas = en terre big-O.
Dave Clarke
3
Voir aussi cette excellente question sur math.SE about = en notation Landau.
Raphael

Réponses:

14

Permettez-moi de commencer par une recommandation: traiter la notation Landau comme vous (devriez) traiter l'arrondi: arrondir rarement, arrondir tard. Si vous savez quelque chose de plus précis queO(.), utilisez-le jusqu'à ce que vous ayez terminé tous les calculs, et Landauify à la fin.


Quant à la question, creusons cet abus de notation¹. Comment interpréterions-nous quelque chose commehO(f+O(g))? Nous devons remplacerOavec sa définition de l'intérieur. Donc, nous obtenons

gO(g).hO(f+g)

et alors

gO(g).d>0.n.h(n)d(f(n)+g(n))

ce qui équivaut à

c>0.d>0.n.h(n)d(f(n)+cg(n)).

Comme certainement² d(f(n)+cg(n))cd(f(n)+g(n)), nous voyons que cela équivaut à hO(f+g); la perte de précision est ignorée parO en tous cas.


Qu'en est-il des autres combinaisons, disons hO(f+Ω(g))? Si nous essayons la même chose ici, nous obtenons

gΩ(g).hO(f+g).

Mais c'est une tautologie: hest certainement délimité au-dessus par quelque chose d’arbitrairement grand. Donc, combiner les limites supérieures et inférieures de cette manière n'a pas de sens.


  1. O(.)et les autres symboles Landau mappent les fonctions aux classes de fonctions. Le nourrir d'une classe de fonction n'est pas immédiatement significatif.
  2. Du moins si nous considérons uniquement les fonctions positives, que nous pouvons assumer en toute sécurité lorsque nous parlons de temps d'exécution. Je ne suis pas sûr que cela fonctionne en général.
Raphael
la source
2

Je voulais juste ajouter ceci parce que je l'ai rencontré récemment. Bien que ce raccourci soit parfait avec l'addition et la multiplication (lorsqu'il ne mélange pasO avec Ω; voir la réponse acceptée), des précautions doivent être prises lors de l'utilisation d'exposants. Par exemple:

O(nO(m))O(nm).
Dans cet exemple, n2m appartient à la première classe mais pas à la seconde.
jadhachem
la source
1

Par définition, O(g) est un ensemble et si vous utilisez cette notation imbriquée, vous auriez un ensemble dans un ensemble, ce qui serait faux.

La définition de la notation O

O(g)={f|c>0x0>0x>x0:|f(x)|c|g(x)|}

L'erreur

Vous avez utilisé des termes comme O(O(n)+k) où k et n sont des fonctions et O(n)est un ensemble. Mais quel est le résultat d'une fonction ajoutée à un ensemble? Ce n'est pas défini!

Version correcte

Au lieu d'utiliser les symboles Landau imbriqués, vous pouvez effectuer les opérations suivantes: O(m+k),mO(n)

Odin
la source
2
Oui, mais la notation Landau est souvent utilisée à mauvais escient dans un souci de facilité d'utilisation (supposée), nous devons donc nous assurer que tout le monde comprend la même chose. Voir ici pour une approche structurée.
Raphael
0

Dans la section 9.3 "OManipulation "du livre Concrete Mathematics (Second Edition), Knuth a énuméré quelques règles de manipulation sur leO-notation (Dans ce qui suit, je suppose que les deux F(n) et g(n)sont positifs; notez que l'ordre des règles a été modifié).

(1).nm=O(nm),mm(3).f(n)=O(f(n))(5).O(O(f(n)))=O(f(n))(4).cO(f(n))=O(f(n))(2).O(f(n))+O(g(n))=O(f(n)+g(n))(6).O(f(n))O(g(n))=O(f(n)g(n))=f(n)O(g(n))

By (3), you can wrap/unwrap a function f(n) with an O-notation. Then by (5), you can actually wrap/unwrap (or called, nest) it arbitrarily finite times. Using (4), you can also add/remove constant multiplication factors to/from O.

Then, (2) and (6) allow you to manipulate nested O-notations in the way compatible with + and ×.

hengxin
la source