Чому б не взяти одинарне представлення чисел у числових алгоритмах?


15

Алгоритм псевдополінома часу - це алгоритм, який має поліноміальний час роботи на вхідному значенні (величині), але експоненціальний час роботи на вхідний розмір (кількість біт).

Наприклад , тестування , є чи число є простим чи ні, вимагає через петлю чисел від 2 до п - 1 і перевірити , якщо п мод я дорівнює нулю чи ні. Якщо мод займає час O (1), загальна часова складність буде O (n).nn1n i

Але якщо дозволити x кількість необхідних бітів, щоб записати вхід, то x=logn (двійковий), так n=2x і час запуску задачі буде O ( 2x ), що є експоненціальним.

Моє запитання полягає в тому, якщо ми розглянемо нерівномірне подання вводу n , то завжди x=n і тоді псевдополіномальний час буде дорівнює складності багаточленного часу. То чому ми ніколи цього не робимо?

Крім того, оскільки існує псевдополіномальний алгоритм часу для рюкзака, приймаючи x=n , рюкзак буде поліноміальним у результаті P = NP


3
Власне, ми робимо це, просто не дуже часто. З тих же причин ми зазвичай не маємо справу з одинарними мовами, але є багато цікавих результатів, пов'язаних з цими звірами. Ви заглянули в це?
Андре Суза Лемос

2
Так, якщо ви забираєте різницю між розміром і величиною, ви втрачаєте всі поняття, які висуваються на цій різниці.
Андре Суза Лемос

7
Тому що це одягає демона в гарне плаття. Це не робить нічого швидшого, лише робить «складність часу роботи» безглуздою.
Рафаель

4
@Drupalist Проблема одинарного рюкзака насправді не відома як NP-завершена, оскільки нормальне зменшення проблеми рюкзака передбачає, що числа виписуються у двійковій формі. Якщо ви спробуєте виконати стандартне скорочення, але записати числа не одинаково, зменшення не можна обчислити в поліноміальний час. Як результат, проблема, що вирішиться в поліноміальний час, не може означати, що P = NP.
templatetypedef

2
Ви можете перевірити інші відповіді, позначені псевдополіномом , зокрема цю .
Рафаель

Відповіді:


17

Це означає, що одинарний рюкзак є в P. Це не означає, що рюкзак (з двійковими кодованими числами) знаходиться в P.

Рюкзак, як відомо, завершений NP. Якби ви показали, що рюкзак знаходиться в P, це показало б, що P = NP.

Але ви не показали, що рюкзак є в P. Ви показали, що одинарний рюкзак є в P. Однак не відомо, що одинарний рюкзак є NP-повним (дійсно, стандартна підозра на те, що він, швидше за все, не є NP-повним ). Тому введення одинарного рюкзака в P не означає, що P = NP.


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


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

Так, той самий алгоритм динамічного програмування може бути застосований як до рюкзаків, так і до одинарного рюкзака. Час його роботи є многочленом за величиною чисел, але експоненціальним (а не многочленом) у довжині чисел при кодуванні у двійкові. Таким чином, час його роботи є многочленом у довжині входу, коли вхід кодується одинарним, але не є многочленом у довжині входу, коли вхід кодується у двійковій формі. Ось чому ми дійсно розглянути цей алгоритм динамічного програмування бути поліноміальних алгоритмом для одномісний рюкзаку, але НЕ вважаємо , що це поліноміальний алгоритм (бінарної кодуванням) ранець.

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


1
Дякую велике, я не знав, що клас складності унарного та неонарного одного і того ж алгоритму може бути різним. Чому рішення динамічного програмування стандартного рюкзака не можна застосувати до одинарного рюкзака, і це призвело до різного класу складності? У мене виникають проблеми з розумінням одинарної версії проблем.
M ama D

@Drupalist, я змінив свою відповідь, щоб додати два абзаци наприкінці, щоб відповісти на це запитання.
DW

x=n

x=n

1
@NikosM. ОК, зрозумів. Дякуємо за відгук. Особисто я не вважаю, що це твердження є невірним, тому я збираюся залишити його таким, яким він є. (Мої міркування: тривалість введення залежить від вибору представлення, тому я не вірю, що це суперечить тому, що ви написали.) Однак цілком можливо, моя точка зору може бути занадто вузькою, або що більш детальне пояснення чи пояснення з інша перспектива може додати значення. Не соромтесь написати додаткову відповідь або запропонувати редагувати, якщо ви вважаєте, що це може бути зрозумілішим.
DW

6

Я відповів би одній дрібницею у відповідь DW:

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

W={w1,,wn}kO(nk)

O(nk)

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

Але це лише тоді, коли ми маємо справу з ізольованою проблемою. Це не корисно, коли ми маємо справу з проблемами з різними видами входів. Для графіків ми можемо говорити про час роботи wrt до кількості вершин і ребер. Для Рюкзака ми можемо поговорити про кількість предметів та розмір Рюкзака. Але що робити, якщо ми хочемо поговорити про обидва? Наприклад, коли ми хочемо зменшити між проблемами або обговорити клас задач, що включає довільні проблеми, а не лише ті, у яких вхідний графік. Нам потрібен універсальний параметр входів. Вхід взагалі - це лише рядок, саме ми інтерпретуємо його символи як уніарні числа, двійкові числа, графіки тощо. Для розробки загальної теорії складності алгоритму та задач нам потрібен загальний параметр входів. Розмір вхідних даних є очевидним вибором, і він виявляється досить надійним, що ми можемо побудувати на ньому розумну теорію. Це не єдина можливість. Для штучного ми можемо побудувати теорію на основі2

k100100k21001kk21001

nnp(n)kp(n)k2p(n)1kk

nk


Щиро дякую, ще одне запитання, перетворивши вхід у його одинакове подання, що буде з проблемою визначення, чи є число простим чи ні? Ця проблема є поліноміальною на основі вхідної величини, але експоненціальна на основі вхідних бітів (як я зазначив у запитанні), чи зробить це перетворення щось кращим?
M ama D

nO(n)nb=210241210241210241
Каве

приємне роз’яснення, проте подивіться на мій коментар під відповіддю DW, який пов’язаний з цим повідомленням
Нікос М.

2

Коротко і просто, я покажу вам, чому.

Tally

x = input integer

factors = [];

for i in range(1, x + 1):
    if x % i == 0:
     factors.append(i)

 print(factors)

xxO(2n)

Tally/UnaryO(n)x

x = input tallies

factors = [];

for i in range(1, x + 1):
    if x % i == 0:
     factors.append(i)

 print(factors)

Представлення вводу не змушує код працювати швидше. Незважаючи на те, що 2-й алгоритм справді багаторазовий. Це не дуже практично в пошуку факторів для RSA.


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