Чи існують зміни у звичайних режимах виконання Big-O-Notation?


9

Є кілька нотацій, наприклад або тощо. Мені було цікаво, чи є в реальності варіанти таких, як чи , чи вони математично неправильні.OO(n)O(n2)O(2n2)O(logn2)

Або було б правильно сказати, що можна вдосконалити до ? Я ще не можу і не потребую розгадування часу виконання, і мені не потрібно нічого вдосконалювати, але мені потрібно знати, чи так ви описуєте свої функції в реальності.O(5n2)O(3n2)


1
Під час асимптотичного аналізу немає різниці між O (5n ^ 2) та O (3n ^ 2). Вони обидва O (n ^ 2), і відрізняються лише постійною. Насправді, у доказ ви можете навіть зменшити O (5n ^ 2) до O (3n ^ 2) або O (n ^ 2), щоб зробити математику чистішою, оскільки вони є рівнозначними. Складаючи доказ, ви робите помітку на бічній панелі, що вони є рівнозначними. Насправді, ви можете навіть поміняти O (log n) на O (n) і зазначити, що O (log n) <= O (n) на бічній панелі. Примітка на бічній панелі повідомляє читачеві, що вона навмисна, а не друкарська. (Принаймні, так я і зробив, коли брав аналіз алгоритму в коледжі).
jww

2
Якщо ви використовуєте позначення для позбавлення від дрібних факторів, ви завжди можете написати щось на кшталт "... покращує час роботи від до "і т. д. Або, рівно, і . Деякі автори вважають за краще просто написати як скорочення для першого. Дивіться, наприклад, підручник Трефетена та Бау. O()5n2+o(n2)3n2+o(n2)(5+o(1))n2(3+o(1))n25n2
Йонатан N

Відповіді:


21

Мені було цікаво, чи існують такі варіанти в дійсності, як або , чи вони математично неправильні.O(2n2)O(log(n2))

Так, або є допустимими варіантами.O(2n2)O(log(n2))

Однак ви їх побачите рідко, якби їх взагалі побачили, особливо в кінцевих результатах. Причина полягає в тому, що є . Аналогічно, є . Це може здивувати початківців. Однак ці рівності є більш-менш самою причиною великих нотацій, щоб приховати мультиплікативний постійний фактор, який часто важко визначити і відносно незначний.O(2n2) O(n2)O(log(n2)) O(logn)O

Чи було б правильно сказати, що можна вдосконалити до ?O(5n2)O(3n2)

Це зовсім не поліпшення, якщо часова складність алгоритму змінюється з на або з на , тому що є тоді як є . Тому невірно сказати, що складність у часі покращується від до . Правильно сказати, що складність часу алгоритму покращується , звичайно, від до .O(5n2)O(3n2)Ω(5n2)Ω(3n2)O(5n2)O(3n2)Ω(5n2)Ω(3n2)O(5n2)O(3n2)5n23n2


Вправа 1. Покажіть, що .O(5n2)=O(3n2)=O(n2)

Вправа 2. Покажіть, що .O(logn)=O(log(n2))

Вправа 3. Покажіть, що .Ω(n2+n)=Ω(n2)


1
@bv_Martn Ось хороше посилання, щоб зрозуміти, що позначення визначається як (просто просте обмеження!): math.stackexchange.com/questions/925053/…O(n)
Акшат Махаджан

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

7
@AkshatMahajan Єдина відповідь на це питання /math/925053 - явно неправильна. На великих нотаціях є багато надійних джерел . O
Джон Л.

1
"Правильно сказати, що складність часу алгоритму вдосконалена від 5n ^ 2 до 3n ^ 2" - хоча точний час виконання часто змінюється для різних вхідних розмірів і значень. Крім того, це передбачає зважування всіх операцій / фокусування на одній операції, що може не сказати багато про постійні фактори, які ви отримаєте в реальному світі, або бути порівнянним з іншими алгоритмами, що використовують різні ваги. Тож, хоча у нього може бути кілька дійсних випадків використання, сказати щось подібне вище є обмеженою корисністю (через що, мабуть, тому його рідко можна побачити).
Бернхард Баркер

1
@Mark: Це просто неправильно.
користувач21820

13

Ви завжди вільні взагалі не використовувати це позначення. Тобто ви можете визначити функцію якомога точніше, а потім спробувати покращити її. Наприклад, у вас може бути алгоритм сортування, який проводить порівняння , тож ви можете спробувати створити інший алгоритм сортування, який порівнює лише порівняння. Звичайно, всі види функцій існують (теоретично), а також можуть з'являтися (на практиці).f(n)f(n)g(n)f(n)

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


Ну, мені це ще не потрібно на практиці. Або теоретично насправді мені просто потрібно знати, чи визначені у вікіпедії визначення O (1) -O (n!) Є єдиними, які існують, або якщо насправді ви могли б описати їх по-іншому, якщо вони різні, наприклад O (7Н). Мій страх полягає в тому, що якщо я використовую, що професор математики
розможе

1
Будь-яке визначення, яке хтось робить, існує. Ви повинні дуже уважно прочитати, що означає позначення або Оскільки ваше запитання не має сенсу. Немає ярликів. Якщо ви хочете зрозуміти, що означає фрагмент математичного змісту, ви повинні бути готові вкласти якийсь час. O(1)O(n!)
Юхо

6
@bv_Martn У професора математики набагато більше шансів відкинути, тому що ви переглядаєте список прикладів як список визначень. Значна частина математики полягає у тому, щоб визначати речі таким чином, що змушує їх працювати в цілому, а не лише в конкретних випадках. Ваше питання - це, в основному, вдосконалена версія "Вікіпедії говорить, що я можу додати одне і додати два та додати сімнадцять. Але чи можу я додати і інші числа?"
Девід Річербі

7

Хоча прийнята відповідь є досить хорошою, вона все ще не стосується реальної причини, чому .O(n)=O(2n)

Нотація Big-O описує масштабованість

По суті, Big-O Notation - це не опис того, скільки часу алгоритму потрібно запустити. Це також не опис того, скільки кроків, рядків коду чи порівнянь робить алгоритм. Найбільш корисно при використанні описати, як алгоритм масштабується з кількістю входів.

Візьмемо, наприклад, двійковий пошук. З огляду на відсортований список, як знайти довільне значення всередині нього? Що ж, можна почати з середини. Оскільки список відсортований, середнє значення вкаже вам, на яку половину списку входить ваше цільове значення. Отже, список, який потрібно шукати, зараз розділений навпіл. Це можна застосовувати рекурсивно, потім переходите до середини нового списку тощо, поки розмір списку не дорівнює 1 і ви не знайдете своє значення (або воно не існує в списку). Подвоєння розміру списку додає лише один додатковий крок до алгоритму, який є логарифмічним співвідношенням. Таким чином, цей алгоритм є . Логарифм - основа 2, але це не має значення - суть взаємозв'язку полягає в тому, що множення списку на постійне значення лише додає постійного значення часу.O(logn)

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

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


5
Найбільша проблема такого типу відповідей полягає в тому, що він не торкається визначення Великого О, а просто використовує його як якусь інтуїтивну магію, як у "бач, коли ти робиш це та це, це ". Особисто я думаю, що набагато доцільніше сказати комусь, що Big Oh абсолютно не має нічого спільного з алгоритмами, і почати з цього. O(n)
Юхо

3
@Juho Інструктивний, можливо, але в кінцевому рахунку марний для переважної більшості вчених-комп'ютерів.
Розкид

4
З цим я повинен не погодитися. Позначення себе комп'ютерним науковцем не повинно бути приводом для того, щоб не розуміти, що означає нотація, тобто пропускати всю математику.
Юхо

3
Так. Я не заперечую проти програмістів, які не розуміють цього матеріалу, але якщо ви хочете називати себе вченим- комп’ютером , то це основний матеріал.
Девід Річербі

2
@dkaeae Ні, я маю на увазі людей, які працюють у цій галузі, наприклад розробників програмного забезпечення.
розкидання

5

Ви можете написати для будь-якої функції і це має ідеальний сенс. Відповідно до визначення, якщо є якась константа  така, що для всіх досить великих  . Ніщо в цьому визначенні не говорить про те, що повинна бути якоюсь "приємною" функцією.O(f)fg(n)=O(f(n))cg(n)cf(n)nf

Але, як вказували інші відповіді, і описують абсолютно таку ж ситуацію: якщо для всіх усіх достатньо великих  , тоді ми також маємо , тому , також ( приймаючи константу за ).g(n)=O(f(n))g(n)=O(2f(n))g(n)cf(n)ng(n)c22f(n)g(n)=O(2f(n))c/2

Як бічну проблему, не пишіть " ", оскільки не на 100% зрозуміло, що це означає. Можна сказати, що це, очевидно, означає але майже всі писали б це як , тому це ставить під сумнів читача.logn2log(n2)2logn

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


4

Подивіться на визначення O (f (n)), і побачите, що, наприклад, O (2n ^ 2) і O (n ^ 2) абсолютно однакові. Зміна алгоритму з 5n ^ 2 на 3n ^ 2 операцій - це 40-відсоткове поліпшення. Перехід від O (5n ^ 2) до O (3n ^ 2) насправді не є зміною, вони однакові.

Знову прочитайте означення O (f (n)).


4

Можливо, буде корисно зрозуміти, що Big-O описує набір функцій . ТобтоO(f(n))={g(n)|n,c>0:m>n:c×g(m)f(m)}

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

Потім це показує, що Або що постійні фактори не мають значення при визначенні Великого O.O(n)=O(2n)


4
Конвенція про рівність насправді не стосується введення тексту. Це тому, що корисність виразів, таких як спонукає нас розглядати як обидва "набір функцій, таких що [...] "і" деякі функціонують так, що [...] "log(n!)=nlognn+O(logn)O(f)
Девід Річербі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.