Якому визначенню швидкості росту асимптотики ми повинні навчатись?


35

Коли ми дотримуємось стандартних підручників, або традицій, більшість з нас навчають наступному визначенню великої-О нотації в перших кількох лекціях класу алгоритмів: Можливо, ми навіть подаємо весь список з усіма його кількісними показниками:

f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n)).
  1. f=o(g) iff (c>0)(n00)(nn0)(f(n)cg(n))
  2. f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n))
  3. f=Θ(g) iff (c>0)(d>0)(n00)(nn0)(dg(n)f(n)cg(n))
  4. f=Ω(g) iff (d>0)(n00)(nn0)(f(n)dg(n))
  5. f=ω(g) iff (d>0)(n00)(nn0)(f(n)dg(n)) .

Однак, оскільки з цими визначеннями не так просто працювати, якщо мова йде про доведення навіть простих речей, таких як , більшість із нас швидко рухаються до введення "фокусу межі":5nlog4n+nlogn=o(n10/9)

  1. f=o(g) якщо існує і дорівнює 0 ,0limnf(n)/g(n)0
  2. f=O(g) якщо limnf(n)/g(n) існує, а не + ,
  3. f=Θ(g) якщо limnf(n)/g(n) існує і не є ні 0 ні + ,
  4. f=Ω(g) якщо limnf(n)/g(n) існує і не дорівнює 0 ,
  5. f=ω(g) якщо limnf(n)/g(n) існує і дорівнює + .

Моє запитання:

Чи буде це велика втрата для навчання класу бакалаврату алгоритмів прийняти граничні умови , як у визначеннях o , O , Θ , Ω і ω ? Це все, що ми все-таки використовуємо, і мені здається досить зрозумілим, що пропуск визначення кількісних показників полегшує життя кожного.

Мені було б цікаво дізнатись, чи стикалися ви з переконливим природним випадком, коли стандартні визначення -визначення фактично потрібні, а якщо ні, чи є у вас переконливий аргумент, щоб уникнути стандартного -definitions все одно. c , n 0c,n0c,n0


1
Тег дійсно повинен бути "викладанням", але я не зміг знайти жодного пов'язаного тегу, і мені не дозволяється створювати нові теги.
slimton

1
Це в основному поглинає квантори у визначенні меж epsilon-delta. Мене хвилює лише те, що багато студентів з КС не брали аналіз, тому їх розуміння меж переважно механічне. Однак, щоб вони могли швидко обчислити, це не потрібно.
Per Vognsen

6
Зауважте, що ваші два визначення O () не є еквівалентними (однаковий застереження стосується Θ () та Ω ()). Розглянемо випадок, коли f (n) = 2n для парних n і f (n) = 1 для непарних n. Чи f (n) = O (n)? Я вважаю за краще використовувати limsup замість lim, щоб я міг сказати f (n) = Θ (n) в цьому випадку (хоча жодне з ваших визначень цього не дозволяє). Але це може бути мої особисті переваги (і навіть нестандартна практика), і я ніколи не викладав заняття.
Цуйосі Іто,

2
@Tsuyoshi: Я вважав, що суть "граничного фокусу" полягає в тому, що це є достатньою, але не потрібною умовою для . (Для також необхідно.) Контралююча функція контрприкладу не має межі. o ( )O()o()
Андрас Саламон

1
Чи не слід замінювати символ на у кожному визначенні та властивості? Я вважав використання дуже тривожним як студент. ===
Джеремі

Відповіді:


13

Я вважаю за краще викладати початкове визначення за допомогою кванторів.

ІМО, люди, як правило, мають труднощі в розумінні формул та визначень з більш ніж двома чергуваннями кількісних показників безпосередньо. Введення нових кількісних показників дозволяє уточнити, що означає визначення. Тут останні два квантори просто означають "для всіх достатньо великих n", введення такого квантування може допомогти.

Малюнки, які я малюю для пояснення цих понять, краще відповідають версіям кількісних показників.

Я думаю, що спрощення меж корисне для студентів-інженерів, які зацікавлені лише в обчисленні темпів зростання, але не будуть такими ж корисними для студентів інформатики. Насправді використання цього спрощення може принести більше шкоди, ніж користі.

Ця ідея схожа на те, що ми використовуємо правила для обчислення похідних (многочленів, експоненціації, ..., правила ланцюга, ...) замість цього визначення епсілон-дельта, що ІМХО не є хорошою ідеєю.


є також поняття домінування: iff . Тепер iff є st . \ esits m n > m f ( n ) < g ( n ) f O ( g ) c > 0 f ( x ) c g ( x )f(x)g(x)\esitsmn>mf(n)<g(n)fO(g)c>0f(x)cg(x)
Каве

9

Правка: Основна редакція в редакції 3.

Оскільки я ніколи не викладав класу, я не думаю, що можу щось переконливо заявити про те, чого ми повинні навчати. Тим не менш, ось що я подумав про це.

Є природні приклади, коли «обмежувальний трюк», як написано, неможливо застосувати. Наприклад, припустимо, що ви реалізуєте "вектор змінної довжини" (наприклад, вектор <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 ,

  • f ( n ) = o ( g ( n )) тоді і лише тоді, коли limsup f ( n ) / g ( n ) = 0. (Це еквівалентно lim f ( n ) / g ( n ) = 0.)
  • f ( n ) = O ( g ( n )) тоді і тільки тоді, коли limsup f ( n ) / g ( n ) <∞.
  • f ( n ) = Θ ( g ( n )) тоді і тільки тоді, коли 0 <limsup f ( n ) / g ( n ) <∞.
  • f ( n ) = Ω ( g ( n )) тоді і тільки тоді, коли limsup f ( n ) / g ( n )> 0. (Це еквівалентно тому, що f ( n ) не є o ( g ( n )).)
  • f ( n ) = ω ( g ( n )) тоді і тільки тоді, коли limsup f ( n ) / g ( n ) = ∞. (Це еквівалентно тому, що f ( n ) не є O ( g ( n )).)

або рівнозначно,

  • f ( n ) = o ( g ( n )) тоді і тільки тоді, коли для кожного c > 0, для досить великого n , f ( n ) ≤ cg ( n ).
  • f ( n ) = O ( g ( n )) тоді і тільки тоді, коли для деякого c > 0, для досить великих n , f ( n ) ≤ cg ( n ).
  • f ( n ) = Θ ( g ( n )) тоді і тільки тоді, коли f ( n ) = O ( g ( n )) і f ( n ) = Ω ( g ( n )).
  • f ( n ) = Ω ( g ( n )) тоді і лише тоді, коли для деякого d > 0, для нескінченно багатьох n , f ( n ) ≥ dg ( n ).
  • f ( n ) = ω ( g ( n )) тоді і тільки тоді, коли для кожного d > 0, для нескінченно багатьох n , f ( n ) ≥ dg ( n ).

Але я не знаю, звичайна це практика чи ні. Також не знаю, чи підходить вона для викладання. Проблема полягає в тому, що ми іноді хочемо натомість визначити Ω () liminf (як ви це робили в першому визначенні). Наприклад, коли ми говоримо «Імовірність помилки цього рандомізованого алгоритму дорівнює 2 Ω ( n ) », ми не маємо на увазі, що ймовірність помилки експоненціально мала лише для нескінченно багатьох n !


Я також використовую визначення limsup, але для студентів, які не бачили limsup (майже всіх), я все одно повинен розширюватися на явні кількісні показники.
Jeffε

@JeffE: Я погоджуюся, що більшість студентів не бачили limsup, тому якщо ми використовуємо визначення limsup, нам доведеться використовувати квантори замість цього класу.
Цуйосі Іто,

2
Проблема версій кванторів полягає в тому, що їх важко запам’ятати та візуалізувати. Я віддаю перевагу оскільки його можна охарактеризувати як "найвищу граничну точку". Можливе пояснення: "Це як , за винятком того, що працює лише тоді, коли послідовність конвергується. Якщо послідовність не конвергується, наприклад, тому що алгоритм коливається між дуже швидкими для деяких і повільними для інших , тоді ми беремо найвища гранична точка ". l i m l i m n nlimsuplimlimnn
Генріх Апфельмус

Насправді, чи існують природні приклади алгоритмів, коли час роботи коливається?
Генріх Апфельмус

2
@Heinrich: Я вже згадував час роботи алгоритму, щоб знайти ідеальну відповідність графіка на n вершинах, але чи вважається це природним прикладом? Я додав ще один приклад, коли час роботи не коливається, а f (n) / g (n) коливається. Приклад говорить про складність простору, але часова складність того ж прикладу має однакову властивість.
Цуйосі Іто,

8

Використання обмежень трохи заплутано, оскільки (1) його складніше поняття (2) воно не фіксує f = O (g) добре (як ми бачимо в обговоренні вище). Зазвичай я розмовляю про функції від натуральних (суворо позитивних) чисел до натуральних чисел (що достатньо для робочого часу), пропускаю мало-про речі, і тоді визначення є стислим і підходить для студентів нижчого класу першого курсу:

Dfn: f = O (g), якщо для деякого C для всіх n маємо, що f (n) <= C * g (n)


1
По-перше, це визначення мені не сподобалося, оскільки викладення "всіх n" затьмарює важливий факт, що нотація O () дбає лише про поведінку функцій для великих n. Однак, незалежно від того, яке визначення ми обираємо, я гадаю, що нам слід пояснити цей факт разом із визначенням. Якщо подумати про це, викласти це просте визначення здається досить непоганим.
Цуйосі Іто,

n g ( n ) = 0 n N 0f(n)=nng(n)=0nN0g(n)=f(n)+1f=O(g)

2
Сенс розмови про функції, діапазон яких - натуральні числа (не враховуючи 0), якраз не повинен потрапляти в проблеми з g (n) = 0.
Noam

1
len(a)loga

1
alen(a)logalen(a)aOlog, які зникають або не визначені на деякому вході. "
Srivatsan Narayanan

5

c,n0

f

fO(g):⇔c,d>0n0:f(n)cg(n)+dd=f(n0)

Матеріал з обмеженнями досить корисний для обчислення класів складності, тобто з ручкою та папером.

У будь-якому випадку, я думаю, що студентам дуже корисно дізнатися, що існує безліч (сподіваємось) еквівалентних визначень. Вони повинні мати можливість усвідомити це та вибирати відмінності у разі нееквівалентних визначень.


4

Вивчивши ці концепції лише кілька років тому, вони не були найскладнішими для мого класу (на відміну від таких понять, як індукція чи протипозитивність). Обмеження та обмеження є лише більш "інтуїтивними" для тих, хто знайомий з численням, на мою думку. Але студенти з таким математичним обгрунтуванням так чи інакше матимуть теоретико-теоретичну основу, щоб вони могли обробляти дискретні класифікатори.

Крім того, що ще важливіше, пам’ятайте, що в кінцевому підсумку ваші студенти продовжать (сподіваємось), щодня читатимуть інші підручники з теорії циркуляції, а можливо, навіть наукові роботи. Таким чином, їм краще бути комфортними зі стандартними позначеннями на місцях, навіть якщо це не було ідеально задумано спочатку. Не даючи шкоди і даючи їм альтернативні визначення, коли вони засвоїли стандартні.


3

Щоб цікаво взятись до цього питання, подивіться чудово написаний лист Дон Кнута "Обчислення через нотацію O" . Він виступає за зворотну точку зору, що обчислення слід викладати через позначення "A", "O" та "o".

xAyx=A(y)|x|y100A(200)


1
  1. Визначення Цуйосі Іто виглядають не зовсім правильно. Для малоомега та великої омеги визначення слід використовувати liminf, а не limsup. Визначення big-theta потребує як нижньої межі на liminf, так і верхньої межі на limsup.

  2. Одне визначення f (n) = O (g (n)) полягає в тому, що існує інша функція f '(n)> = f (n) така, що lim f' (n) / g (n) <нескінченність.

  3. Чому новачкам дозволено публікувати відповіді, але не коментувати?


1
Щодо пункту 1, я маю на увазі обмеження у всіх випадках, а причина пояснюється у другому абзаці моєї відповіді.
Цуйосі Іто,

на жаль, це механізм блокування спаму.
Суреш Венкат

Так, ви можете використовувати латекс у своїх відповідях.
Суреш Венкат

1

По-перше , я намагаюся розвинути в учнів якусь інтуїцію , перш ніж показувати рівняння.

  • "Злиття сортування проти сортування вставки" є хорошою відправною точкою.

f=O(g) iff (c>0)(n00)(nn0)(f(n)cg(n)).
limn

Інший аспект полягає в тому, що він сильно залежить від конкретної програми навчання. IMHO залежно від попередніх предметів одне із визначень буде більш підходящим - тоді як IMHO все ще є гарною ідеєю показати обидва типи та прийняти рішення обох типів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.