Topic
Complexity of Hashing Search & Binary Search Tree Algorithm
Febriansyah
Kurniawan M. Nasir Suyanto
Searching a list of values is a common task. An application program might retrieve a student record, bank account record, credit record, or any other type of record using a search algorithm. Here, we present search by hashing and search by binary tree, and discuss the algorithm and complexity of this method.
Hashing has a worst-case behavior that is linear for finding a target, but with some care, hashing can be dramatically fast in the average-case. Hashing also makes it easy to add and delete elements from the collection that is being searched.
Misalnya, Anda harus mencari catatan yang terkait dengan nilai kunci tertentu dalam daftar catatan tertentu. Untuk mengambil catatan yang diinginkan, Anda harus mencari secara berurutan melalui catatan sampai rekord dengan nilai tombol yang dikehendaki ditemukan. Metode ini sangat memakan waktu, terutama jika daftar sangat besar. Sebuah solusi efektif terhadap pencarian akan merekam untuk mencarinya dengan bantuan alamat offset. Anda dapat menghitung alamat offset merekam dengan menggunakan teknik yang disebut hashing.
Prinsip mendasar dari hashing adalah untuk mengkonversi kunci ke alamat offset untuk mengambil rekaman. Konversi kunci alamat dilakukan dengan hubungan (rumus), yang dikenal sebagai fungsi hashing. Proses pencarian rekord menggunakan hashing dapat diringkas sebagai berikut: 1.
2.
Mengingat kunci, fungsi hash mengubahnya menjadi nilai hash (lokasi) dalam rentang 1 sampai n, dimana n adalah ukuran penyimpanan (Alamat) ruang yang telah dialokasikan untuk catatan. Rekord ini kemudian diambil di lokasi yang dihasilkan.
Misalkan kita ingin menyimpan informasi tentang setiap siswa dalam database, sehingga kita kemudian dapat mengambil informasi tentang setiap siswa hanya menggunakan ID siswa. Untuk lebih spesifik, misalkan informasi tentang setiap siswa merupakan objek dari form berikut :
struct Mahasiswa ( int kunci; / / siswa ID string telepon; / / nomor telepon string alamat; / / alamat mahasiswa );
Kami menyebut setiap obyek rekaman. Tentu saja, mungkin ada informasi lain di setiap record siswa. Jika ID siswa semua dalam jangkauan 0..99 , kita bisa menyimpan catatan-catatan dalam array dari tipe berikut, menempatkan siswa ID k di lokasi data[k] : Data Siswa [100]; / / array dari 100 records
Rekord untuk ID k siswa dapat diambil segera karena data tersebut ada dalam data[k] .
Namun, jika ID mahasiswa tidak membentuk urutan seperti 0..99 . Misalkan bahwa kita hanya tahu bahwa akan ada seratus atau lebih sedikit dan bahwa mereka akan didistribusikan dalam jangkauan 0..9999. Kemudian dapat digunakan array dengan 10.000 komponen, tapi itu tampaknya sia-sia karena hanya sebagian kecil dari array tersebut akan digunakan. Jadi kita harus menyimpan catatan dalam array dengan 100 elemen dan menggunakan pencarian serial melalui array ini setiap kali kita ingin mencari ID mahasiswa tertentu. Kita pun dapat menyimpan catatan dalam array yang relatif kecil dan masih mengambil siswa dengan ID lebih cepat dari yang kita dapat dengan pencarian serial. Untuk menggambarkan ini, misalkan kita tahu bahwa ID siswa akan: 0, 100, 200, ... , 9800, 9900 Dalam hal ini, kita dapat menyimpan catatan dalam array disebut data dengan hanya 100 komponen. Kami akan menyimpan catatan dengan siswa ID k di lokasi: data [k/100]
Jika kita ingin mengambil informasi untuk siswa ID 700, kita menghitung 700/100 dan mendapatkan indeks 7. Rekor untuk siswa ID 700 adalah komponen disimpan dalam array data[7] .
Teknik umum disebut hashing. Setiap record membutuhkan nilai unik yang disebut kunci. Dalam contoh kita siswa ID adalah kunci, tapi lain, kunci yang lebih kompleks kadang-kadang digunakan. fungsi yang disebut fungsi hash, kunci peta untuk indeks array. Misalkan kita nama fungsi kita hash hash . Jika catatan memiliki kunci k, maka kita akan mencoba untuk menyimpan yang merekam di lokasi data[hash(k)] . Menggunakan fungsi hash untuk menghitung indeks array yang benar disebut hashing kunci indeks array. Fungsi hash harus dipilih sehingga nilai kembalinya selalu merupakan indeks berlaku untuk array. Dalam contoh kita: hash (k) = k / 100 Mengingat fungsi hash dan kunci yang merupakan kelipatan dari 100, setiap kunci menghasilkan indeks yang berbeda ketika hash. Jadi, hash adalah fungsi hash yang sempurna. Sayangnya, fungsi hash yang sempurna tidak selalu dapat ditemukan.
1. 2.
Dapat mengakibatkan tabrakan. Implementasi ini tidak mengizinkan akses sekuensial.
Maaf, belum
bisa kami paparkan
Binary Search Tree (BST) adalah sebuah pohon biner yang boleh kosong, dan setiap nodenya harus memiliki identifier/value. Value pada semua node subpohon sebelah kiri adalah selalu lebih kecil dari value root, sedangkan value subpohon di sebelah kanan adalah sama atau lebih besar dari value pada root, masing – masing subpohon tersebut (kiri & kanan) itu sendiri adalah juga BST. lihat gambar:
1. Membuat titik currentNode ke node root 2. Jika currentNode adalah nol: 1. Tampilan "Tidak Ditemukan" 2. Keluar 3. Membandingkan nilai yang akan dicari dengan nilai currentNode. Tergantung pada hasil perbandingan, ada tiga kemungkinan dapat: 1. Jika nilai sama dengan nilai currentNode: 1. Tampilan "Ditemukan“ 2. Keluar 2. Jika nilai kurang dari nilai currentNode: 1. Membuat titik currentNode ke kiri anak 2. Ke langkah 2 3. Jika nilai lebih besar dari nilai currentNode: 1. Membuat titik currentNode ke kanan anak 2. Ke langkah 2
Dengan memanfaatkan binary tree kita dapat melakukan pencarian elemen / node value dalam kompleksitas algoritma (big O) O(n log n) langkah saja.