Pencarian array elemen menggunakan pencarian biner, dalam kasus terburuk iterasi karena, pada setiap langkah kita memotong setengah dari ruang pencarian kita. Jika, sebagai gantinya, kami menggunakan 'pencarian ternary', kami akan memotong dua pertiga dari ruang pencarian kami di setiap iterasi, jadi kasus terburuk harus mengambil iterasi ...
Tampaknya pencarian ternary lebih cepat, jadi mengapa kita menggunakan pencarian biner?
algorithms
algorithm-analysis
runtime-analysis
search-algorithms
binary-search
The Mean Square
sumber
sumber
Jawaban:
Jika Anda menerapkan pencarian biner, Anda memiliki banyak perbandingan. Jika Anda menerapkan pencarian ternary, Anda memiliki banyak perbandingan, seperti pada setiap langkah, Anda perlu melakukan 2 perbandingan untuk memotong ruang pencarian menjadi tiga bagian. Sekarang jika Anda , Anda dapat mengamati bahwa: Karena kita tahu bahwa , kita benar-benar mendapatkan lebih banyak perbandingan dengan pencarian ternary.
Ngomong-ngomong: pencarian dapat membuat banyak akal jika perbandingan cukup mahal dan dapat diparalelkan, karena itu, komputer paralel dapat diterapkan.n
Perhatikan bahwa argumen dapat digeneralisasikan ke pencarian cukup mudah. Anda hanya perlu menunjukkan bahwa fungsi benar-benar meningkat monoton untuk nilai integer .n f(k)=(k−1)⋅log(2)log(k) k
sumber
DCTLib benar, tapi lupakan matematika sebentar.
Dengan logika Anda kemudian, n -ary harus menjadi yang tercepat. Tetapi jika Anda memikirkannya, n -ary sama persis dengan pencarian iterasi reguler (hanya mengulangi daftar 1 per 1, tetapi dalam urutan terbalik). Pertama Anda memilih item terakhir (atau berikutnya ke terakhir) dalam daftar dan membandingkan nilai itu dengan nilai perbandingan Anda. Kemudian Anda menghapus item itu dari daftar Anda, dan kemudian memilih item terakhir di daftar baru, yang merupakan nilai terakhir berikutnya dalam array. Setiap kali, Anda hanya akan menghilangkan 1 nilai pada satu waktu sampai Anda menemukan nilai Anda.
Sebagai gantinya, Anda harus memikirkannya seperti ini - bagaimana cara menghilangkan nilai terbanyak dari daftar setiap iterasi? Dalam pencarian biner, Anda selalu menghilangkan setengah daftar. Dalam pencarian ternary, ada kemungkinan (33.33% peluang, sebenarnya) bahwa Anda dapat menghilangkan 2/3 dari daftar, tetapi ada peluang yang lebih besar (66.66%) bahwa Anda hanya akan menghilangkan 1/3 dari daftar. untuk menghitung O (n), Anda perlu melihat skenario terburuk, yaitu 1/3, kurang dari 1/2. Saat Anda semakin dekat dan semakin dekat dengan n, semakin buruk.
Skenario terburuk tidak hanya akan ditingkatkan dengan pencarian biner, tetapi waktu rata - rata Anda juga akan ditingkatkan. Melihat nilai yang diharapkan (bagian mana dari daftar yang dapat kami hapus secara rata-rata), kami menggunakan rumus ini:
(P_lower) x (bagian yang bisa kita hapus jika lebih rendah) + (P_higher) x (bagian yang bisa kita hapus jika lebih tinggi) = E
Untuk pencarian biner, ini adalah .5x.5 + .5x.5 = .5 (kami selalu menghapus setengah daftar). Untuk pencarian ternary, nilai ini adalah .666x.333 + .333x.666 = 0.44, atau pada setiap langkah, kami kemungkinan hanya akan menghapus 44% dari daftar, menjadikannya kurang efisien daripada pencarian biner, rata-rata. Nilai ini memuncak pada 1/2 (setengah daftar), dan mengurangi semakin dekat Anda ke n (iterasi terbalik) dan 0 (iterasi reguler).
Ok, jadi saya berbohong..ada sedikit matematika yang terlibat, tapi saya harap itu membantu!
sumber
Harap perhatikan argumen perbandingan log (N) vs 2 log (N) didasarkan pada interpretasi naif dari algoritma. Jika saya benar-benar duduk dan menulis ini di x86 assembly, hasilnya akan terbalik. Masalahnya adalah penggunaan bilangan bulat untuk kasus uji yang dikombinasikan dengan kompiler cerdas yang tidak cukup yang tidak dapat menghapus perbandingan yang berlebihan. Coba lagi dengan string dan fungsi perbandingan string yang sesuai, dan kode untuk memanggil fungsi perbandingan sekali per loop dan Anda akan menemukan pencarian ternary lebih cepat lagi.
sumber