Що означає "асимптотично ефективніше"?


12

Що це означає, коли ми говоримо, що алгоритм X асимптотично ефективніше, ніж Y ?

  • X буде кращим вибором для всіх матеріалів.
  • X буде кращим вибором для всіх входів, крім невеликих входів.
  • X буде кращим вибором для всіх входів, крім великих входів.
  • Y буде кращим вибором для невеликих входів.

Посилання на це питання тут.

http://quiz.geeksforgeeks.org/algorithms-analysis-of-algorithms-question-16/


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


великий вхід розкриває горловину пляшки в алгоритмі. Це те, що я б сказав в інженерному плані.
Apiwat Chantawibul

Відповіді:


14

По-перше, обидва алгоритми "працюють" для всіх входів. Питання стосується продуктивності.

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

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

Формулювання все ще не таке велике. По-перше, набагато більше факторів вирішують, який алгоритм є "кращим вибором", але я скажу їм, що у цьому випадку наміри досить зрозумілі. Справжнє питання - "мале" та "велике". Один з моїх улюблених робіт - найшвидший і найкоротший алгоритм для всіх чітко визначених проблем . У цій роботі описаний алгоритм, який дає будь-яку специфікацію функції, і доказ того, що вона може бути обчислена в поліноміальний час, буде обчислювати цю функцію в оптимальній часовій складності в межах коефіцієнта5плюс додаток. Наприклад, якщо я надав йому реалізацію сортування бульбашок як специфікації функції та простого доказу, що це булоO(n2), це створило б алгоритм сортування, який був O(nlgn). Фактично, це створило б такий алгоритм5cnlgn+o(nlgn) де cбув постійним фактором асимптотично * оптимального алгоритму. Це дивно. Є лише одна проблема: постійний термін - приховано вo(nlgn)у цьому прикладі - робить алгоритм майже напевно абсолютно нездійсненним практично для будь-якої реальної проблеми. Що я маю на увазі під "цілком нездійсненним"? Я маю на увазі теплове загибель Всесвіту відбуватиметься багато разів до того, як алгоритм завершиться. Тим не менш, для відповідно "великих" входів це буде швидше, ніж сортування бульбашок. Моя думка, це майже напевно фізично неможливо записати "відповідним чином великий" вхід, не кажучи вже про обчислення на ньому.

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

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


2

Що люди зазвичай мають на увазі, коли говорять щось подібне, це:

Якщо TA і TB є двома функціями витрат алгоритмів часу роботи A і B у моделі X відповідно TAo(TB).

Тут застосовується багато застережень: Xпотрібно уточнити, і ми маємо точно визначити, що саме означає "вартість робочого часу". Час майже ніколи не є предметом розслідування. Існує багато інших заходів щодо витрат. Це неясно , якщо Ландау позначення робить будь-корисне заяву про ефективність. І так далі.

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

На жаль, більш широке співтовариство людей, що займаються алгоритмами, використовує термінологію, яка межує з вакуумною заради простоти. (Складати точні та корисні твердження про алгоритми важко!)

Вас можуть зацікавити наші довідкові запитання .


Кажуть, що алгоритм X є асимптотично кращим, ніж Y, якщо X займає менший час, ніж y, для всіх вхідних розмірів n більше значення n0, де n0> 0.

Зверніть увагу, як це не звичайне визначення! ЯкщоTA(n)=n+1 і TB(n)=n, ми б не сказали, що це "асимптотично краще". З огляду на всі застереження аналізу, що зводить ефективність алгоритму до одиничного числа, не можна стверджувати, що один був "кращим", ніж інший.

Я рекомендую вивчати інформатику з ресурсів CS, а не від програмістів, які читали про речі у Вікіпедії один раз. (Так, це суворо, але я бачив занадто багато неправди, що поширюються в програмістських колах, навіть у програмі SO.)


2

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

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

Наразі немає апаратного забезпечення, яке могло б зберігати масив 1030 цілі числа, так чітко 1030цілі числа вважатимуться "великим входом". Але я можу легко створити алгоритм сортування, який асимптотично більш ефективний, ніж Bubblesort, але тільки для входів1040або більше цілих чисел. Тому прийміть відповідь дві, змініть "великий" на "досить великий", і це стане правильним.

На практиці часто корисно перевірити, який розмір вводу асимптотично кращий алгоритм насправді швидший, і який потрібний час для входів, де він швидший, а іноді алгоритм буде швидше лише для розмірів проблем, які практично неможливо вирішити все одно. Якщо алгоритм A перемагає алгоритм B, але лише для проблем, де кожен бере1015 років і більше, тоді A не дуже корисний.

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