Angenommen, Sie erhalten eine Zahl (unter Verwendung von Bits ( log m ) in binärer Codierung).
Wie schnell können Sie finden (oder feststellen, dass es solche nicht gibt) ?
Beispielsweise kann man bei der Eingabe ausgeben .
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.
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.
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:
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 [ k √k ( n 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.