Пролог: Велика нотація O є класичним прикладом сили та неоднозначності деяких позначень як частини мови, яку любить людський розум. Скільки б непорозумінь це не спричинило, залишається вибір позначення для передачі ідей, які ми можемо легко визначити і погодитись ефективно.
Я повністю розумію, що означає велика нотація OМоє питання , коли ми говоримо , T(n)=O(f(n)) , де T(n) є час роботи алгоритму на вході розміру n .
Вибачте, але у вас немає проблеми, якщо ви розумієте значення великої нотації O
Я розумію його семантику. Але T(n) і O(f(n)) це дві різні речі. T(n) - точне число, але O(f(n)) - це не функція, яка виплює число, тому технічно ми не можемо сказати, що T(n) дорівнює O(f(n)) , якщо запитати ви то , що це значення з O(f(n)) , яка б ваша відповідь? Відповіді немає.
Важливою є семантика . Важливо, що (як) люди можуть легко домовитись про (одне) його точне тлумачення, яке описуватиме асимптотичну поведінку чи складність у часі чи просторі, що нас цікавить. Точне тлумачення / визначення T(n)=O(f(n)) , як перекладено з Вікіпедії ,
T - реальна або складна значення функції, аf - реальна цінна функція, обидві визначені на деякому необмеженому підмножині реальних додатних чисел, таким чином, щоf(n) є строго позитивним для всіх досить великих значеньn . Для всіх достатньо великих значеньn абсолютне значенняT(n) є щонайбільше позитивною постійною кратноюf(n) . Тобто існує позитивне дійсне числоM і дійсне числоn0 таке
for all n≥n0,|T(n)|≤Mf(n) for all n≥n0.
Зверніть увагу, що це тлумачення вважається визначенням . Усі інші тлумачення та розуміння, які можуть вам дуже допомогти різними способами, є вторинними та наслідками. Кожен (ну, принаймні кожен відповідач тут) погоджується з цим тлумаченням / визначенням / семантикою. Поки ви можете застосовувати цю інтерпретацію, ви, мабуть, добрі більшість часу. Відпочиньте і будьте затишними. Ви не хочете занадто багато думати, так само, як не надто замислюєтесь про якусь неправильність англійської чи французької чи більшості природних мов. Просто використовуйте позначення за цим визначенням.
T(n) - точне число, алеO(f(n)) - це не функція, яка виплює число, тому технічно ми не можемо сказати, щоT(n) дорівнює O(f(n)) , якщо запитати ви тощо цезначеннязO(f(n)) , що б ваша відповідь? Відповіді немає.
Дійсно, відповіді не могло бути, оскільки це питання неправильне. T(n) не означає точне число. Мається на увазі функція, назва якої T і формальний параметр n (яка на зразок обмежена n в f(n) ). Це так само правильно і тим більше, якщо ми запишемо T=O(f) . Якщо T - функція, яка відображає n до n2 а f - функція, яка відображає n до n3, також умовно записати f(n)=O(n3) або n2=O(n3) . Зверніть також увагу, що у визначенні не сказано, що O є функцією чи ні. Це не говорить про те, що ліва сторона повинна взагалі дорівнювати правій! Ви праві підозрювати, що знак рівності не означає рівність у звичайному розумінні, де ви можете переключити обидві сторони рівності, і це повинно бути підкріплено рівним відношенням. (Ще один більш відомий приклад зловживання знаком рівності - використання знака рівності для позначення призначення у більшості мов програмування, а не більш громіздкого, :=
як у деяких мовах.)
Якщо нас хвилює лише одна рівність (я також починаю зловживати мовою. Це не рівність ; проте, це рівність, оскільки в позначеннях є знак рівності, або це може розглядатися як якась рівність ), T(n)=O(f(n)) , ця відповідь зроблена.
Однак питання насправді продовжується. Що це означає, наприклад, f(n)=3n+O(logn) ? Вищенаведене визначення не охоплюється цією рівністю. Ми хотіли б запровадити ще одну конвенцію, конвенцію про заповнення . Ось повний виклад конвенції про заповнення заповнення, як зазначено у Вікіпедії .
При більш складному використанні O(⋯) може з'являтися в різних місцях рівняння, навіть по кілька разів на кожній стороні. Наприклад, для n→∞ справедливо наступне .
(n+1)2=n2+O(n)
(n+O(n1/2))(n+O(logn))2=n3+O(n5/2)
nO(1)=O(en)
Сенс таких висловлювань полягає в наступному: для будь-яких функцій, які задовольняють кожну O(⋯) з лівого боку, є деякі функції, що задовольняють кожну O(⋯) з правого боку, такі, що заміщення всіх цих функцій в рівняння робить дві сторони рівні. Наприклад, третє вище рівняння означає: "Для будь-якої функції f(n)=O(1) існує деяка функція g(n)=O(en) така, що nf(n)=g(n). "
Ви можете перевірити тут ще один приклад конвенції про заповнення заповнення дії.
Ви, можливо, вже помітили, що я не використовував теоретико-множинне пояснення великої O нотації. Все, що я зробив, це просто показати навіть без того теоретико-множинного пояснення, як-от " O(f(n)) - це набір функцій", ми можемо зрозуміти велике O позначення повністю і досконало. Якщо ви вважаєте, що теоретико-теоретичне пояснення корисне, будь-ласка, будь-ласка, продовжуйте все одно.
ΘΩoω
O