Topik temu duga representatif

Bagaimanakah anda akan melaksanakan treap dengan split dan merge?

PengekodanSukar
Pasukan Editorial Offer.ccDiterbitkan Dikemas kini

Soalan

Laksanakan treap dengan search, insert, erase, split, dan merge. Terangkan mengapa keutamaan rawak mengelakkan degenerasi, varian tak berubah bagi split dan merge, dasar kunci pendua, kerumitan jangkaan, dan langkah perlindungan kes terburuk.

1. Masalah dan konteks

Kekalkan set tertib dinamik yang menyokong carian, penyisipan, pemadaman, dan pemisahan sekali-sekala mengikut kunci yang diikuti oleh penggabungan. Laksanakan sebuah treap: setiap nod memenuhi varian tak berubah (invariant) pokok carian binari pada key dan varian tak berubah max-heap pada priority rawak. Anggap kunci unik terlebih dahulu, kemudian terangkan pengendalian pendua.

2. Perkara yang sedang diuji oleh penemu duga

  • Menerangkan fungsi yang disediakan oleh setiap varian tak berubah BST dan varian tak berubah heap.
  • Menyusun insert dan erase daripada split dan merge dan bukannya sekadar menghafal putaran (rotations).
  • Menyatakan bahawa O(log n) adalah jangkaan (expected), dan kualiti rawak serta pertembungan keutamaan mempengaruhi bentuk pokok.
  • Mengekalkan saiz subpokok atau agregat, dengan urutan kemas kini yang betul dan pengendalian anak (child) kosong.

3. Soalan untuk dijelaskan terlebih dahulu

  • Adakah kunci unik? Jika pendua dibenarkan, letakkan kunci yang sama secara konsisten pada satu sisi atau gunakan (key, id) sebagai kunci komposit.
  • Adakah keutamaan dibekalkan oleh pemanggil atau dijana secara dalaman? Penjanaan dalaman memerlukan sumber rawak, dasar pertembungan, dan benih (seed) ujian yang boleh dihasilkan semula.
  • Adakah split meletakkan kunci sempadan di sebelah kiri, atau memerlukan pemisahan strictly less-than? Ini mengubah kod penyisipan dan pertanyaan julat.
  • Adakah kita memerlukan statistik tertib ke-k, hasil tambah julat, atau jujukan tersirat (implicit sequence)? Setiap mutasi kemudiannya mesti mengemas kini metadata subpokok.

4. Kerangka jawapan tiga puluh saat

"Saya mengekalkan susunan BST mengikut kunci dan susunan max-heap mengikut keutamaan rawak. Operasi teras ialah split(T, key), yang mengembalikan kunci paling banyak pada sempadan dan kunci di atasnya, serta merge(L, R), yang menganggap setiap kunci dalam L adalah paling banyak sama dengan setiap kunci dalam R dan memilih punca (root) berkeutamaan lebih tinggi. Insert memisahkan di sekitar kunci baharu dan menggabungkannya semula; erase menggabungkan anak-anak sasaran. Setiap pulangan rekursif mengemas kini saiz. Ketinggian dan operasi adalah jangkaan O(log n), bukan kes terburuk, jadi kod pengeluaran memerlukan ujian yang boleh dihasilkan semula, pemantauan kedalaman, atau pokok dengan batas deterministik."

5. Penaakulan langkah demi langkah

Mula-mula tentukan varian tak berubah. Bagi setiap nod, kunci kiri tidak lebih besar daripada kuncinya, kunci kanan adalah lebih besar, dan keutamaannya adalah sekurang-kurangnya sebesar kedua-dua keutamaan anaknya. Artikel ini menggunakan "kunci yang sama pergi ke kiri"; (key, uniqueId) komposit adalah satu lagi dasar yang jelas.

Kedua, laksanakan split. Jika kunci punca adalah paling banyak pada sempadan, punca dan subpokok kiri tergolong dalam hasil kiri, jadi rekurs ke anak kanan. Jika tidak, rekurs ke anak kiri untuk hasil kanan. Sambung semula anak yang dikembalikan dan kemas kini saiz. Hanya satu laluan punca-ke-daun dilawati.

Ketiga, laksanakan merge. Kendalikan pokok kosong terlebih dahulu. Jika punca kiri mempunyai keutamaan lebih tinggi, kekalkannya sebagai punca dan gabungkan anak kanannya dengan pokok kanan; jika tidak, kekalkan punca kanan dan gabungkan pokok kiri dengan anak kirinya. Prasyarat bahawa setiap kunci kiri tidak lebih besar daripada setiap kunci kanan mengekalkan susunan BST.

Keempat, gubal operasi. Untuk insert, lakukan split(root, key) dan kemudian merge(merge(left, node), right). Untuk erase, gantikan sasaran dengan merge(node.left, node.right). Search menuruni mengikut kunci dan tidak memerlukan split. Jika saiz disimpan, jalankan size = 1 + size(left) + size(right) selepas setiap split, merge, insert, dan erase.

Kelima, bincangkan kerumitan dan kegagalan. Keutamaan rawak menjadikan bentuknya setanding dengan BST yang dibina secara rawak, memberikan jangkaan operasi O(log n); CP-Algorithms mendokumentasikan jangkaan split, merge, penyisipan, dan pemadaman secara logaritma. Keutamaan yang hampir monoton masih boleh mencipta pokok O(n), jadi gunakan benih tetap dalam ujian, pantau ketinggian, atau pilih pokok AVL atau red-black apabila batas kes terburuk adalah mandatori.

6. Contoh jawapan berkualiti tinggi

"Saya terlebih dahulu akan bersetuju mengenai semantik kunci pendua, kemudian melaksanakan dua primitif. split mengembalikan pokok kiri dan kanan di sekitar sempadan, memisahkan satu anak secara rekursif, dan menyambung semula punca. merge menganggap semua kunci kiri tidak lebih besar daripada kunci kanan dan memilih punca berkeutamaan lebih tinggi. Insert memisahkan dan meletakkan nod baharu di antara hasilnya; erase menggabungkan anak-anak sasaran. Mengemas kini saiz subpokok juga membolehkan pemilihan ke-k. Keutamaan rawak memberikan jangkaan ketinggian O(log n), bukan jaminan kes terburuk, jadi saya akan menguji dengan benih tetap merentasi pokok kosong, pendua, dan surihan panjang, memantau kedalaman, dan memilih pokok red-black apabila batas deterministik diperlukan."

7. Kesilapan biasa

  • Kesilapan → Hanya mengekalkan susunan BST → penyisipan yang diisih masih membentuk senarai terpaut → kekalkan juga varian tak berubah heap keutamaan.
  • Kesilapan → Melakukan merge tanpa memeriksa julat kunci → carian mengambil laluan yang salah → dokumentasikan bahawa kunci kiri tidak lebih besar daripada kunci kanan.
  • Kesilapan → Terlupa mengemas kini saiz subpokok selepas split → statistik ke-k dan julat tersasar → tarik metadata serta-merta selepas menyambung semula anak.
  • Kesilapan → Menganggap jangkaan O(log n) sebagai jaminan kes terburuk → keutamaan bermusuhan (adversarial) boleh mencipta pokok yang dalam → pantau kedalaman atau gunakan pokok AVL/red-black.
  • Kesilapan → Dasar pendua yang tidak konsisten merentasi search, erase, dan split → kunci yang sama berada dalam subpokok yang salah → gunakan kunci komposit atau satu peraturan sempadan.

8. Soalan susulan

Bagaimanakah anda menyokong elemen terkecil ke-k?

Simpan saiz subpokok pada setiap nod. Bandingkan k dengan saiz kiri semasa menuruni pokok; kemas kini saiz pada setiap split, merge, penyisipan, dan pemadaman atau pertanyaan akan menjadi tidak tepat.

Bagaimanakah treap boleh mewakili jujukan tersirat (implicit sequence)?

Jangan simpan kunci eksplisit. Tentukan kedudukan nod daripada saiz subpokok kirinya ditambah sumbangan leluhur. Pisahkan mengikut kedudukan dan gabungkan semula untuk menyokong penyisipan, pemadaman, dan agregat julat; bendera malas (lazy flags) boleh mengendalikan pembalikan atau penambahan julat.

Bilakah anda akan mengelakkan penggunaan treap?

Pilih AVL, pokok red-black, atau indeks pangkalan data apabila batas kes terburuk O(log n) yang ketat, kerawakan terkawal, atau pelaksanaan serentak yang matang diperlukan. Treap menukar jaminan tersebut untuk kod yang pendek dan komposisi split/merge yang fleksibel.

Sumber awam

Soalan berkaitan

Alat temu duga berkaitan

Gunakan Tangkapan Skrin untuk gesaan pengekodan

Tangkap soalan, kemudian selesaikan kekangan, penyelesaian, kod, kes pinggir dan kerumitan mengikut urutan.

Lihat alat