O (·) - не функція, тож як функція може бути рівною їй?


47

Я повністю розумію, що означає велика нотація OМоє питання , коли ми говоримо , T(n)=O(f(n)) , де T(n) є час роботи алгоритму на вході розміру n .

Я розумію його семантику. Але T(n) і O(f(n)) це дві різні речі.

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


7
Просто символ = у T(n)=O(f(n)) не означає "дорівнює". Питання спирається на це припущення. Ви знайшли джерело, яке так говорить?
ShreevatsaR

20
Це лише один із багатьох способів зловживань математичними позначеннями :(
технічна

13
Якщо 64 - це число, як я можу бути 64?
TaW

7
Вікіпедія - це завжди гарне місце, щоб почати шукати відповідь - у ній є розділ, який обговорює цю точну точку.
Герцогство

3
@mathreadler Алгоритму немає. Думати, що big-O говорить про алгоритм - це як думати, що десятковий говорить про чиюсь висоту. big-O - позначення для розмови про швидкість зростання математичних функцій; десяткова - позначення цифр. Математична функція може бути, але не обов’язково, часом роботи деякого алгоритму; число може бути, але не повинно бути, чийсь зріст.
Девід Річербі

Відповіді:


107

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

Зауважте, що це також пояснює деякі застереження нотації OНаприклад, ми пишемо , що (1/2)n2+n=O(n2) , але ніколи не пишуть , що O(n2)=(1/2)n2+n . Цитувати Дональда Кнута (Мистецтво комп’ютерного програмування, 1.2.11.1):

Найважливіший розгляд - ідея односторонніх рівностей . [...] Якщо α(n) і β(n) є формулами, які включають O позначення, то позначення α(n)=β(n) означає, що набір функцій, позначених α(n) , міститься у множині, позначеній β(n) .


3
Я не розумію другого абзацу. Я згоден, що коли пишемо , ми маємо на увазі f O ( f ( n ) ) . Але чи не слід O ( f ( n ) ) = O ( g ( n ) ) інтерпретувати як встановлену рівність, оскільки O ( f ( n ) ) O ( g ( n ) )f=O(f(n))fO(f(n))O(f(n))=O(g(n))O(f(n))O(g(n))не має сенсу (це помилка типу!). Якщо так, то чому у другому абзаці ви кажете але O ( n 3 ) O ( n 2 ) ? O(n2)O(n3)O(n3)O(n2)
Алекс Вонг

7
тому що, коли обидва встановлені, ми інтерпретуємо це як O(n2)O(n3)
RiaD

1
Я б використовував слова в місцях, де це насправді потрібно. Для обчислень зазвичай потрібна лише одна однобічна річ
RiaD

11
Я жодного разу не бачив O (n ^ 2) = O (n ^ 3) у будь-якому тексті чи іншому серйозному джерелі. Ви можете це навести?
Якк

1
Якщо ми хочемо бути більш суворими, і n 3 не є функціями, f і n n 3 є. Але "чомусь" я не бачив, щоб хтось писав n n 2O ( n n 3 ) у тексті, який призначений для читання людьми. f(n)n3fnn3nn2O(nn3)
JiK

43

O - функція

O:(NR)P(NR)fO(f)
тобто вона приймає функціюfі отримує набір функцій, які поділяють асимптотичну межу (максимум)f. І строго кажучи, правильні позначення, таким чином, є
(nT(n))O(nf(n))
або коротким
TO(f)
але в математиці, науці та CS зазвичай прийнято використовувати змінну десь у вираз, який позначає, що ви розглядаєтефункції аргументуnз обох сторін. Тож T(n)O(f(n)) є цілком чудовим. T(n)=O(f(n)) , як ви підозрювали, майже не так. Це дуже часто використовується, тому обов'язково майте на увазі, що люди мають на увазі, коли вони це пишуть.

Я б радив не писати ніколи T(n)=O(f(n)) , але думки відрізняються .


11
- це цілком стандартне використання позначень, тому твердження, що це неправильно, не є корисним. (Як, IMO, стверджує, що O - це функція; це технічно правда, але це не дуже корисний спосіб) подумати над цим.)T(n)=O(f(n)O
Девід Річербі

38
@DavidRicherby деякі речі є повністю стандартними, але не повинні бути. - один із прикладів. Звичайно, все-таки добре знати, що люди мають на увазі під цим (як це робиться в ОП), але як це не корисно підтвердити, що ця нотація є технічно неправдивою? Для чого б ти ним користувався? Навіть якщо версія = неоднозначна, і не є , і чим більше людей переходять на цю позначення, тим краще. Завжди краще дотримуватися того, що насправді має сенс математично, якщо тільки писати набагато незручніше. T(n)=O(f(n))=чудово читається та легко пишеться.
близько

1
@leftaroundabout Ви поклали палець на це, коли говорите "якщо тільки набагато незручніше писати" - Робота з насправді набагато незручніше писати, за винятком спеціального випадку, коли в LHS немає термінів O ( ). і рівно один на РЗС. (Див., Наприклад, робота з асимптотиками, як ця моя відповідь, і порівняйте її з відповіддю, який відмовляється від усіх переваг нотації O () і повинен покладатися на невиправдане припущення.) Мета позначення - допомогти думці, і є набагато більше, щоб отримати тут, змінивши значення "="O()
ShreevatsaR

2
@ShreevatsaR не впевнений, куди ти їдеш сюди. Я не читав пов'язаний пост дуже ретельно, але ТВН ваш пост там , здається , найбільш заплутаним і має потребу в гарній купу (кілька затемнити, «не може знайти цей в книзі прямо зараз») правил , в той час як інші відповіді легко дайте рішення з перших принципів. У будь-якому випадку, що заважає вам просто замінити знаки "зловживань" і ⊂, якщо це доречно? =
близько

1
@ShreevatsaR Я погоджуюся, що побудова набору правил / теорем - це теорія. Але найважливіше - це чітко формалізувати кожне правило, коли саме воно застосовується . Теорія типів ІМО - найкраща основа для цього, але наївні набори досить близькі на практиці. Наївних "рівнянь" алгебраїчних виразів, що містять символи / O / Θ , немає. - "Вони змушують вас думати про формалізм теорії множин", - виконана місія! - "яка не відповідає думці людини ..." - чи не так? На практиці говорити про взаємозв'язки - це саме те, що ви робите з теорією типів. OoΘ
близько

13

Формально кажучи, O(f(n)) - це сукупність функцій g така що g(n)kf(n) для деякої постійноїk і всіх досить великих n . Таким чином, найбільш педантично точним способом його написання було бT(n)O(f(n)) . Однак використання= замість  є цілком стандартним, аT(n)=O(f(n)) просто означаєT(n)O(f(n)) . Це по суті ніколи не є неоднозначним, оскільки ми майже ніколи не маніпулюємо множиноюO(f(n)) .

У певному сенсі використання рівності означає, що O(f(n)) означає "деяку функцію g таку, що g(n)fg(n) для всіх досить великих n ", і це означає, що ви можете писати такі речі, якf(n)=3n+O(logn) . Зауважте, що це набагато точніше, ніж, наприклад,f(n)=Θ(n) абоf(n)=O(n+logn) .


Можна також записати . Хоча я визнаю, що може бути зручним зробити висновок у кілька кроків з f ( n ) = = 3 n + O ( log n ) . f(n)3nO(logn)f(n)==3n+O(logn)
близько

Перестановка працює лише в автономних операторах. Це набагато частіше в середині обчислень, коли така річ не працює і де кілька функцій вбираються разом у позначення Ландау. (Речі, як ). f(x)=ex(e2x+O(x))=ex+o(1)
Девід Річербі

4
Я знаходжу такі обчислення, як це; ці знаки рівності більше не є двосторонніми. Я не впевнений, що існує більше проблем із написанням . Я гадаю, це теж зловживання нотацією; в основному ви перевантажуєте оператора =, тоді як я вважаю за краще + і працювати також на множинах. f(x)ex(e2x+O(x))ex+o(1)=+
близько

Можливість полягала б у використанні дещо інших позначень для набору асимптотичних функцій та для невизначеного елемента цього набору, скажімо, O ( h ) . Отже, якщо f - g O ( h ) , то можна записати f = g + O ( h ) замість неоднозначного f = g + O ( h ) . Потім можна без проблем писати O ( h )O(h)O(h)fgO(h)f=g+O(h)f=g+O(h) . Інші можливі позначення для невизначеного елемента O ( ч ) може бути ˙ O ( ч ) , O ( ч ) ...O(h)=fgO(h)O˙(h)O^(h)
Мішель FIOC

11

Пролог: Велика нотація 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 nn0,|T(n)|Mf(n) for all nn0.

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

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



7

f=O(g)
there exists hO(g) such that f=h.

f(n)=n3+O(n2)g(n)O(n2)f(n)=n2+g(n)

Я вважаю цю екзистенційну інтерпретацію кількісних показників настільки корисною, що я спокушаюся писати такі речі

f(n)O(n3)

Cf(n)Cn3



2

n2=O(n3)n2nO(n3)nn2O(n3)

O==O>=

O(mn)O(nc)cO(n)nO(2b)

Все це означає, що Біг-О - це неофіційна нотація, заточена неточністю, і вам часто доводиться використовувати інший контекст, щоб зрозуміти, що говорить автор.

=OO


n2=O(n3)nnnn

2

Тільки щоб підкреслити тему, яку було зроблено декілька разів, дозвольте мені навести цитату з Н.Г. де Бреййна " Асимптотичні методи аналізу" :

O0<x<O(1)+O(x2)f(x)+g(x)f(x)=O(1)(0<x<)g(x)=O(x2)(0<x<)x1O(1)=O(1)+O(x2)x1O(1)O(1)+O(x2). Іноді ліва частина відношення - це не клас, а єдина функція [...]. Тоді відношення означає, що функція зліва є членом класу праворуч.

=O(x)=O(x2)(x)O(x2)=O(x)(x)=

=

Сказавши це, нотація Бендера та Орзага (з передових математичних методів для вчених та інженерів ) набагато менш заплутана і варто задуматися. Щодо деякої межі, ми говоримо:

f(x)g(x)(xx0)

fg

limxx0f(x)g(x)=1

і:

f(x)g(x)(xx0)

fg

limxx0f(x)g(x)=0

Але я припускаю, що перевага нота-о-о полягає в тому, що постійний фактор є довільним. (І для позначення мало-о, постійний фактор - це все, що ви.)


0

Я перейшов це через stackoverflow ; в той час як, можливо, найправильніша відповідь на ОП вже була заявлена ​​вище (класи еквівалентності, перезаписані нижче як №1), ось повна відповідь:

  1. f=O()fO(){12x2,(5x2x+5),2.5x,...}x2O(x2)<O(x3)=O(x3+x) (деякі набори можуть бути незрівнянними; DAG; див. ієрархію поліномів для цікавого прикладу).

    f=Θ()fΘ()f X gfO(g)fO(g)gf(g)O(g)Θ

  2. fΘ(g)x0x>x0gfLOWg(x)f(x)HIGHg(x)O(g)k1g(x)+err(x)0err(x)k2g(x)x>x0xx0f=2Θ(x2)f(x)=2k1x2+err(x)0err(x)k2x2. Ми б ніколи цього не записували ... бо це трохи нерозумно. Але я вважаю, що можна вважати законним саме так, і зберегло б поняття рівності. (Я відхиляюсь від правильного лікування негативних ознак тут, що може бути важливо.)

    OΘ


x2k1x3+errerrx2=2x+err2xx2x2
Девід Річербі

0

Більш точною відповіддю було б те, що коли ми кажемо, що функція f - "велика O функції g". (Тобто x ^ 2 + x є O (x ^ 2)), ми говоримо, що f (x) <C * g (x) для деякого значення C і k, де x> k. Це означає, що g - верхня межа для поведінки f.

Приклад

x ^ 2 + 10x 4 є O (x ^ 2 + x), що є самим O (x ^ 2)

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