Topik wawancara representatif

Wawancara coding: Bagaimana Anda mengimplementasikan Xor Filter statis dan menjelaskan kegagalan build?

CodingSulit
Tim Redaksi Offer.ccDipublikasikan Diperbarui

Pertanyaan

Implementasikan Xor Filter statis dengan konstruksi batch dan kueri keanggotaan. Jelaskan tata letak tiga segmen, antrean peeling, penetapan fingerprint, percobaan ulang build, tingkat false-positive, dan alasan mengapa penghapusan in-place tidak didukung.

Prompt dan konteks

Implementasikan Xor Filter statis dengan konstruksi batch dan kueri keanggotaan. Jelaskan tata letak tiga segmen, antrean peeling, penetapan fingerprint, percobaan ulang build, tingkat false-positive, dan alasan mengapa penghapusan in-place tidak didukung.

Xor Filter adalah struktur keanggotaan perkiraan (approximate-membership) statis: struktur ini menyimpan fingerprint pendek untuk setiap kunci dan melakukan XOR pada fingerprint di tiga posisi selama kueri. Penelitian menunjukkan bahwa filter ini dapat bersaing dengan Bloom dan Cuckoo Filter dalam hal ruang dan kecepatan pencarian (lookup), tetapi konstruksinya bergantung pada hipergraf acak yang dapat di-peel (peelable). Seed yang gagal memerlukan pembangunan ulang (rebuild), sehingga struktur ini cocok untuk pembuatan batch yang diikuti oleh publikasi read-only.

Hal yang dievaluasi pewawancara

Pewawancara memeriksa apakah Anda dapat membangun tiga array, menangani duplikat dan himpunan kosong, melakukan peeling hipergraf dengan antrean derajat (degree queue), menetapkan fingerprint dalam urutan terbalik, menggunakan hashing yang identik untuk pembangunan dan kueri, menghitung false positive, menjelaskan batasan penghapusan dan pembaruan, serta mempertimbangkan percobaan ulang, memori puncak (peak memory), dan pembacaan konkuren.

Pertanyaan klarifikasi

Dataset dan model pembaruan

Konfirmasikan jumlah kunci, kebijakan duplikat, frekuensi rebuild, latensi pembaruan, dan apakah penghapusan wajib dilakukan. Xor Filter menargetkan himpunan statis; beban kerja dinamis sebaiknya membandingkan Cuckoo Filter atau rebuild berlapis.

Target error dan ruang

Konfirmasikan tingkat false-positive yang dapat diterima, lebar fingerprint, apakah false negative diizinkan, dan prioritas antara throughput lookup versus memori build puncak.

Batasan kunci dan hash

Konfirmasikan apakah kunci berupa integer, byte string, atau objek terstruktur; bagaimana seed hash dipersistensikan; dan apakah implementasi lintas bahasa memerlukan urutan byte (byte order) dan normalisasi yang identik.

Jawaban 30 detik

“Saya membagi tabel menjadi tiga segmen; setiap kunci memetakan ke satu posisi di setiap segmen dan menyimpan fingerprint dengan lebar tetap. Selama konstruksi, saya melacak derajat slot dan edge yang bersinggungan, melakukan peeling pada slot berderajat satu, dan membangun ulang dengan seed baru jika edge masih tersisa. Dalam urutan peeling terbalik, sebuah slot ditetapkan nilai fingerprint kunci di-XOR dengan dua nilai slot lainnya. Sebuah kueri menghitung ulang ketiga posisi dan melakukan XOR padanya; kesamaan berarti ‘kemungkinan ada’. Tabel ini bersifat statis dan perkiraan, sehingga tidak mendukung penghapusan in-place yang aman.”

Solusi langkah demi langkah

Langkah 1: Tentukan tata letak dan fingerprint

Dapatkan tiga posisi dan fingerprint bit rendah dari hasil hash 64-bit yang independen. Bagi tabel menjadi segmen-segmen yang kira-kira sama besar dan reduksi setiap posisi di dalam segmennya. Tentukan penanganan fingerprint bernilai nol secara konsisten agar slot kosong tidak tertukar dengan nilai sebenarnya.

Langkah 2: Bangun derajat hipergraf

Perlakukan setiap kunci sebagai hyperedge yang menghubungkan tiga slot. Selama konstruksi, simpan derajat setiap slot dan daftar edge yang bersinggungan, lalu masukkan slot berderajat satu ke dalam antrean. Lakukan deduplikasi kunci terlebih dahulu atau tentukan semantik himpunan secara eksplisit; jika tidak, satu hyperedge dapat dihitung berulang kali.

Langkah 3: Lakukan peeling pada graf

Ambil slot berderajat satu, temukan edge uniknya, dan catat edge tersebut, slot unik, serta dua slot lainnya. Hapus edge tersebut dan kurangi derajat ketiga slot; masukkan slot yang baru menjadi berderajat satu ke dalam antrean. Jika edge yang belum dihapus masih tersisa setelah antrean kosong, seed ini menghasilkan graf yang tidak dapat di-peel.

Langkah 4: Tetapkan fingerprint secara terbalik

Proses edge yang dicatat dalam urutan peeling terbalik. Atur slot unik dengan nilai fingerprint kunci di-XOR dengan nilai saat ini dari dua slot lainnya. Melakukan XOR pada ketiga slot tersebut kemudian menghasilkan fingerprint kunci tersebut; slot yang belum ditulis berkontribusi nol.

Langkah 5: Implementasikan lookup

Lookup menggunakan seed, fungsi posisi, dan fungsi fingerprint yang sama dengan konstruksi, membaca ketiga segmen, dan melakukan XOR padanya. Kesamaan hanya berarti “kemungkinan ada”, bukan bukti keanggotaan pasti; pemanggil harus menyelesaikan kecocokan terhadap database atau himpunan eksak.

text
build(keys):
  repeat with a new seed:
    edges = positions_and_fingerprints(keys, seed)
    queue = all degree-1 slots
    order = peel(edges, queue)
    if order contains every edge:
      table = zeroed slots
      for edge in reverse(order):
        table[edge.unique] = edge.fp XOR table[edge.other1] XOR table[edge.other2]
      return seed, table
  fail after bounded retries

contains(key):
  a, b, c = positions(key, seed)
  return table[a] XOR table[b] XOR table[c] == fingerprint(key)

Langkah 6: Tangani kegagalan dan sumber daya

Kegagalan build bukanlah false negative pada lookup; ini berarti graf untuk seed ini tidak memiliki urutan peeling yang lengkap. Batasi percobaan ulang, ubah seed atau ukuran tabel, dan kembalikan error eksplisit alih-alih memublikasikan tabel parsial. Array derajat, daftar edge, dan stack peeling membuat memori puncak build lebih besar daripada tabel read-only akhir.

Langkah 7: Jelaskan pembaruan dan verifikasi

Tabel memecahkan persamaan atas seluruh himpunan kunci lengkap, sehingga penyisipan atau penghapusan dapat merusak hubungan XOR kunci lainnya. Perbarui dengan membangun ulang, menukar dua versi secara atomik, atau melapiskan filter-filter kecil. Uji himpunan kosong, satu kunci, duplikat, tabrakan hash, kegagalan build, pemulihan serialisasi, false positive, dan lookup read-only secara konkuren.

Jawaban model

Saya akan memetakan himpunan kunci ke hipergraf 3-seragam (3-uniform) tiga segmen, melakukan peeling dengan antrean derajat, dan menetapkan fingerprint pendek dalam urutan peeling terbalik. Lookup melakukan tiga pembacaan slot dan operasi XOR, sehingga berjalan dalam waktu konstan, tetapi hasilnya adalah keanggotaan perkiraan. Kegagalan build berarti seed saat ini tidak dapat di-peel; saya akan mencoba lagi dengan seed baru di bawah batas tertentu dan menolak publikasi setelah batas tercapai. Karena tabel bergantung pada setiap kunci, penyisipan atau penghapusan in-place tidak aman; pembaruan produksi membangun ulang tabel baru dan menukarnya secara atomik. Persistensikan seed, ukuran tabel, lebar fingerprint, dan urutan byte bersama versinya, lalu ukur false positive terhadap himpunan eksak.

Kesalahan umum

  • Kesalahan: Mengembalikan tabel parsial setelah konstruksi gagal. → Mengapa gagal: Edge yang tidak diproses dapat menimbulkan false negative. → Perbaikan: Ubah seed atau ukuran tabel dan publikasikan hanya setelah setiap edge ditetapkan.
  • Kesalahan: Menggunakan seed atau pemetaan segmen yang berbeda saat lookup. → Mengapa gagal: Build dan lookup mengalamatkan slot yang berbeda. → Perbaikan: Persistensikan dan berikan versi pada seed, batas segmen, dan implementasi hash.
  • Kesalahan: Memperlakukan hasil lookup positif sebagai keanggotaan eksak. → Mengapa gagal: Fingerprint pendek menghasilkan false positive. → Perbaikan: Gunakan filter sebagai pemeriksaan awal, lalu konsultasikan dengan penyimpanan eksak.
  • Kesalahan: Mendukung penghapusan in-place. → Mengapa gagal: Slot bersama berpartisipasi dalam persamaan XOR lainnya. → Perbaikan: Bangun ulang, gunakan dua versi, atau pilih filter dinamis.

Pertanyaan lanjutan dan tanggapan

Mengapa menggunakan tiga segmen dan bukan satu array tunggal?

Tiga segmen memberikan setiap edge satu slot di setiap wilayah, yang membuat konstruksi hipergraf yang dapat di-peel dan lookup waktu konstan menjadi praktis. Proporsi pasti dan load factor harus diuji melalui benchmark.

Bagaimana Anda memilih lebar fingerprint?

Fingerprint yang lebih pendek mengurangi ruang tetapi meningkatkan false positive. Ukur kegagalan dengan kunci independen dan seimbangkan biaya lookup penyimpanan eksak yang dihasilkan terhadap penghematan memori.

Apakah percobaan ulang seed membuat hasil menjadi tidak stabil?

Tabel berubah, tetapi lookup dapat direproduksi ketika seed akhir, versi, dan tabel dipersistensikan bersama. Sertakan metadata konstruksi dalam manifes rilis yang sama.

Kapan Anda akan memilih Bloom atau Cuckoo Filter sebagai gantinya?

Penyisipan, penghapusan, penghitungan, atau pengubahan ukuran online yang sering terjadi lebih cocok menggunakan filter dinamis. Xor Filter paling unggul untuk himpunan statis yang dibangun secara batch di mana lookup read-only yang ringkas sangat diutamakan.

Sumber publik

Pertanyaan terkait

Alat wawancara terkait

Gunakan Tangkapan Layar untuk perintah coding

Ambil tangkapan layar soal, lalu telusuri batasan, solusi, kode, edge case, dan kompleksitas secara berurutan.

Lihat alat