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


19

Припустимо, ви отримуєте число (використовуючи біти у двійковому кодуванні).O ( журнал m )mO(logm)

Як швидко ви можете знайти (або визначити, що такого не існує) ?

n,kN,1<kn2:(nk)=m

Наприклад, враховуючи вхід m=8436285 , можна вивести n=27,k=10 .


Наївний алгоритм проблеми переходив би всі можливі значення n і шукав значення k яке задовольняє властивість.

Просте спостереження полягає в тому, що немає необхідності перевіряти значення n менше logm або більше O(m) . Однак (навіть якщо ми могли перевірити лише O(1) можливі значення k на n значення), це виявляється в неефективному алгоритмі, який є експоненціальним у вхідному розмірі.

Альтернативним підходом було б перейти можливі значення k (достатньо перевірити {2,3,,2logm} ) і для кожної перевірки можливих n значень. Тоді ми можемо використовувати:

(nk)k<(nk)<nkk!

Отже, для заданого k нам потрібно лише перевірити n значень у діапазоні [mk!k,mkk] , роблячи це за допомогою двійкового пошуку (коли k зафіксовано, (nk) монотонно зростає на n ), це дає поліноміальний алгоритм, що працює в O(log2m) .

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


4
Що ви пробували поки що? Підказка: Припустимо , теж було дано n . Чи могли ви тоді це вирішити? Який діапазон можливих значень для n ? Або, припустимо, дано k ; ви могли б вирішити це в такому випадку? Який діапазон можливих значень для k ?
DW

Відповіді:


1

Неправда, що (nk)k<(nk) . Наприклад (92)=36<49=(92)2 .

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

Ви можете для кожного вирішити для , взявши початкову здогадку (скажімо ) та використовуючи аналітичний метод, такий як Ньютон-Рафсон. Ви хочете вирішити . Похідна лівої сторони відносно дорівнює де - функція digamma, яку легко обчислити .n k kn( nk!mkn(ψ(n+1)-ψ(n-k+1)) ( n(nk)m=0n ψ(ψ(n+1)ψ(nk+1))(nk)ψ

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

Таким чином, для кожного пошук повинен бути (якщо, мабуть, ви робили, що обчислення двочленного коефіцієнта вимагає постійного часу), отже, загальна складність алгоритму, що використовує ваші межі для , буде .O ( 1 ) k OkO(1)kO(log(m))


2
Хоча я згоден, межі були вимкнені (див. Редагування, спасибі за це), чи можете ви пояснити, чому пошук за даними займає ? O ( 1 )kO(1)
РБ
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.