Pertanyaan: Diberi alami bit , bagaimana cara menghitung hanya menggunakan penambahan dan pergeseran (bit)?
Kiatnya adalah menggunakan pencarian biner. Namun, saya tidak dapat mencapai kompleksitas yang diperlukan (saya mendapat ).
Apa yang dimaksud dengan using only $O(n)$ (bit) additions and shifts
:
Ini adalah latihan dalam buku algoritma.
Menurut pendapat saya, itu berarti menambahkan dua, katakanlah bit, bilangan alami biaya dan menggeser, katakanlah bit, bilangan alami juga biaya . Maka kita hanya diperbolehkan menggunakan operasi kali.
Tidak disebutkan biaya perbandingan. Saya kira kita dapat mengabaikannya atau berasumsi bahwa membandingkan dua, katakanlah bit, bilangan alami juga berharga .
Saya algoritma :
- Tentukan kisaran jumlah bit dari :
Oleh karena itu,
t_1 \ triangleq \ lfloor \ frac {n-1} {2} \ rfloor + 1 \ le t \ le \ lceil \ frac {n} {2} \ rceil + 1 \ triangleq t_2.
- Pencarian biner: Temukan antara dan menggunakan pencarian biner. Untuk setiap nomor , untuk menghitung menggunakan penambahan dan pergeseran sebagai primitif dan membandingkannya dengan .
Kompleksitasnya adalah untuk kali pencarian biner dan komputasi , yang masing-masing membutuhkan penambahan dan pergeseran.
sumber
Apakah kita berbicara bilangan bulat di sini? Di mana N adalah n bit panjang?
Loop dilakukan n / 2 kali, yang seharusnya memberi Anda O (n) kinerja
Sunting: Bagaimana cara kerjanya, & mengapa?
Ini adalah versi Perkiraan Berturutan, yang juga digunakan dalam algoritma CORDIC.
Dimulai dengan bit tunggal terbesar yang mungkin (dengan kuadrat kurang dari N) Anda menetapkan satu bit pada suatu waktu, dan menghitung kuadrat baru.
Jika kuadrat baru masih kurang dari N, pertahankan bit sesuai set.
Jika kotak baru terlalu besar, bersihkan bitnya, batalkan efek menambahkannya, dan lanjutkan ke bit berikutnya.
Contoh: N = 441 (1 1011 1001 biner), n = 9
sumber
Metode utama adalah untuk mengisi bit dari kiri ke kanan sambil menjaga perkiraan kami di bawah ini, atau lebih tepatnya persegi perkiraan kami di bawah . Setiap bit adalah kekuatan 2, jadi mengkuadratkan atau mengalikan angka lain dengan selalu sedikit bergeser.N−−√ N b b
Jika perkiraan saat ini adalah , , dan kita sudah tahu , kita mendapatkan , dan kita dapat menulis ulang istilah kedua dan ketiga sebagai dan . Kami kemudian tambahkan semuanya dan tes (saya asumsikan Anda dapat melakukan ) dan set menggigit jika alun-alun masih di bawah .a b=2i a2 (a+b)2=a2+2ab+b2 a<<(i+1) 1<<(i<<1) < i N
Kita memulai loop di dan menghitung mundur ke nol, menjaga dan saat kita pergi. Ini semacam pencarian biner, tetapi di mana batas memetakan perbedaan bit-tunggal.i=n/2=n>>1 a a2
sumber
Saya suka jawaban Alan Campbell : dengan melacak dugaan sebelumnya dengan hati-hati, pengurangan baru itu mudah setiap kali, dan akar kuadrat-dan-tambah biner kira-kira sama cepatnya dengan pembagian-dan-tambah biner.
Tetapi dimungkinkan untuk lebih cepat, dengan alih-alih membuat tebakan Anda berikutnya satu digit biner, alih-alih menggunakan algoritma "Ab" x "Ab", dan membuat tebakan Anda berikutnya rata-rata dari tebakan Anda sebelumnya, dan angka asli dibagi oleh tebakan sebelumnya. Kedengarannya seperti itu akan memakan waktu lebih lama, bukan lebih pendek. Namun, pembagian itu tidak harus tepat. Jadi jika pembagian hanya berjalan ke akar kuadrat dari jumlah digit yang tersisa untuk ditemukan, maka Anda mungkin sebenarnya menghemat waktu. Selain itu, jika untuk divisi Anda, Anda menggunakan metode Prancis, divisi singkatan, maka Anda mungkin benar-benar memecahkan beberapa kecepatan dalam perhitungan Anda untuk pembagian yang sangat besar.
Sekarang, jika kita menambahkan perhitungan secara paralel yang menghasilkan hasil awal yang dapat diperbaiki sebelum jawabannya ditemukan ... maka kita mungkin menemukan sesuatu.
sumber