Що означає більш швидкий алгоритм у теоретичній інформатиці?


18

Якщо існує якийсь алгоритм, який працює у часі O(f(n)) для якоїсь проблеми A, а хтось придумує алгоритм, який працює в часі, O(f(n)/g(n)) , де g(n)=o(f(n)) , чи вважається це поліпшенням порівняно з попереднім алгоритмом?

Чи має сенс у контексті теоретичної інформатики придумати такий алгоритм?


4
Під "швидшим алгоритмом" ми маємо на увазі "асимптотично швидший алгоритм".
Yuval Filmus

@YuvalFilmus, що ти маєш на увазі під "асимптотично"
визначено

1
Пробіг у часі o(f(n)) .
Yuval Filmus

Відповіді:


26

Ні, алгоритм, що працює в часі , де g ( n ) = o ( f ( n ) ) , не обов'язково вважається вдосконаленням. Наприклад, припустимо, що f ( n ) = n і g ( n ) = 1 / n . Тоді O ( f ( n ) / g nO(f(n)/g(n))g(n)=o(f(n))f(n)=ng(n)=1/n - гірший час, ніж O ( f ( n ) ) = O ( n ) .O(f(n)/g(n))=O(n2)O(f(n))=O(n)

Для вдосконалення роботи алгоритму, який працює у часі , вам потрібно придумати алгоритм, що працює у часі o ( f ( n ) ) , тобто в часі g ( n ) для деякої функції g ( n ) = o ( f ( n ) )f(n)o(f(n))г(н)g(n)=o(f(n)) .

Якщо все, що вам відомо, це те, що алгоритм працює в часі , то незрозуміло, чи працює алгоритм, який працює в часі O ( g ( n ) ) , незалежно від f ( n ) , g ( n ) є. Це тому, що великий O - це лише верхня межа часу виконання. Замість цього, загальноприйнято розглядати тимчасову складність в гіршому випадку, і оцінити його як велике & thetas , а не просто як великий O .O(f(n))O(g(n))f(n),g(n)ΘO


21
Можливо, буде краще взяти у першому абзаці. Використовуючи зменшувальну функцію, ви відчуваєте трохи обман-у. g(n)=1
Девід Річербі

1
@DavidRicherby: Можливо, трохи, але ОП ніколи не говорив, що у них є алгоритм, що працює в тому монотонності не можна вважати. O(g(n))
Кевін

7
@Kevin Sure, але контекст - це інформатика, і, в галузі інформатики, для зменшення функцій зазвичай використовується нотація big-O. Напевно, запитувач думав у цих термінах.
Девід Річербі

11

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

Припустимо, у вас є алгоритм , фактичний час його виконання 1 n 2 + 2 n + 1 (якщо припустити, що ви можете насправді рахувати інструкції та знати точні терміни тощо), що, безумовно, є величезним припущенням у сучасних системах). Тоді припустимо, що ви придумали новий алгоритм, який буває O ( n ) , але фактичний час виконання 1000 n + 5000 . Припустимо також, що ви знаєте, що програмне забезпечення для використання цього алгоритму ніколи не побачить розмір проблеми n > 10O(n2)1n2+2n+1O(n)1000n+5000n>10 .

Отже, який би ти обрав - алгоритм , який забирає 15000 одиниць часу, або O ( n 2 ), який збирається лише 121 одиницю? Тепер, якщо ваше програмне забезпечення розвивається для вирішення проблемних розмірів n > 100000 , яке б ви обрали? Що б ви зробили, якщо розмір вашої проблеми сильно різниться?O(n)O(n2)n>100000


2
"ніколи не бачимо задачу розміром n> 10" - тоді ми б взагалі не використовували позначення O, чи ми ...
AnoE

5
@AnoE Прості числа заради аргументу. Ця ж логіка застосовується, чи аналізуєте ви розмір проблеми 10 vs 1e5 чи аналізуєте 1e6 vs 1e9.
twalberg

1
@AnoE Більшість комп'ютерних програм не намагаються впоратися з нескінченно зростаючим розміром проблеми. Тож буде компроміс. Ось чому big-O призначений для теоретичної інформатики, і концепції можуть бути застосовані для вдосконалення фактичних програм.
mbomb007

Рівно @ mbomb007. Назва питання "Що означає більш швидкий алгоритм у теоретичній інформатиці?" і він має це в тілі: "Чи має сенс це в контексті теоретичної інформатики ...".
AnoE

@AnoE З досвіду, позначення O використовується, коли n <10 весь час! Не те, що це гарна ідея ... але це абсолютно щось зроблено!
Корт Аммон - Відновіть Моніку

5

Як правило, це означає, що для будь-якого розміру вводу, який є достатньо великим, час роботи найстарішого алгоритму відбувається повільніше, ніж новий. Це еквівалентно формалізму , де g - часова складність нового алгоритму і f часова складність старого.g(n)o(f(n))gf

Однак іноді комп'ютерні фахівці дбають про середню ефективність роботи. Класичний приклад - Quicksort: його найгірший час виконання - тоді як ми знаємо інших, які працюють у Θ ( n log n )Θ(n2)Θ(nlogn) час, але він широко використовується на практиці через хороший середній час роботи. Крім того, можна налаштувати, що він працює дуже швидко у випадках, які найчастіше зустрічаються в дикій природі, наприклад, масиви, які здебільшого в правильному порядку.

І іноді навіть теоретичні комп'ютерні вчені використовують «швидше» так само, як це роблять звичайні люди. Наприклад, більшість реалізацій класів String мають оптимізацію коротких рядків (також її називають Small String Optimization), хоча вона лише прискорює роботу для коротких рядків і є чистою накладною витратою для більш довгих. Оскільки розмір вводу збільшується і збільшується, час роботи String-операції з SSO збільшуватиметься на малий постійний термін, тому за визначенням, яке я дав у першому абзаці, видалення SSO з класу String робить його «швидшим На практиці, однак, більшість рядків невеликі, тому SSO робить більшість програм, які використовують їх швидше, і більшість професорів інформатики знають краще, ніж обходити вимоги, щоб люди говорили лише про порядки асимптотичної складності часу.


1

Не існує жодного уніфікованого визначення того, що таке «швидший алгоритм». Не існує керівного органу, який вирішує, чи алгоритм швидший за інший.

Щоб зазначити, чому це, я хотів би запропонувати два різні сценарії, які демонструють цю мутну концепцію.

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

Якщо я можу використовувати традиційний приклад програмування робота, щоб зробити сендвіч PBJ, я можу показати, що я маю на увазі іншим способом. Розглянемо лише той момент, коли можна відкрити банку з арахісовим маслом.

Pick up the jar
Grab the lid
Unscrew the lid

Проти

Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Put the jar back down
Pick up the jar
Grab the lid
Unscrew the lid

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

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

Тож за однієї обставини ми можемо змінити O (n) на O (n) і швидше назвати його. За інших обставин ми можемо змінити O (2 ^ n) на O (2 ^ n / n ^ 100), і стверджувати, що взагалі не було значущої швидкості. Ось чому я кажу, що немає "єдиного визначення для" швидшого алгоритму ". Це завжди залежить від контексту.


1

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

 0cf< lim supnA(n)f(n)=cf

g(n)lim supng(n)=h(n)=f(n)g(n)

A(n)O(h(n))A(n)O(h(n))

 0ch< lim supnA(n)h(n)=ch

Використовуючи правила лімітів, ми також можемо написати:

ch=lim supnA(n)h(n)=lim supnA(n)g(n)f(n)=cflim supng(n)

ch<cf=0

cf0A(n)O(h(n))

A(n)A(n)A(n)Θ(f(n))g(n)

A(n)O(f(n))A(n)А(н) міг уже бути в О(год(н)).


1
Ваш ліміт повинен перевищувати ліміт.
Yuval Filmus

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