Złożoność znalezienia współczynnika dwumianowego równego liczbie


19

Załóżmy, że otrzymujesz liczbę m (używając O(logm) bitów w kodowaniu binarnym).

Jak szybko można znaleźć (lub stwierdzić, że takie nie istnieje) ?

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

Na przykład, biorąc pod uwagę wejście , można wyprowadzić .m=8436285n=27,k=10


Naiwny algorytm dla problemu przekroczyłby wszystkie możliwe wartości dla i szukałby wartości która spełnia tę właściwość.nk

Prostą obserwacją jest to, że nie trzeba sprawdzać wartości mniejszych niż lub większych niż . Jednak (nawet gdybyśmy mogli sprawdzić tylko możliwe wartości na wartości) to kończy się to nieefektywnym algorytmem, który ma charakter wykładniczy w wielkości wejściowej.nlogmO(m)O(1)kn

Alternatywnym podejściem byłoby przekroczenie możliwych wartości (wystarczy sprawdzić ) i dla każdego sprawdzenia możliwych wartości. Następnie możemy użyć: k{2,3,,2logm}n

(nk)k<(nk)<nkk!

Więc dla danego musimy tylko sprawdzić wartości z zakresu , w ten sposób za pomocą przeszukiwanie binarne (gdy jest stałą, jest monotonicznie rosnącą w ), co daje wielomian algorytm działa w .kn[mk!k,mkk]k(nk)nO(log2m)

Nadal wydaje mi się to nieefektywne i myślę, że można to rozwiązać w czasie liniowym (w wielkości wejściowej).


4
Czego spróbowałeś do tej pory? Wskazówka: Załóżmy, że podano również . Czy mógłbyś to rozwiązać? Jaki jest zakres możliwych wartości dla ? Lub załóżmy, że podano ; czy możesz to rozwiązać w takim przypadku? Jaki jest zakres możliwych wartości dla ? nnkk
DW

Odpowiedzi:


1

Nie jest prawdą, że . Na przykład .(nk)k<(nk)(92)=36<49=(92)2

Nie znalazłem (jeszcze) subtelnego rozwiązania wykorzystującego właściwości arytmetyczne współczynników dwumianowych, jednak mogę zasugerować nieco brutalny, jeśli to pomoże :-)

Możesz dla każdego rozwiązać dla , przyjmując początkowe domysły (powiedz ) i stosując metodę analityczną, taką jak Newton-Raphson. Chcesz rozwiązać . Pochodną lewej strony w odniesieniu do jest gdzie jest funkcją digamma, którą łatwo obliczyć .knk!mk(nk)m=0n(ψ(n+1)ψ(nk+1))(nk)ψ

Złożoność wyszukiwania Newtona-Raphsona zależy tylko od złożoności obliczenia funkcji i jej pochodnej oraz liczby cyfr wymaganych do rozwiązania (w naszym przypadku potrzebujemy tylko najbliższej liczby całkowitej).

Tak więc ogólnie dla każdego wyszukiwanie powinno być (zakładając, jak się wydaje, że obliczenie współczynnika dwumianowego zajmuje stały czas), stąd całkowita złożoność algorytmu wykorzystującego twoje granice dla byłaby .kO(1)kO(log(m))


2
Chociaż zgadzam się, że granice były wyłączone (patrz edycja, dzięki za to), czy możesz wyjaśnić, dlaczego wyszukiwanie, biorąc pod uwagę bierze ? kO(1)
RB
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.