Поясніть, будь ласка, твердження, що функція an + b належить O (n ^ 2) і Θ (n)?


12

Скажімо, у мене лінійна функція f(n)= an+b, який найкращий спосіб довести, що ця функція належить до O (n 2 ) і Θ(n)?

Мені тут не потрібна математична суворість. Мені потрібна відповідь програмістів. Якийсь логічний спосіб пояснення.

Саме тому я не поставив питання з питань математики Q&A, а натомість у програмі Q&A.


2
@EmmadKareem У літературі часто нотація Big O часто використовується випадково, щоб зобразити тісні межі, які в основному Θ (n). Big O - це фактично верхня межа.
Geek

1
@EmmadKareem "Верхня межа O (n) не n * n.",, Немає верхньої межі O (n). O (n) сама визначає верхню межу. Він може містити набір функцій, які задовольняють умові: f (x) ∈ O (g (x)), оскільки існує c> 0 (наприклад, c = 1) і x0 (наприклад, x0 = 5), таких що f (x ) <cg (x), коли x> x0.
Geek

2
@EmmadKareem Власне O (n) \ підмножина O (n ^ 2) \ підмножина O (n ^ 3) і так далі, таким чином f \ in O (n ^ 2) шляхом транзитивності \ підмножини. Зауважте, що \ підмножина не є \ subseteq.
шарфридж

6
"Мені потрібна відповідь програмістів. Якийсь логічний спосіб пояснення." - ну як ви визначаєте "логічне"? Математика логічна. Тут все неправильно, ніж суворе мислення . Ви можете спробувати пояснити тему, але, не перетравлюючи (інакше не важко) математику за нею, ви насправді не зрозумієте - у вас буде лише туманне відчуття того, що це означає.
Tamás Szelei

2
@Geek: Мабуть, ти маєш на увазі математику ? cs.SE також буде гарною адресою.
Рафаель

Відповіді:


20

Позначення Big Oh (O, Theta, Omega) стосується темпів зростання функцій.

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

Нотація Ландау абстрагує ці постійні фактори. Не важливо, чи алгоритм fзавжди вдвічі швидший, ніж інший алгоритм g. Можливо, gйого можна оптимізувати для роботи в 4 рази швидше, або ви зможете придбати швидше апаратне забезпечення. Якщо ви подивитесь на це з цієї точки зору, ви можете сказати, що вони "однакові". (Це не означає, що ви можете (завжди) ігнорувати постійні фактори на практиці.)

Великий о вказує верхню межу, вона схожа на <=відношення.

Погодьтесь, 1 < 2це правда. Чи означає це, що 1не може бути меншим за будь-яке інше число? Звичайно, ні. Існує нескінченна кількість чисел, більша за 1.

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

Ось чому функція може бути в декількох класах "Big-oh".

Ось порівняння різних функцій з обмеження: (з конкретної математики Кнута)

порівняння темпів зростання

Зліва направо функції ростуть швидше.

Крім того, введіть тут опис зображеннязначення n ^ 2 росте швидше, ніж n ^ 1, оскільки 2> 1.

Визначення

визначення Омега

"f росте швидше або настільки ж швидко, як g"

визначення великий О

"f росте повільніше або настільки ж швидко, як і g"

визначення Тета

Поєднання вищезгаданих двох. Він говорить, що функція fзростає так само швидко g. Це відношення еквівалентності.

Інтерпретація

Скажімо, у вас є два алгоритми, fі g.

Омега

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

Великий о

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

Доказ

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

Так що вам потрібно знайти значення c, d, n_0таким чином, що умова виконана.

Ось як це можна зробити для нижньої межі за допомогою c:

доказ

Важливо усвідомити, що мене довільно визначати cяк менший, ніж a-1це цілком добре. Визначення Тети (g) говорить про те, що "існує a c". Це може бути будь-яке значення до тих пір, поки воно більше ніж 0. (Якщо aце дійсне додатне дійсне число, вам доведеться трохи змінити доказ, тому що a - 1насправді може бути негативним)

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

Можна спробувати зробити це для верхньої межі, це досить схоже. Якщо ви не знаєте як, я можу надати вам підтвердження.

Підказка: почніть з d > a + 1

Увага

Важливо, щоб ви не доводили це неправильно. Якщо ви припускаєте, що (an + b) знаходиться в O (n) і їдете звідти, ви не довели, чого хотіли. Вам потрібно буде переконатися, що всі ваші кроки йдуть в обох напрямках, тобто замість =>вас <=>.


2
Це воно. Занадто погані люди вигадують через математику, це насправді дуже просто.
Tamás Szelei

У запитанні сказано: "Мені тут не потрібна математична суворість. Мені потрібна відповідь програмістів ..." Повідомлення, використані у цій відповіді, не виглядають як відповідні для запитання
gnat

1
@gnat Хм, я подумав, що питання в один момент сказав "довести". У всякому разі, я додав тлумачення для математичних визначень.
phant0m

@ phant0m чудова відповідь. саме те, що я шукав. Математика у відповіді зробила це більш твердим, навіть якщо "математику" в оригінальному запитанні спеціально не просили. Дякую тонну.
Geek

@Geek, я рада, що тобі це подобається. Якщо у вас є якісь питання, сміливо запитайте, і я можу уточнити / розширити свою відповідь.
phant0m

5

Якщо ви маєте справу з поліномами, ви дбаєте лише про ступінь многочлена. Тобто, бо an + bви тільки дбаєте n. Якби це було an^3 + bn^2 + cn + d, ви б тільки хвилювались n^3.

Тож поліном зі ступенем d завжди буде Θ(n^d). Простий.

Тепер нам потрібно поговорити про різницю між Θ і O. По суті, це та ж різниця, що і між ==і <=відповідно. Так Θ(n)означає , що вона є завжди в постійному факторі n. O(n)означає, що він завжди знаходиться в межах постійного коефіцієнта nабо менше n.

Це означає, що будь-яка функція в Θ(s), для будь-якої s, також буде в O(s). Крім того, якщо функція є Θ(s)і sзавжди менше, ніж якась інша функція t, ця функція є, O(t)але ні Θ(t).

Для повноти також є Ω(n). Якщо Θявляє ==і Oпредставляє <=, Ωпредставляє >=. Так an + bв Ω(1), Θ(n)і O(n^2).

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

Будь-які функції у вигляді a^bnдовільних aі bє в Θ(a^n). Для будь-якого значення c >= aвони знаходяться в O(c^n). Кожен многочлен є в O(2^n). По суті це просто говорить про те, що експоненціальні функції завжди вибивають поліноми і що має значення основа експоненціальної функції.

Логарифми - протилежні. Для одного, log_b nє Θ(log n)для будь-якого b. Це означає, що основа логарифмів не має значення. Це має сенс, тому що перемикання між різними основами в логарифмах - це просто множення на постійну. Логарифмічні функції також O(n)є - тобто логарифмічна функція менша, ніж будь-який многочлен (принаймні, ступінь 1).

Враховуючи суму цих функцій, найбільша «виграє». Так n + log nвідбувається Θ(n)тому, що nтермін домінує над log nтерміном. Множення складніше. Для CS єдине, що вам потрібно знати - nlog nце між nі n^2.


1
досить добре. На мій спогад, вище пояснення є наближеним до класичного посібника з дизайну алгоритму, як це стає
gnat

1
@Tikhlon приємно напишіть. Так +1. Але той, який я прийняв, був ще кращим.
Geek

-2

Не використовуючи багато математики, ви берете функцію f (n) = an + b і скидаєте всі константи, так що це виглядає як f (n) = n, тоді ви приймаєте "n" з найвищим ступенем як свою відповідь QED Θ (n)

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