Tugasnya jelas untuk menemukan algoritma yang O (1) dalam panjang N dari daftar angka yang diperlukan. Jadi tidak masalah jika Anda membutuhkan 100 angka teratas atau 10.000 angka, waktu penyisipan harus O (1).
Kuncinya di sini adalah bahwa meskipun persyaratan O (1) disebutkan untuk memasukkan daftar, pertanyaannya tidak mengatakan apa-apa tentang urutan waktu pencarian di seluruh ruang bilangan, tetapi ternyata ini dapat dilakukan O (1) demikian juga. Solusinya adalah sebagai berikut:
Atur hashtable dengan angka untuk kunci dan pasangan pointer daftar tertaut untuk nilai. Setiap pasangan pointer adalah awal dan akhir dari urutan daftar tertaut. Ini biasanya hanya akan menjadi satu elemen kemudian yang berikutnya. Setiap elemen dalam daftar tertaut berada di sebelah elemen dengan angka tertinggi berikutnya. Dengan demikian, daftar tertaut berisi urutan nomor yang disortir. Buat catatan angka terendah.
Ambil nomor baru x dari aliran acak.
Apakah lebih tinggi dari angka terendah yang terakhir dicatat? Ya => Langkah 4, Tidak => Langkah 2
Hit tabel hash dengan nomor yang baru saja diambil. Apakah ada entri? Ya => Langkah 5. Tidak => Ambil nomor baru x-1 dan ulangi langkah ini (ini adalah pencarian linier sederhana, tahan dengan saya di sini, ini dapat ditingkatkan dan saya akan menjelaskan caranya)
Dengan elemen daftar yang baru saja diperoleh dari tabel hash, masukkan nomor baru tepat setelah elemen dalam daftar tertaut (dan perbarui hash)
Ambil angka terendah yang saya rekam (dan hapus dari hash / daftar).
Hit tabel hash dengan nomor yang baru saja diambil. Apakah ada entri? Ya => Langkah 8. Tidak => Ambil nomor baru l + 1 dan ulangi langkah ini (ini adalah pencarian linear sederhana ke atas)
Dengan hit positif, angka tersebut menjadi angka terendah baru. Lanjutkan ke langkah 2
Untuk memungkinkan nilai duplikat, hash sebenarnya perlu mempertahankan awal dan akhir dari urutan daftar elemen yang duplikat. Menambah atau menghapus elemen pada kunci yang diberikan dengan demikian menambah atau mengurangi rentang yang ditunjuk.
Sisipan di sini adalah O (1). Pencarian yang disebutkan adalah, saya kira sesuatu seperti, O (perbedaan rata-rata antara angka). Perbedaan rata-rata meningkat dengan ukuran ruang angka, tetapi berkurang dengan panjang yang diperlukan dari daftar angka.
Jadi strategi pencarian linier sangat buruk, jika jumlah ruang besar (misalnya untuk tipe int 4 byte, 0 hingga 2 ^ 32-1) dan N = 100. Untuk mengatasi masalah kinerja ini, Anda dapat menyimpan kumpulan hashtable paralel, di mana angkanya dibulatkan ke besaran yang lebih tinggi (mis. 1s, 10s, 100s, 1000s) untuk membuat kunci yang sesuai. Dengan cara ini Anda dapat meningkatkan dan menurunkan gigi untuk melakukan pencarian yang dibutuhkan dengan lebih cepat. Kinerja kemudian menjadi O (log numberrange), saya pikir, yang konstan, yaitu O (1) juga.
Untuk memperjelas ini, bayangkan Anda memiliki nomor 197. Anda menekan hash table 10s, dengan '190', itu dibulatkan ke sepuluh terdekat. Apa pun? Tidak. Jadi Anda turun dalam 10-an sampai Anda menekan katakan 120. Kemudian Anda bisa mulai pada 129 dalam hashtable 1s, kemudian coba 128, 127 sampai Anda menekan sesuatu. Anda sekarang telah menemukan di mana dalam daftar tertaut untuk memasukkan nomor 197. Sementara memasukkannya, Anda juga harus memperbarui hashtable 1s dengan entri 197, hass 10s dengan angka 190, 100s dengan 100, dll. Langkah-langkah terbanyak Yang harus Anda lakukan di sini adalah 10 kali log dari kisaran angka.
Saya mungkin salah mengerti, tetapi karena ini adalah pertukaran programmer, dan konteksnya adalah wawancara, saya berharap jawaban di atas adalah jawaban yang cukup meyakinkan untuk situasi itu.
EDIT Saya menambahkan beberapa detail tambahan di sini untuk menjelaskan skema hashtable paralel dan bagaimana artinya pencarian linear yang buruk yang saya sebutkan dapat diganti dengan pencarian O (1). Saya juga menyadari bahwa tentu saja tidak perlu mencari angka terendah berikutnya, karena Anda dapat langsung menuju ke sana dengan melihat hashtable dengan angka terendah dan maju ke elemen berikutnya.