Sebuah urutan biner dengan panjang hanya memerintahkan urutan sehingga setiap adalah baik atau . Untuk menghasilkan semua urutan biner seperti itu, seseorang dapat menggunakan struktur pohon biner yang jelas dengan cara berikut: root adalah "kosong", tetapi setiap anak kiri terkait dengan penambahan ke string yang ada dan setiap anak kanan ke . Sekarang, setiap urutan biner hanyalah jalur dengan panjang mulai dari akar dan berakhir pada daun.x 1 , … , x n x j 0 1 0 1 n + 1
Inilah pertanyaan saya:
Bisakah kita melakukan lebih baik jika kita hanya ingin menghasilkan semua string biner dengan panjang yang memiliki nol dan ?n n
Dengan "bisakah kita melakukan yang lebih baik", maksud saya kita harus memiliki kompleksitas yang lebih rendah daripada algoritma konyol yang pertama membangun seluruh pohon di atas dan kemudian mencoba untuk menemukan jalur tersebut dengan jumlah yang sama dari tepi "kiri" dan "kanan".
sumber
Jawaban:
Jelas ada string biner dengan panjang . Untuk melintasi biner suatu algoritma harus mengunjungi setiap simpul sekali, yaitu harus dilakukan langkah-langkah. 2 n 2 n ∑ i = 0 2 i = 2 2 n + 1 - 1 = O ( 4 n )4n 2n
Mari kita pertimbangkan algoritma rekursif yang melintasi pohon yang Anda jelaskan, tetapi menghitung jumlah satu dan nol pada jalannya, yaitu hanya akan melintasi bagian yang baik dari pohon.n n n 2n
Tetapi berapa banyak string biner dengan 0 dan 1 yang ada? Kami memilih 1 untuk string panjang kami dan menggunakan rumus Stirling di langkah 2: n n 2 n ( 2 n
EDIT
Berkat komentar Peter Shor kami juga dapat menganalisis jumlah langkah yang dibutuhkan oleh algoritma kedua, yang menghitung 1 dan 0. Saya mengutip komentarnya dari bawah:
Menggunakan rumus Stirling lagi kita mendapatkan sebagai waktu berjalan dari algoritma baru.
sumber
Mungkin saya sedang tebal, tetapi pertanyaan awal meminta cara untuk menghasilkan semua "biner" urutan 2n panjang yang lebih efisien daripada melintasi pohon dari semua urutan biner panjang 2n dan hanya menghasilkan yang seimbang. Jadi mengapa menggunakan pohon?
Inilah pseudocode untuk algoritma rekursif yang menghasilkan semua urutan seperti itu (kata kunci "hasil" mengirimkan urutan ke output):
Jika saya salah paham tentang sesuatu, tolong beritahu saya, tetapi menurut saya ini adalah jawaban paling efisien untuk masalah yang diajukan, yang tidak pernah menyebutkan penggunaan pohon.
sumber