Позначення Big Oh не згадує про постійне значення


13

Я програміст і щойно почав читати Алгоритми. Я не повністю переконаний у позначеннях, а саме: Бог О, Велика Омега та Велика Тета. Причина полягає у визначенні Великого О, він говорить, що функція g (x) повинна бути такою, щоб вона завжди була більшою або дорівнює f (x). Або f (x) <= cn для всіх значень n> n0.

Чому ми не згадаємо про постійне значення у визначенні? Наприклад, скажімо функцію 6n + 4, позначимо її як O (n). Але це неправда, що це визначення добре для всіх постійних значень. Це добре лише тоді, коли c> = 10 і n> = 1. Для менших значень c, ніж 6, значення n0 збільшується. То чому ми не згадуємо постійну величину як частину визначення?


4
Як ви пропонуєте точно представляти постійну величину?
Даніель Б

1
Зробивши крапку далі, будь-яка функція завершення є O (1), якщо ви зв'язали n.
Брайан

Відповіді:


23

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

Фактичний час виконання quicksort зазвичай змінюється, якщо він реалізований в C або Python або Scala або Postscript. Це ж стосується і сортування бульбашок - час виконання буде залежати від впровадження.

Однак, що не зміниться, це той факт, що при рівності, коли набір даних збільшується, час, необхідний для запуску сортування міхурів, збільшуватиметься швидше, ніж час, необхідний для запуску quicksort у типовому випадку, незалежно від мови та машини вони реалізовані, припускаючи досить правильну реалізацію. Цей простий факт дозволяє робити розумні умовиводи щодо самих алгоритмів, коли конкретні деталі недоступні.

Порядок алгоритм відфільтровує чинники , які, в той час як важливо в реальних вимірах в реальному світі, як правило, просто шум при порівнянні алгоритмів абстрактно.


22

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

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


3
Наприклад, побудова пірамід - це O (n), сортування зображень з них - O (n log n) - у певний момент у вас може бути достатньо пірамід, щоб зайняти більше часу для сортування зображень, ніж для створення нової! Але лише для дуже великої кількості пірамід!
Мартін Бекетт

Хороша відповідь, але для даного N та двох алгоритмів, які, як правило, потрапляють у одне "сімейство" складностей, може бути заслуговуючи того, щоб робити саме те, що пропонує ОП, і включати принаймні відносні коефіцієнти. Лінійний алгоритм з подвоєною кількістю вказівок на один елемент як інший можна назвати * O * (2N) до другого алга * * * * (N), щоб показати відносну різницю, оскільки для будь-якого N перший алгоритм завжди буде подвійним час виконання другого; однак при порівнянні з функцією сімейства різної складності, наприклад * O * (NlogN), коефіцієнти не мають значення.
KeithS

10

Позначення Big O за визначенням говорить, що: Нотація Big O побудована на інтуїції, що для всіх значень n в і праворуч від n 'значення f (n) знаходиться на або нижче cg (n). Константи також не мають значення, коли ви переходите до найцінніших (змінних) факторів (наприклад, n-квадрат або n-куб), оскільки вони є лише константами, а не різними величинами, які можуть стати такими ж великими, як ці фактори. Нижче наведено графік позначення Big-O.
For a given function g(n), we denote by O(g(n)) the set of functions:
O(g(n)) = {f(n): there exist positive constants c and n' such that 0<=f(n)<=c.g(n) for all n > n'}




введіть тут опис зображення

Суть цього позначення полягає у тому, що " how lower is f(n) from c.g(n) and not when it starts becoming lower".


У цьому випадку для кожного O (n) також є велика тета n, оскільки відповідно до визначення для деякої константи вона буде нижньою межею, а для деякої постійної - верхньою межею. наприклад, 6n + 4 - також велика тета (n), оскільки коли c менше 10, це завжди нижня межа. а коли c більше 10, це верхня межа. Тож чи можемо ми сказати, що для будь-якої заданої нотації Big Oh також є Big Theta?
Pradeep

1
Ви говорите це навпаки: "Велика Тета означає Великий О". І Big -Oh можна замінити на Big-Theta для асимптотично жорстких меж.
Вайбхав Агарвал

9

В аналізі алгоритму Порядок зростання є ключовою абстракцією, і він дає швидкість, з якою змінюється час роботи, коли змінюється розмір вхідних даних. Скажімо, алгоритм має час роботи f(n) = 2n + 3. Тепер ми підключаємо деякий розмір вводу,

n = 10: 2 * 10 + 3 = 23

n = 100: 2 * 100 + 3 = 203

n = 10000: 2 * 10000 + 3 = 20003

n = 1000000: 2 * 1000000 + 3 = 2000003

n = 100000000 : 2 * 100000000 + 3 = 200000003

Як видно, порядок зростання в основному визначається змінною n; константи 2 і 3 менш значущі, і в міру збільшення розміру введення вони стають ще менш значущими для його визначення. Ось чому в алгоритмічному аналізі константи стихають на користь змінної, що визначає порядок зростання функції.


1

Все поняття нотації Big-Oh полягає в тому, щоб ігнорувати константи і представляти найважливішу частину функції, що описує час виконання алгоритму.

Забудьте на мить формальне визначення. Яка гірша (швидше зростаюча) функція, n^2 - 5000або 5000 n + 60000? Для nменш ніж 5000 приблизно лінійна функція більша (і, отже, гірша). Крім цього (точне значення 5013?) Квадратичне рівняння більше.

Оскільки є більше (зовсім ще декілька) позитивних чисел, більших ніж 5000, ніж менше, ми вважаємо квадратичну функцію «більшою» (гіршою) загалом. Позначення порядку (Big-Oh тощо) примушує це (ви завжди можете усунути добавку та мультиплікативну константу, використовуючи ці визначення).

Звичайно, речі не завжди прості. Іноді ви дійсно хочете знати ці константи. Що краще сортувати вставку або сортувати міхур? Обидва є O(n^2). Але одна справді краща за іншу. При більш детальному аналізі можна отримати константи, як вам цікаво. Зазвичай набагато простіше обчислити функцію Big-Oh, ніж більш точну функцію.

Big-Oh ігнорує ці константи, щоб спростити та зробити найважливіші порівняння. Подобання нам подобається, тому що зазвичай ми не хочемо знати про (переважно неактуальні) константи.


1

(оскільки це довша відповідь, прочитайте шрифти для резюме )

Давайте візьмемо ваш приклад і пройдемо його поетапно, розуміючи мету того, що ми робимо. Ми розпочинаємо з вашої функції та мети знайти її нотацію Big Oh:

f(n) = 6n+4

По-перше, нехай O(g(n))буде нотація Великого О, яку ми намагаємось знайти f(n). З визначення Великого О, нам потрібно знайти спрощене g(n) там, де є деякі константи cі n0де c*g(n) >= f(n)вірно для всіх nбільше, ніж n0.

По-перше, давайте виберемо g(n) = 6n + 4(що дасть вихід O(6n+4)у Big Oh). У цьому випадку ми бачимо, що c = 1і будь-яке значення n0буде відповідати математичним вимогам з нашого визначення Big Oh, оскільки g(n)завжди дорівнює f(n):

c*g(n)      >=  f(n)    
1*(6n + 4)  >=  6n + 4    //True for all n's, so we don't need to pick an n0

На даний момент ми виконали математичні вимоги. Якщо ми зупинилися наO(6n+4) цьому, зрозуміло, що це не корисніше, ніж написання f(n), тому було б пропущено справжню мету нотації Big Oh: зрозуміти загальну часову складність алгоритму! Таким чином, переходимо до наступного кроку: спрощення.

По-перше, чи можемо ми спростити те, що 6nтаке Велике О O(4)? Немає! (Вправа для читача, якщо він не розуміє, чому)

По-друге, чи можемо ми спростити 4так, щоб Великий О був O(6n)? Так! У такому випадку g(n) = 6nтак:

c*g(n)    >=  f(n)
c*6n      >=  6n + 4     

У цей момент давайте виберемо c = 2з того часу лівий бік збільшуватиметься швидше (на 12), ніж правий (на 6) на кожен приріст n.

2*6n      >=  6n + 4

Тепер нам потрібно знайти позитив, n0де вищевказане рівняння справедливо для всіх n, що перевищують це значення. Оскільки ми вже знаємо, що лівий бік збільшується швидше, ніж правий, все, що нам потрібно зробити, - це знайти одне позитивне рішення. Таким чином, оскільки це n0 = 2робить дійсним вище, ми знаємо, що це g(n)=6nабо O(6n)є потенційним позначенням Big Oh f(n).

Тепер ми можемо спростити 6так, щоб Великий О був O(n)? Так! У такому випадку g(n) = nтак:

c*g(n)      >=  f(n)    
c*n         >=  6n + 4    

Виберемо, c = 7оскільки лівий збільшився б швидше, ніж правий.

7*n         >=  6n + 4

Ми бачимо, що вищезазначене буде справедливим для всіх n, більших або рівних n0 = 4. Таким чином, O(n)є потенційним позначенням Big Oh для f(n). Чи можемо ми спростити g(n)більше? Ні!

Нарешті, ми виявили, що найпростіша нотація Big Oh - f(n)це O(n). Чому ми пройшли все це? Тому що тепер ми знаємо, що f(n)це лінійно , оскільки нотація Big Oh має лінійну складність O(n). Приємно те, що зараз ми можемо порівняти складність у часі з f(n)іншими алгоритмами! Наприклад, тепер ми знаємо , що f(n)це можна порівняти з тимчасової складністю для функцій h(n) = 123n + 72, i(n) = n, j(n) = .0002n + 1234і т.д .; тому що, використовуючи той самий процес спрощення, описаний вище, всі вони мають лінійну часову складність O(n).

Солодкий !!!


Привіт, Добре пояснення. У мене ще мало сумнівів. 1. Ми не можемо зробити 6n + 4 як O (4), оскільки існує змінне значення 'n'. Це відповідь? 2. при спрощенні ви вибрали c = 7 і відповідно обчислили n0 до 4. Що вирішило вирішити c = 7 і не менше 7? тому що на основі значення c n0 зміниться.
Pradeep

@Pradeep: Для 1 ти прав. Для більш глибокого пояснення: Якщо ми спробуємо O(4), це зробило б наше рівняння нерівності c*4 >= 6n+4, і для будь-якого cвибраного нами ми завжди могли б знайти значення, де всі значення nвище, що зробили б нерівність помилковою.
Briguy37

@Pradeep: Для 2 фактичні значення cта n0не є важливими. Важливо те, що n0існує для того, хто cми обираємо. Для того, щоб це було правдою, ліва частина нерівності повинна збільшуватися швидше, ніж права для великих значень n. c=6не корисно для цього ( 6n >= 6n+4ніколи не буває правдою), тому я вибрав c=7. Я міг би так само легко підібрати c=10, c=734або c=6.0000001і, як і раніше, міг би бачити, що існували деякі n0, щоб зробити нерівність справжньою n >= n0, а це означає, що Великий О, який ми тестуємо, є дійсним.
Briguy37

Дякую за чітке пояснення. Це я саме шукав. Ще раз дякую
Прадепі

@Pradeep: Радий, що міг допомогти :)
Briguy37

1

Якщо у вас функція виконання 6n + 4, відповідне питання "6 що?". Як один коментар запитав: що являє собою ваша константа? З точки зору фізики, які одиниці є вашим постійним фактором?

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

Подивіться на це інакше: ми використовуємо "алгоритм" не для опису конкретної реалізації, а для опису цілого класу потенційних реалізацій тієї ж загальної процедури. Ця абстракція ігнорує деталі реалізації на користь документування чогось загального значення, а фактор постійної продуктивності є однією з цих деталей.

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

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