Когда мы следуем за стандартные учебники, или традиции, большинство из нас учат следующее определение большого Ах обозначений в первые несколько лекций класса алгоритмов:
- .
Однако, так как с этими определениями не так легко работать, когда дело доходит до доказательства даже простых вещей, таких как , большинство из нас быстро двигатьсячтобы ввести «трюк предела»:
- если lim n → ∞ f ( n ) / g ( n ) существует и равен 0 ,
- если lim n → ∞ f ( n ) / g ( n ) существует и не равен + ∞ ,
- если lim n → ∞ f ( n ) / g ( n ) существует и не равен ни 0, ни + ∞ ,
- если lim n → ∞ f ( n ) / g ( n ) существует и не равен 0 ,
- если lim n → ∞ f ( n ) / g ( n ) существует и равен + ∞ .
Мой вопрос:
Будет ли большой потерей обучение класса алгоритмов для студентов принять предельные условия в качестве определений , O , Θ , Ω и ω ? Это то, чем мы все в конечном итоге пользуемся, и мне кажется совершенно ясным, что пропуск определений квантификаторов облегчает жизнь всем.
Мне было бы интересно узнать, не сталкивались ли вы с каким-нибудь убедительным естественным случаем, когда на самом деле требуются стандартные определения , и если нет, то есть ли у вас убедительный аргумент, чтобы сохранить стандартные определения c , n 0 в любом случае.
источник
Ответы:
Я предпочитаю преподавать оригинальное определение с квантификаторами.
ИМО, люди, как правило, испытывают затруднения в понимании формул и определений с более чем двумя чередованием кванторов напрямую Введение новых квантификаторов может прояснить, что означает это определение. Здесь последние два квантификатора просто означают «для всех достаточно больших n», введение такого рода количественной оценки может помочь.
Рисунки, которые я рисую для объяснения этих концепций, лучше соответствуют версиям квантификатора.
Я думаю, что упрощение предела полезно для студентов-инженеров, которые заинтересованы только в вычислении скорости роста, но не будут такими же полезными для студентов-информатиков. Фактически, использование этого упрощения может принести больше вреда, чем пользы.
Эта идея аналогична предложению использовать правила вычисления производных (полиномов, возведения в степень, ..., правила цепочки, ...) вместо определения его эпсилон-дельта, что, по-моему, не очень хорошая идея.
источник
Изменить: Основная редакция в редакции 3.
Поскольку я никогда не преподавал на уроках, я не думаю, что могу что-либо убедительно заявить о том, чему мы должны учить. Тем не менее, вот что я подумал об этом.
Существуют естественные примеры, когда «предельная уловка», как написано, не может быть применена. Например, предположим, что вы реализуете «вектор переменной длины» (например, vector <T> в C ++), используя массив фиксированной длины с удвоением размера (то есть каждый раз, когда вы собираетесь превысить размер массива, вы перераспределить массив в два раза больше, чем сейчас, и скопировать все элементы). Размер S ( n ) массива, когда мы храним n элементов в векторе, является наименьшей степенью 2, большей или равной n . Мы хотим сказать, что S ( n ) = O ( n ), но использование «предельного трюка», как написано в определении, не позволит нам сделать это, потому что S ( n) / n плотно колеблется в диапазоне [1,2). То же самое относится к Ω () и Θ ().
В качестве отдельного вопроса, когда мы используем эти обозначения для описания сложности алгоритма, я думаю, что ваше определение Ω () иногда неудобно (хотя я предполагаю, что это определение является общим). Удобнее определить, что f ( n ) = Ω ( g ( n )) тогда и только тогда, когда limsup f ( n ) / g ( n )> 0. Это связано с тем, что некоторые задачи тривиальны для бесконечного числа значений n ( например, проблема идеальной обработки на графе с нечетным числом n вершин). То же самое относится к Θ () и ω ().
Поэтому лично я считаю, что следующие определения наиболее удобно использовать для описания сложности алгоритма: для функций f , g : ℕ → ℝ > 0 ,
или эквивалентно,
Но я не знаю, является ли это обычной практикой или нет. Также я не знаю, подходит ли оно для обучения. Проблема в том, что мы иногда хотим определить Ω () вместо liminf (как вы делали в первом определении). Например, когда мы говорим «Вероятность ошибки этого рандомизированного алгоритма составляет 2 -Ω ( n ) », мы не имеем в виду, что вероятность ошибки экспоненциально мала только для бесконечного числа n !
источник
Использование лимитов немного сбивает с толку, поскольку (1) это более сложное понятие (2), которое не очень хорошо отражает f = O (g) (как мы можем видеть в обсуждении выше). Я обычно говорю о функциях от натуральных (строго положительных) чисел до натуральных чисел (которых достаточно для времени выполнения), пропускаю мелочи, а затем определение является кратким и подходящим для старшеклассников 1-го курса:
Dfn: f = O (g), если для некоторого C для всех n имеем f (n) <= C * g (n)
источник
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.
источник
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.
источник
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) .
источник
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?
источник
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.
источник