Komplexität der Ermittlung des Binomialkoeffizienten, der einer Zahl entspricht

19

Angenommen, Sie erhalten eine Zahl m (unter Verwendung von O(logm) Bits ( log m ) in binärer Codierung).

Wie schnell können Sie finden (oder feststellen, dass es solche nicht gibt) ?

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

Beispielsweise kann man bei der Eingabe ausgeben .m=8436285n=27,k=10


Ein naiver Algorithmus für das Problem würde alle möglichen Werte für durchgehen und nach einem Wert von suchen, der die Eigenschaft erfüllt.nk

Eine einfache Beobachtung ist, dass es nicht notwendig ist, Werte von kleiner als oder größer als zu überprüfen . Dies führt jedoch (selbst wenn wir nur mögliche Werte pro Wert prüfen könnten ) zu einem ineffizienten Algorithmus, der in der Eingangsgröße exponentiell ist.nlogmO(m)O(1)kn

Ein alternativer Ansatz wäre, die möglichen Werte von zu überprüfen (es ist ausreichend, zu überprüfen) und bei jeder Überprüfung nach möglichen Werten zu suchen. Wir können dann verwenden: k{2,3,,2logm}n

(nk)k<(nk)<nkk!

Für ein gegebenes wir also nur n Werte im Bereich [\ sqrt [\ leftroot {-2} \ uproot {2} k] {m \ cdot k!}, \ Sqrt [\ leftroot {-2} \ prüfen. Entwurzeln {2} k] {m} \ cdot {k}] , Verwenden Sie dazu die Binärsuche (wenn k festgelegt ist, erhöht sich n \ choose k monoton in n ), um einen Polynomalgorithmus zu erhalten, der in O (\ log ^) ausgeführt wird 2m) .n [ kknk ( n[mk!k,mkk]k nO(log2m)(nk)nO(log2m)

Dies scheint mir immer noch ineffizient zu sein und ich vermute, dass dies in linearer Zeit (in der Eingabegröße) gelöst werden könnte.

RB
quelle
4
Was hast du bisher versucht? Hinweis: Angenommen, es wurde auch angegeben. Könnten Sie das dann lösen? Was ist der Bereich der möglichen Werte für ? Oder nehmen wir an, sei gegeben; könntest du es in diesem Fall lösen? Was ist der Bereich der möglichen Werte für ? nnnkkk
DW

Antworten:

1

Es ist nicht wahr, dass . Zum Beispiel .( 9(nk)k<(nk)(92)=36<49=(92)2

Ich habe (noch) keine subtile Lösung gefunden, die die arithmetischen Eigenschaften der Binomialkoeffizienten verwendet, aber ich kann eine etwas bruteforce vorschlagen, wenn das hilft :-)

Sie können für jedes nach , indem Sie eine anfängliche Vermutung anstellen (sagen Sie ) und eine analytische Methode wie Newton-Raphson verwenden. Sie möchten lösen . Die Ableitung der linken Seite in Bezug auf ist wobei die Digammafunktion ist, die leicht zu berechnen ist .n k kn( nk!mkn(ψ(n+1)-ψ(n-k+1)) ( n(nk)m=0n ψ(ψ(n+1)ψ(nk+1))(nk)ψ

Die Komplexität einer Newton-Raphson-Suche hängt nur von der Komplexität der Berechnung der Funktion und ihrer Ableitung sowie von der Anzahl der für die Lösung erforderlichen Ziffern ab (in unserem Fall benötigen wir nur die nächste Ganzzahl).

Insgesamt sollte die Suche für jedes also (unter der Annahme, dass die Berechnung eines Binomialkoeffizienten eine konstante Zeit in Anspruch nimmt), daher wäre die Gesamtkomplexität für den Algorithmus, der Ihre Grenzen für , .O ( 1 ) k O ( log ( m ) )kO(1)kO(log(m))

David Durrleman
quelle
2
Kannst du erklären, warum die Suche bei dauert, ich damit einverstanden bin, dass die Grenzen nicht stimmen (siehe Bearbeiten, danke dafür ? O ( 1 )kO(1)
RB