Quand nous suivons les manuels standard, ou la tradition, la plupart d' entre nous enseignent la définition suivante de la notation grand-Oh dans les premières conférences d'une classe d'algorithmes:
- .
Cependant, étant donné que ces définitions ne sont pas faciles à utiliser pour prouver des choses simples, telles que ,plupart d'nous déplacer rapidement pour introduire le "truc de la limite":
- si lim n → ∞ f ( n ) / g ( n ) existe et vaut 0 ,
- si lim n → ∞ f ( n ) / g ( n ) existe et n'a pas de + ∞ ,
- si lim n → ∞ f ( n ) / g ( n ) existe et est ni 0 ni + ∞ ,
- si lim n → ∞ f ( n ) / g ( n ) existe et est pas 0 ,
- si lim n → ∞ f ( n ) / g ( n ) existe et est + ∞ .
Ma question est:
Serait - ce une grande perte pour l' enseignement d' une classe d'algorithmes de premier cycle à prendre les conditions limites que les définitions de , O , thetav , Ohm et co ? En tout cas, c’est ce que nous finissons tous par utiliser et il me semble assez clair que l’omission des définitions de quantificateur facilite la vie de tout le monde.
Je serais intéressé de savoir si vous avez rencontré un cas naturel convaincant où les définitions standard sont réellement requises et, dans le cas contraire, si vous avez un argument convaincant pour garder les définitions c , n 0 standard de toute façon.
la source
Réponses:
Je préfère enseigner la définition originale avec des quantificateurs.
OMI, les humains ont généralement du mal à comprendre les formules et les définitions avec plus de deux alternances de quantificateurs directement. L'introduction de nouveaux quantificateurs peut clarifier le sens de la définition. Ici, les deux derniers quantificateurs signifient simplement "pour tout n suffisamment grand", l'introduction de ce type de quantification peut aider.
Les images que je dessine pour expliquer ces concepts correspondent mieux aux versions des quantificateurs.
Je pense que la simplification des limites est utile pour les étudiants en ingénierie qui ne sont intéressés que par le calcul du taux de croissance, mais ne sera pas aussi utile pour les étudiants en informatique. En fait, utiliser cette simplification peut causer plus de tort que de bien.
Cette idée est similaire à la suggestion d'utiliser les règles de calcul des dérivées (polynômes, exponentiation, ..., règle de chaîne, ...) à la place de la définition epsilon-delta de ce principe, qui n'est pas une bonne idée.
la source
Edit: révision majeure dans la révision 3.
Comme je n’ai jamais enseigné de cours, je ne pense pas pouvoir affirmer ce que nous devrions enseigner de manière convaincante. Néanmoins, voici ce que j'ai pensé à ce sujet.
Il existe des exemples naturels dans lesquels «l’astuce limite» telle qu’elle est écrite ne peut être appliquée. Par exemple, supposons que vous implémentiez un "vecteur de longueur variable" (comme le vecteur <T> en C ++) en utilisant un tableau de longueur fixe doublant la taille (en d'autres termes, chaque fois que vous êtes sur le point de dépasser la taille du tableau, vous réallouez le tableau deux fois plus grand que maintenant et copiez tous les éléments). La taille S ( n ) du tableau lorsque nous stockons n éléments dans le vecteur est la plus petite puissance de 2 supérieure ou égale à n . Nous voulons dire que S ( n ) = O ( n ), mais l’utilisation de «l’astuce limite» telle qu’elle est écrite dans la définition ne nous permettrait pas de le faire car S ( n) / n oscille de manière dense dans la plage [1,2). La même chose s'applique à Ω () et à ().
De manière assez distincte, lorsque nous utilisons ces notations pour décrire la complexité d’un algorithme, je pense que votre définition de Ω () est parfois gênante (bien que je suppose que cette définition soit commune). Il est plus pratique de définir que f ( n ) = Ω ( g ( n )) si et seulement si limsup f ( n ) / g ( n )> 0. C’est parce que certains problèmes sont triviaux pour une infinité de valeurs de n ( comme le problème d’usinage parfait sur un graphique avec un nombre impair n de sommets). La même chose s'applique à Θ () et à ().
Par conséquent, j'estime personnellement que les définitions suivantes sont les plus pratiques à utiliser pour décrire la complexité d'un algorithme: pour les fonctions f , g : → > 0 ,
ou équivalent,
Mais je ne sais pas s'il s'agit d'une pratique courante ou non. Aussi, je ne sais pas si cela convient à l'enseignement. Le problème est que nous voulons parfois définir Ω () avec liminf à la place (comme vous l'avez fait dans la première définition). Par exemple, lorsque nous disons «La probabilité d'erreur de cet algorithme randomisé est 2 Ω ( n ) », nous ne voulons pas dire que la probabilité d'erreur est petite de façon exponentielle simplement pour une infinité de n !
la source
Using limits is a bit confusing since (1) its a more complicated notion (2) it doesn't capture f=O(g) nicely (as we can see in the discussion above). I usually talk about functions from the Natural (strictly positive) numbers to the Natural numbers (which suffices for running times), skip the little-o stuff, and then the definition is concise and appropriate for 1st year undergrads:
Dfn: f=O(g) if for some C for all n we have that f(n)<=C*g(n)
la source
When I took basic courses, we were given the∃c,n0… thing as definition and the other stuff as theorem.
I think the first one is more natural for many people that think discrete rather than continuous, that is most computer scientists (in my experience). It also fits the way we usually talk about those things better: "There is a polynomial function of degree 3 that is an upper bound for thisf up to a constant factor."
Edit: You can get even closer to this way of speaking if you use this definition:f∈O(g):⇔∃c,d>0∀n≥0:f(n)≤c⋅g(n)+d
(Note that d=f(n0) connects this definition with the one usually given)
The limit stuff is pretty useful for calculating complexity classes, that is with pen and paper.
In any case, I think it is very useful for students to learn that there is a wealth of (hopefully) equivalent definitions. They should be able to realize that and pick out differences in case of nonequivalent definitions.
la source
Having studied these concepts only a few years ago, they were not the hardest ones to grasp for my class (as opposed to concepts like induction, or contra positives). Limits and limsups are only more "intuitive" for those familiar with calculus in my opinion. But students with such a math grounding will have set-theoretic background anyway, so that they can process discrete qualifiers.
Also, more importantly, remember that ultimately your students will go on (hopefully) to read other cs theory textbooks, and perhaps even research papers one day. As such, it is better for them to be comfortable with standard notation in the field, even if it was not ideally conceived initially. There is no harm giving them alternate definitions as well, once they've assimilated the standard ones.
la source
For an interesting take on the issue, look at Don Knuth's nicely written letter "Calculus via O notation". He advocates the reverse view that calculus should be taught via the 'A', 'O' and 'o' notations.
Note: He uses the "A" notation as a preliminary step in defining the standard "O" notation. A quantityx is A of y (i.e., x=A(y) ), if |x|≤y . In particular, it makes sense to say 100 is A(200) .
la source
Tsuyoshi Ito's definitions don't look quite right. For little-omega and big-omega the definitions should use liminf, not limsup. The definition of big-theta needs both a lower-bound on liminf and an upper-bound on limsup.
One definition of f(n)=O(g(n)) is that there exists another function f'(n) >= f(n) such that lim f'(n)/g(n) < infinity.
Why are newbies allowed to post answers but not make comments?
la source
First, I try to develop in students some intuition, before showing equations.
Then, later... I try to show both ways. Students, that relies more on intuition prefer
Another aspect is that, it heavily depends on concrete studies' program. IMHO depending on previous subjects one of definitions will be more suitable - while IMHO still it is good idea to show both and accept both types of solutions.
la source