Як можна знати, які позначення аналізу складності часу використовувати?


90

У більшості вступних класів алгоритму вводяться позначення типу (Big O) та , і студент, як правило, навчиться використовувати один із них, щоб знайти складність у часі.ΘOΘ

Однак є й інші позначення, такі як , та . Чи є конкретні сценарії, коли одна нотація була б кращою для іншої?Ω ωoΩω


2
його не настільки бажано, як застосовано ...
vzn

Відповіді:


76

Ви посилаєтесь на позначення Ландау . Вони не є різними символами для однієї речі, але мають абсолютно різні значення. Який із них є "кращим", повністю залежить від бажаного твердження.

f g f o ( g ) <fO(g) означає, що росте максимум так само швидко, як , асимптотично і до постійного коефіцієнта; думайте про це як . - суворіша форма, тобто .fgfo(g)<

f g ω f Ω ( g ) g O ( f )fΩ(g) має симетричне значення: росте як мінімум так само швидко, як . - її суворіший кузен. Ви можете бачити, що еквівалентно .fgωfΩ(g)gO(f)

f g f O ( g ) Ω ( g ) f g Θ OfΘ(g) означає, що росте приблизно так само швидко, як ; формально . (асимптотична рівність) - це його сильніша форма. Ми часто маємо на увазі коли використовуємо .fgfO(g)Ω(g)fgΘO

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

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

Пропоноване читання:

Якщо ви зацікавлені в використанні нотацій Ландау в суворій та обґрунтованій формі, вас можуть зацікавити останні роботи Рутанен та ін. [1]. Вони формулюють необхідні та достатні критерії для асимптотичних позначень, оскільки ми використовуємо їх в алгоритмі, показують, що загальне визначення не відповідає їм і надає (фактично) працездатне визначення.


  1. Загальне визначення O-позначення для аналізу алгоритму К. Рутанен та ін. (2015 р.)

5
Я просто хочу зазначити, що хоча діє як а діє як , існують відмінності; не важко знайти функції і такі, що і . Ω g f f O ( g ) f Ω ( g )OΩgffO(g)fΩ(g)
Зак Ленглі

1
+1 для згадки про класи функцій. Такі речі, як і з'являються скрізь у паперах і книгах, що може бентежити людей, які стикаються з цими позначеннями вперше. Ω ( 2 n )o(1)Ω(2n)
Янома

7
@ZachLangley Те, що ви говорите, дуже правдиве. Тут немає загального замовлення. Мабуть, небезпечно виховувати взагалі, але я думаю, що це служить меті розбудови інтуїції.
Рафаель

42

Великий О: верхня межа

"Великий O" ( ) - на сьогоднішній день найпоширеніший. Коли ви аналізуєте складність алгоритму, більшість часу важливо мати деяку верхню межу щодо того, наскільки швидко час виконання¹ зростає, коли збільшується розмір вводу. В основному ми хочемо знати, що запуск алгоритму не займе «занадто довго». Ми не можемо це виразити у фактичних одиницях часу (секундах), оскільки це залежатиме від точної реалізації (те, як написана програма, наскільки хороший компілятор, наскільки швидкий процесор машини,…). Тож ми оцінюємо, що не залежить від таких деталей, а це - скільки часу потрібно, щоб запустити алгоритм, коли ми подаємо його на більшу суму. І нас головним чином хвилює, коли ми можемо бути впевнені, що програма виконана, тому зазвичай ми хочемо знати, що це займе таку-то таку кількість часу чи менше.O

Сказати, що алгоритм має час виконання для вхідного розміру означає, що існує деяка константа така, що алгоритм виконує щонайбільше кроків, тобто час виконання алгоритму росте максимум настільки ж швидко, як і (до коефіцієнта масштабування). Відзначаючи час виконання алгоритму для розміру вводу , неофіційно означає, що до деякого коефіцієнта масштабування.n K KO(f(n))nKf T ( n ) n O ( n ) T ( n ) f ( n )Kf(n)fT(n)nO(n)T(n)f(n)

Нижня межа

Іноді корисно мати більше інформації, ніж верхня межа. - це зворотне значення : воно виражає, що функція зростає принаймні так само швидко, як і інша. означає, що для деякої постійної , або неофіційно, вгору до деякого коефіцієнта масштабування.ΩOT(n)=Ω(g(n))T(N)Kg(n)KT(n)g(n)

Коли час роботи алгоритму можна точно визначити, поєднує в собі і : він виражає, що швидкість зростання функції відома, аж до коефіцієнта масштабування. означає, що для деяких констант і . Неформально кажучи, до деякого коефіцієнта масштабування.ΘOΩT(n)=Θ(h(n))Kh(n)T(n)Kh(n)KKT(n)h(n)

Подальші міркування

Значення "мало" і використовується набагато рідше в аналізі складності. Маленький сильніший за великий ; де позначає зростання, який не швидше, вказує на те, що ріст суворо повільніше. І навпаки, вказує на строго швидший ріст.oωoOOoω

Я був дещо неофіційним у дискусії вище. У Вікіпедії є формальні визначення та більш математичний підхід.

Майте на увазі, що використання знака рівності в і тому подібне є помилковим. Строго кажучи, - це сукупність функцій змінної , і нам слід записати .T(n)=O(f(n))O(f(n))nTO(f)

Приклад: деякі алгоритми сортування

Оскільки це досить сухо, дозвольте навести приклад. Більшість алгоритмів сортування мають квадратичний найгірший час виконання, тобто для введення розміру час роботи алгоритму становить . Наприклад, сортування вибору має час виконання , тому що для вибору го елемента потрібні порівняння, для загальної кількості порівнянь. Насправді кількість порівнянь завжди рівно , яка зростає як . Тож ми можемо бути більш точними щодо часової складності вибору: це .nO(n2)O(n2)knkn(n1)/2n(n1)/2n2Θ(n2)

Тепер візьміть сортування злиття . Сортування сортування також квадратичне ( ). Це правда, але не дуже точно. Сортування сортування насправді має час роботи в гіршому випадку. Як і сортування вибору, робочий потік сортування об'єднань по суті не залежить від форми вводу, і його час роботи завжди аж до постійного мультиплікативного коефіцієнта, тобто це .O(n2)O(nlg(n))nlg(n)Θ(nlg(n))

Далі розглянемо кікспорт . Кікспорт складніший. Це, звичайно, . Крім того, найгірший випадок кваксорбу - квадратичний: найгірший випадок - . Однак найкращий випадок швидкості сортування (коли вхід вже відсортований) лінійний: найкраще, що ми можемо сказати для нижньої межі до кваксорбу в цілому, є . Я не повторюю доказ тут, але середня складність швидкості (середня сума, взята за всі можливі перестановки введення) - .O(n2)Θ(n2)Ω(n)Θ(nlg(n))

Є загальні результати щодо складності алгоритмів сортування в загальних налаштуваннях. Припустимо, що алгоритм сортування може порівнювати лише два елементи одночасно з результатом «так-ні» (або або ). Тоді очевидно, що час роботи будь-якого алгоритму сортування завжди є (де - кількість елементів для сортування), оскільки алгоритм повинен хоча б раз порівняти кожен елемент, щоб знати, куди він поміститься. Цю нижню межу можна виконати, наприклад, якщо вхід вже відсортований і алгоритм просто порівнює кожен елемент із наступним та підтримує їх у порядку (це порівняння). Менш очевидно, що максимальний час роботи обов'язковоxyx>yΩ(n)nn1Ω(nlg(n)) . Можливо, що алгоритм іноді буде робити менше порівнянь, але має бути деяка константа така, що для будь-якого розміру вводу існує принаймні один вхід, на якому алгоритм робить більше порівняння. Ідея доказу - побудувати дерево рішень алгоритму, тобто дотримуватися рішень, які алгоритм приймає за результатами кожного порівняння. Оскільки кожне порівняння повертає результат "так" чи "ні", дерево рішення є двійковим деревом. Єможливі перестановки вводу, і алгоритм повинен розрізняти всі вони, тому розмір дерева рішень дорівнюєKnKnlg(n)n!n!. Оскільки дерево є двійковим деревом, воно потребує глибини щоб вмістити всі ці вузли. Глибина - це максимальна кількість рішень, які приймає алгоритм, тому запуск алгоритму передбачає принаймні стільки порівнянь: максимальний час виконання - .Θ(lg(n!))=Θ(nlg(n))Ω(nlg(n))

¹ Або інше споживання ресурсів, наприклад, простір пам'яті. У цій відповіді я розглядаю лише час роботи.


1
"Однак найкращий випадок швидкості (коли вхід вже відсортований) лінійний" це найгірший випадок !!
user5507

@ user5507: Насправді це залежить від стратегії зведення. Якщо перший (або останній) елемент обраний як опорний, то ви праві; але якщо ви вибираєте середній елемент або медіану першого, середнього, останнього, то найкращий випадок відсортований.
chirlu

"Малі o і ω використовуються набагато рідше в аналізі складності". Це не вірно в аналізі складності простору. Під час аналізу складності часу ви зазвичай використовуєте o і ω під час підрахунку конкретних операцій (порівняння, пошук диска, пропуски кешу, що у вас є). Але оскільки ви завжди можете зачекати і придбати більш швидкий комп’ютер, "час на стіні" завжди "до постійного коефіцієнта", тому big-O набагато частіше зустрічається. У космічному аналізі часто виникають жорсткі нижні межі через теорію інформації, тому вкрай часто зустрічається, коли розмір повідомляється як "f (n) + o (f (n)) біт", де f (n) - нижня межа.
Псевдонім

Поки я думаю про це: якщо f (n) - теоретична нижня межа розміру якоїсь структури даних, то та, яка використовує f (n) + O (1) (постійні накладні витрати), називається "неявною", такою, яка використовує f (n) + O (f (n)) (постійний відносний накладні витрати) називається "компактним", а той, який використовує f (n) + o (f (n)) (відносний накладний стає з часом незначним), називається "лаконічним ". Гарні умови, щоб знати, чи вам коли-небудь потрібно працювати в цьому просторі.
Псевдонім

17

Зазвичай використовується для визначення верхньої межі (оцінка зверху), тоді як використовується для визначення нижньої межі (оцінка знизу), а використовується, коли вони відповідають, і в цьому випадку ви можете використовувати замість них (як правило) заявляти результат.OΩΘΘ


3
"Зазвичай"? Їх можна використовувати для чогось іншого?
svick

1
@svick, так, наприклад, що не є верхнім твердженням. Під верхнім зв'язаним твердженням я маю на увазі щось на зразок що виражає верхню межу на . P=DTime(nO(1))f=O(g)f
Каве

4
На насправді, Кава, що є верхньою межею заяви. Перекладацький англійський переклад " " є "P - це набір проблем, які можна вирішити, використовуючи AT MOST поліноміальне число операцій". Якщо ви не мали на увазі "максимум", ви повинні були написати . (Звичайно, обидва твердження правильні.)P=DTime(nO(1))P=DTime(nΘ(1))
JeffE

@JeffE, я вважаю це рівністю між наборами функцій, але ти маєш рацію, можна також вважати це верхньою межею в більш загальному сенсі.
Каве

@JeffE Власне, , оскільки але . D T I M E ( Θ ( n log n ) ) P D T I M E ( Θ ( n log n ) ) D T I M E ( n Θ ( 1 ) ) = PDTIME(nΘ(1))DTIME(Θ(nlogn))PDTIME(Θ(nlogn))DTIME(nΘ(1))=
Девід Річербі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.