İkili kodlamada ( bit kullanarak bir sayı aldığınızı varsayın .
Ne kadar hızlı bulabilirsin (ya da böyle olmadığını tespit edebilirsin) ?
Örneğin, m = 8436285 girişi düşünüldüğünde , n = 27, k = 10 verilebilir .
Sorun için naif bir algoritma n için tüm olası değerleri aşacak ve özelliği karşılayan k değerini arayacaktır .
Basit bir gözlem, \ log m'den küçük veya O'dan (\ sqrt m) daha büyük n değerlerinin kontrol edilmesine gerek olmadığıdır . Bununla birlikte ( n değeri başına sadece O (1) olası k değerlerini kontrol edebilsek bile ) bu, giriş boyutunda üstel olan verimsiz bir algoritma ile sonuçlanır.
Alternatif bir yaklaşım, olası k değerlerini ( kontrol etmek) ve olası değerlerini kontrol etmek için yeterli olacaktır . Daha sonra şunu kullanabiliriz:
Bu nedenle, belirli bir için yalnızca [\ sqrt [\ leftroot {-2} \ uproot {2} k] {m \ cdot k!}, \ Sqrt [\ leftroot {-2} \ aralığındaki değerlerini kontrol etmemiz gerekir. , İkili arama kullanarak ( sabit olduğunda , select k monoton olarak n'de artar ), bu O (\ log ^ içinde çalışan bir polinom algoritması verir 2m) .
Bu hala benim için verimsiz görünüyor ve sanırım bu doğrusal zamanda (giriş boyutunda) çözülebilir.