Asumsikan Anda mendapatkan angka (menggunakan bit dalam pengkodean biner).
Seberapa cepat Anda dapat menemukan (atau menentukan tidak ada) ?
Sebagai contoh, mengingat input , seseorang dapat menghasilkan .n = 27 , k = 10
Algoritma naif untuk masalah akan membahas semua nilai yang mungkin untuk , dan mencari nilai yang memenuhi properti.k
Pengamatan sederhana adalah bahwa tidak perlu memeriksa nilai lebih kecil dari atau lebih besar dari . Namun (bahkan jika kita hanya dapat memeriksa O (1) nilai k yang mungkin per nilai n ) ini berakhir dengan algoritma yang tidak efisien yang eksponensial dalam ukuran input.
Suatu pendekatan alternatif adalah memeriksa nilai (cukup untuk memeriksa ) dan untuk setiap pemeriksaan untuk kemungkinan nilai. Kita kemudian dapat menggunakan:
Jadi untuk tertentu, kita hanya perlu memeriksa nilai dalam rentang , Melakukan hal itu menggunakan pencarian biner (ketika diperbaiki, n \ pilih k meningkat secara monoton dalam n ), ini memberikan algoritma polinomial yang berjalan di O (\ log ^ 2 m) .n [ k √k ( n nO(log2m)
Ini masih tampak tidak efisien bagi saya dan saya kira ini dapat diselesaikan dalam waktu linier (dalam ukuran input).
Jawaban:
Tidak benar bahwa(n−k)k<(nk) . Misalnya (92)=36<49=(9−2)2 .
Saya belum (belum) menemukan solusi halus menggunakan properti aritmatika dari koefisien binomial, namun saya dapat menyarankan yang agak bruteforce jika itu membantu :-)
Anda dapat, untuk setiap , menyelesaikan untuk dengan mengambil tebakan awal (katakanlah ) dan menggunakan metode analitis seperti Newton-Raphson. Anda ingin menyelesaikan . Turunan dari sisi kiri sehubungan dengan adalah mana adalah fungsi digamma, yang mudah untuk dihitung .n k √k n ( nk!⋅m−−−−−√k n(ψ(n+1)-ψ(n-k+1)) ( n(nk)−m=0 n ψ(ψ(n+1)−ψ(n−k+1))(nk) ψ
Kompleksitas pencarian Newton-Raphson hanya tergantung pada kompleksitas komputasi fungsi dan turunannya, dan jumlah digit yang diperlukan untuk solusi (dalam kasus kami, kami hanya membutuhkan bilangan bulat terdekat).
Jadi secara keseluruhan untuk setiap pencarian harus (dengan asumsi, seperti yang tampaknya telah Anda lakukan, bahwa menghitung koefisien binomial membutuhkan waktu yang konstan), maka total kompleksitas untuk algoritma menggunakan batas Anda untuk adalah .O ( 1 ) k O ( log ( m ) )k O(1) k O(log(m))
sumber