Pencarian interpolasi vs Pencarian Biner


13

Kapan saya harus menggunakan pencarian interpolasi daripada pencarian biner?

Misalnya, saya memiliki dataset yang diurutkan, dalam situasi apa saya akan menggunakan pencarian biner untuk menemukan item dalam dataset ini atau dalam situasi apa saya harus menggunakan pencarian interpolasi?

Properti apa dari dataset yang akan menjadi faktor penentu?

Jawaban:


12

Jelas, untuk melakukan pencarian interpolasi, Anda memerlukan beberapa jenis kunci yang diketahui lebih dari pemesanan - Anda harus dapat melakukan perhitungan pada tombol untuk memperkirakan jarak yang mungkin, tidak hanya membandingkan kunci untuk menentukan mana yang lebih besar atau lebih rendah.

Sejauh properti dari dataset pergi, itu sebagian besar datang ke satu properti: kemungkinan bahwa tombol yang cukup merata (atau setidaknya diduga) didistribusikan ke seluruh berbagai kemungkinan. Tanpa itu, pencarian interpolasi sebenarnya bisa lebih lambat dari pencarian biner.

Misalnya, pertimbangkan kumpulan data dengan string huruf kecil sebagai kunci. Anggap Anda memiliki kunci yang dimulai dengan "x". Pencarian interpolasi jelas akan menunjukkan bahwa Anda harus mulai mencari sangat dekat dengan akhir set. Namun, jika sebagian besar kunci Anda benar-benar dimulai dengan 'z', dan hampir tidak ada dengan apa pun dari 'a' meskipun 'y', yang Anda cari sebenarnya sangat dekat dengan awal set. Itu bisa / dapat mengambil sejumlah besar iterasi sebelum pencarian mendekati awal di mana string dimulai dengan 'w' berada. Setiap iterasi akan menghapus hanya ~ 10% dari set data dari pertimbangan, sehingga akan membutuhkan beberapa iterasi sebelum mendekati awal di mana kunci dimulai dengan 'w'

Sebaliknya, pencarian biner akan dimulai di tengah, sampai ke tanda seperempat di iterasi kedua, tanda seperdelapan pada yang ketiga, dan seterusnya. Kinerjanya akan hampir tidak terpengaruh oleh kemiringan tombol. Setiap iterasi akan menghapus setengah dari set data dari pertimbangan, sama seperti kunci didistribusikan secara merata.

Saya cepat-cepat menambahkan, bahwa memang dibutuhkan distribusi yang agak miring untuk membuat pencarian interpolasi terasa lebih buruk daripada pencarian biner. Sebagai contoh, ia dapat berkinerja cukup baik bahkan di hadapan sejumlah besar pengelompokan yang dilokalkan.

Saya juga harus menyebutkan bahwa pencarian interpolasi tidak perlu menggunakan interpolasi linier. Sebagai contoh, jika kunci Anda diketahui mengikuti beberapa distribusi non-linear (misalnya, kurva-lonceng), menjadi cukup mudah untuk memperhitungkannya dalam fungsi interpolasi untuk mendapatkan hasil yang sedikit berbeda dari memiliki distribusi yang merata.


1
Masalah yang Anda gambarkan dengan mudah disesuaikan dengan menggunakan elemen pertama dan terakhir untuk menentukan rentang alih-alih mengasumsikan Int.MIN_VALUE dan Int.MAX_VALUE, yang saya yakini (setidaknya itulah cara saya mempelajari algoritme) adalah cara sebagian besar melakukannya.
Malfist

2
@Malfist: Itu bisa membantu, tetapi tidak selalu memperbaiki masalah. Dalam contoh, jika Anda memiliki nol kunci dimulai dengan apa pun dari (katakanlah 'a' hingga 'q', interpolasi akan berjalan cukup lancar. aNamun, satu pencilan yang dimulai dengan , akan merusak kinerja secara dramatis.
Jerry Coffin

1

Saya mungkin berpikir pertanyaannya adalah seberapa mudah Anda membuat fungsi interpolasi yang sebenarnya lebih baik daripada pencarian biner.

Dari Wikipedia pada Pencarian Interpolasi:

Menggunakan notasi O besar, kinerja algoritma interpolasi pada set data ukuran N adalah O (N); namun dengan asumsi distribusi data yang seragam pada skala linier yang digunakan untuk interpolasi, kinerja dapat ditunjukkan sebagai O (log log N).

Kinerja praktis dari pencarian interpolasi tergantung pada apakah jumlah probe yang dikurangi lebih besar dari perhitungan yang lebih rumit yang diperlukan untuk setiap probe. Ini dapat berguna untuk menemukan catatan dalam file besar yang diurutkan pada disk, di mana setiap probe melibatkan pencarian disk dan jauh lebih lambat daripada aritmatika interpolasi.

Struktur indeks seperti B-tree juga mengurangi jumlah akses disk, dan lebih sering digunakan untuk mengindeks data pada disk sebagian karena mereka dapat mengindeks berbagai jenis data dan dapat diperbarui secara online. Namun, pencarian interpolasi mungkin berguna ketika seseorang dipaksa untuk mencari dataset disk yang diurutkan tetapi tidak diindeks.


0

Pencarian biner dan pencarian interpolasi keduanya dianggap sebagai metode pencarian linier.

Mereka berdua berharap daftar yang dicari disortir pada kolom yang dirujuk sebagai kunci . Ini sangat penting.

Pencarian biner bekerja untuk string atau angka selama mereka disimpan dalam urutan yang diurutkan. Gagasan utama di balik pencarian Biner adalah bahwa ia didasarkan pada pemeriksaan elemen tengah. Pencarian interpolasi adalah varian. Alih-alih menggunakan elemen tengah yang tepat, ia menebak di mana elemen berikutnya untuk dibandingkan dengan nilai yang lewat adalah. Lihat referensi yang disediakan oleh JB King jawaban atau yang di bawah dalam jawaban ini untuk perincian tentang bagaimana algoritma pencarian interpolasi menghitung nilai kunci berikutnya.

"Pencarian interpolasi hanya bekerja pada elemen numerik yang disusun dalam susunan array yang diurutkan dengan distribusi yang seragam (yaitu, interval antara elemen apa saja dengan elemen yang berurutan hampir konstan" (kutipan dari referensi di bawah P 737, juga termasuk perbandingan kinerja antara berbagai metode pencarian linear yang disertakan. ).

Google Books - Struktur Data Klasik 2Nd Ed.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.