Як можна припустити, що основні операції над числами займають постійний час?


73

Зазвичай в алгоритмах нам не байдуже порівняння, додавання чи віднімання чисел - ми припускаємо, що вони працюють у часі . Наприклад, ми припускаємо це, коли говоримо, що сортування на основі порівняння - це , але коли числа занадто великі, щоб вписатись у регістри, ми зазвичай представляємо їх як масиви, тому основні операції вимагають додаткових обчислень на елемент.O(1)O(nlogn)

Чи є докази, що свідчать про те, що порівняння двох чисел (або інших примітивних арифметичних функцій) можна виконати в ? Якщо ні, то чому ми говоримо, що сортування на основі порівняння - це ?O(1)O(nlogn)


Я зіткнувся з цією проблемою , коли я відповів на SO питання , і я зрозумів , що мій алгоритм НЕ , тому що рано чи пізно я повинен мати справу з великим-ІНТОМ, і це не було алгоритм псевдополіноміального алгоритму, це був .O(n)P


3
Якщо ви збираєтеся рахувати складність порівняння чисел, ви також повинні записати свої межі складності з точки зору бітового розміру вводу. Таким чином, з урахуванням -бітних чисел, розмір біта вводу і сортування може бути виконано за час . N wn=NwO(NwlogN)=O(nlogn)
Сашо Ніколов

2
в основному є дві "сфери" або "режими" вивчення складності. як правило, операції передбачаються для операцій "фіксованої ширини", що є розумним наближенням для більшості мов комп'ютерів, які мають представлення чисел фіксованої ширини, у тому числі для плаваючої точки, наприклад, 2-4 байти (див., наприклад, стандарти IEEE). тоді є "довільна арифметика точності", де числа мають довільний розмір і є більш ретельне / точне вивчення складності операцій. перший контекст більше в прикладному аналізі, а другий - в теоретичному / абстрактному аналізі. O(1)
vzn

Відповіді:


75

Для таких людей, як я, які вивчають алгоритми для життя, стандартною моделлю обчислень 21 століття є ціла ОЗП . Модель призначена для відображення поведінки реальних комп'ютерів точніше, ніж модель машини Тьюрінга. Комп'ютери в реальному світі обробляють багатобітні цілі числа в постійному часі, використовуючи паралельне обладнання; НЕ довільні цілі числа, але (оскільки розміри слів неухильно зростати з плином часу) НЕ фіксований розмір цілих чисел, або.

Модель залежить від одного параметра , який називається розміром слова . Кожна адреса пам'яті містить одне бітове ціле число або слово . У цій моделі розмір вводу - це кількість слів на вході, а час виконання алгоритму - кількість операцій над словами . Стандартні арифметичні операції (додавання, віднімання, множення, цілочисельне ділення, залишок, порівняння) і логічні операції (побітові і, або, XOR, зрушення, поворот) на словах вимагають часу за визначенням .wwnO(1)

Формально розмір слова НЕ є постійноюw для аналізу алгоритмів у цій моделі. Щоб модель відповідала інтуїції, нам потрібно , оскільки в іншому випадку ми навіть не можемо зберегти ціле число в одному слові. Тим не менш, для більшості нечислових алгоритмів час роботи фактично не залежить від , оскільки ці алгоритми не переймаються базовим двійковим поданням їх вводу. І Mergesort, і гипсорт виконуються в час; серединний-3-квакісорт працює в час, в гіршому випадку. Одним з помітних винятків є двійковий сорт радіакса, який працює в час.wlog2nnwO(nlogn)O(n2)O(nw)

Встановлення дає нам традиційну модель RAM з логарифмічною вартістю. Але деякі цілочисельні алгоритми оперативної пам’яті розроблені для великих розмірів слів, як алгоритм сортування цілочисельних лінійних ліній за часом Andersson та ін. , що вимагає .w=Θ(logn)w=Ω(log2+εn)

Для багатьох алгоритмів, які виникають на практиці, розмір слова просто не є проблемою, і ми можемо (і ми можемо) повернутися до набагато простішої моделі оперативної пам'яті з однорідною вартістю. Єдина серйозна складність полягає у вкладеному множенні, яке може бути використане для створення дуже великих цілих чисел дуже швидко. Якби ми могли виконати арифметику на довільних цілих числах у постійному часі, ми могли б вирішити будь-яку проблему в PSPACE у поліноміальний час .w

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

Так, це банка з глистами.


3
Я знаю, що я просто повинен проголосувати, але не можу зупинити себе від цього: Це найкраща відповідь. Хитрість полягає в тому, що (1) арифметичні операції є постійним часом за визначенням, і це нормально, тому що теоретично ви можете вибрати будь-яку модель, і (2) у вас повинні бути деякі причини вибору певної моделі, і ця відповідь пояснює, що вони є.
rgrig

Я погоджуюся з rgig, (також я просто повинен голосувати), але невелика проблема полягає в тому, що розмір вводу не пов'язаний з вхідними номерами, наприклад, якщо у мене вхід, моє найбільше число , і якщо я вибираю модель обчислення як мені подобається, це призводить до того, що алгоритм часу псевдополінома став , я прав? nmP

1
Якщо ваш вхід складається з чисел з більш ніж бітів, то для відповідності моделі вам потрібно розділити їх на бітні шматки, як і в реальному житті. Наприклад, якщо ваш вхід складається з цілих чисел між і , то ваш справжній розмір вводу - . Таким чином, час роботи псевдополінома, такий як час , все ще є експоненціальним у вхідному розмірі, коли великий. wwN0MNlogwM=(NlgM)/(lgw)O(NM)M
JeffE

Чи є якісь алгоритми, проаналізовані в моделі реальної оперативної пам’яті, які не є таємними алгоритмами «Тип оперативної пам'яті» Я ніколи про це не думав багато, але не можу швидко придумати такий приклад.
Луї

1
@Louis: Так, багато: діаграми Voronoi, найкоротші шляхи евкліда, рекурсивні живці, спрощені дерева перегородок, .... Але найкращим прикладом є елімінація Гаусса, яка працює в час на реальній моделі оперативної пам'яті (або ціла оперативна пам’ять на одиницю вартості, але для цілої оперативної пам’яті потрібен час .O(n3)O(n4)
JeffE

24

Це просто залежить від контексту. Маючи справу зі складністю алгоритмів бітового рівня , ми не скажемо, що додавання двох бітних чисел є , ми говоримо, що це . Аналогічно для множення тощо.nO(1)O(n)


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

1
@SaeedAmiri: це просто залежить від використовуваного кодування. Наприклад, у статті, якщо вхід є цілим числом визначеним за допомогою унарного кодування, для пробного поділу буде потрібно лише . Це многочлен за розміром входу! Чи означає це, що факторинг шляхом пробного поділу знаходиться в ? Ні, алгоритм псевдополіном . Використовуючи загальне бінарне кодування, ви отримуєте експоненціальний алгоритм, знову ж таки, за розміром вводу. Як було сказано, це відбувається тому, що кількість бітів на вході стала експоненціально меншою, змінюючи його кодування. nθ(n1/2)Pn
Массімо Кафаро

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

По-перше, я повинен зазначити, що ваша посилання на вікі-сторінку не є хорошою, оскільки на неї немає хороших посилань. Крім того, я не знаю, чому ви думаєте, що я говорю про алгоритми часу псевдополінома, можливо, тому що розмір вводу зазвичай є buttleneck в цьому випадку? але я не говорю про них, я говорю здебільшого про проблеми, які є в навіть якщо вважати розмір вводу, як-от сортування, так чи інакше, тому що ми не можемо обдурити і сказати, що проблема NPC є в Я думаю, ми не повинні скажімо, сортування - це за винятком того, що ми маємо офіційний доказ ігнорувати порівняння. PPO(nlogn)

Я обговорюю алгоритми псевдополіномів, щоб зосередити вашу увагу на розмірі вводу, щоб показати вам, що це може ввести в оману. Ось ще один приклад. Вам дається натуральне число як вхід, скажімо, , і алгоритм виконує цикл, в якому він виконує операції часу для ітерацій. Складність цього простого алгоритму циклу, виміряного як функція від вхідного розміру, становить . Оскільки - вхідний розмір, алгоритм експоненціальний у вхідному розмірі! Подумайте над цим. Тепер ви можете зрозуміти, що я маю на увазі під "Це просто залежить від контексту". nO(1)nO(n)=O(2lgn)lgn
Массімо Кафаро

16

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

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

Щоб відповісти на неявні подальші дії щодо числових алгоритмів: Ні, звичайна стара модель оперативної пам'яті тут не є стандартом. Навіть усунення Гаусса може зажадати певної обережності. Як правило, для рангових обчислень вводиться лемма Шварца (наприклад, Розділ 5 тут ). Ще один канонічний приклад - аналіз алгоритму Еліпсоїда, який потребує певного ретельного аналізу.

І нарешті: люди думали про сортування рядків і раніше , навіть недавно.

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


Гмммм, здається, це цікава відповідь ....

Чи є причина, що вона не відповідає повністю на питання?
Луї

7

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

Це абсолютно не законні оцінки (Не в останню чергу тому , що це Python), але ось деякі цифри від бігу python -mtimeit "$a * $b"на $aв і . (Я зупинився на 66, тому що тоді синтаксис Python перестає приймати цілі літерали, і мені доведеться трохи переключити свій код оцінки, так що я цього не зробив.: P)10{1,2,...,66}$b = 2*$a

Кожне число - це середнє значення в 10 000 000 циклів, де найкраще проводити 3 пробігу в кожному циклі. Я б робив смужки помилок чи щось таке, але це докладе більше зусиль. : p У будь-якому випадку для мене це виглядає досить постійним, навіть до - трохи дивно, оскільки 43, що підсилює мою підозру, що, можливо ця оцінка особливо хитра, і я повинен робити це в C.1050log10(sys.maxint)


Ви можете мати досвід роботи в цьому спеціальному випадку, ви праві (але я не впевнений :), але, наприклад, погляньте на це , здається, це але це не так, це також є практичною проблемою. Ви також бачили будь-який папір, в якому говориться про сортування ? O(n)O(nlognlogm)

7

Ви маєте рацію, загалом ми не можемо припустити, що вони .O(1)

Строго кажучи, якщо ми хочемо сортувати масив з N чисел за допомогою порівнянь, а найбільше число - M, то в гіршому випадку кожне порівняння може включати порівняння на рівні бітів. І якщо наш алгоритм порівнює , то його загальна складність буде .O ( N log N ) O ( N log N log M )O(logM)O(NlogN)O(NlogNlogM)

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


O ( log n ) mO(logm) не , я маю на увазі найбільше число у наборі . O(logn)m

Так, але якщо для сортування існує N РІЗНИХ чисел, то розмір найбільшого - біт. O(logN)
Ерел Сегал-Халеві

Ні, це не пов’язано з кількістю вводу, також якщо ви хочете пов’язати його з кількістю вводу, у мене номер вводу, а найбільший -n n nnnnn

Ви маєте рацію, я виправив свою відповідь.
Ерел Сегал-Халеві

4

Я б сказав, що ми зазвичай припускаємо арифметичні операції O (1), оскільки ми зазвичай робимо речі в контексті 32-бітових цілих чисел чи 64-бітових цілих чисел або чисел з плаваючою точкою IEEE 754. O (1), мабуть, є досить хорошим наближенням для такого роду арифметики.

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

Ви можете переглянути терміни лямбда-числення для віднімання та ділення з числами Церковних чисел, щоб легко зрозуміти, чому ці дві операції не є O (1). Трохи важче бачити додавання та множення та експоненцію, але це є, якщо врахувати форму самих церковних чисел.

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