Menggabungkan Dua Pohon Pencarian Biner


17

Saya mencari algoritme untuk menggabungkan dua pohon pencarian biner dengan ukuran dan jangkauan yang berubah-ubah. Cara yang jelas saya akan menerapkan ini adalah untuk menemukan seluruh sub pohon yang jangkauannya dapat masuk ke dalam simpul eksternal yang berubah-ubah di pohon lain. Namun, kasus terburuk berjalan waktu untuk jenis algoritma tampaknya berada di urutan O(n+m)di mana ndan madalah ukuran masing-masing pohon masing-masing.

Namun, saya telah diberitahu bahwa ini bisa dilakukan di O(h), di mana hketinggian pohon dengan ketinggian lebih besar. Dan saya benar-benar bingung tentang bagaimana ini mungkin. Saya sudah mencoba bereksperimen dengan memutar satu pohon terlebih dahulu, tetapi memutar pohon menjadi tulang belakang sudah O (h).


Saya tidak tahu erick saya punya pertanyaan yang sama juga.

Agar adil, ini adalah pertanyaan yang diberikan dalam pekerjaan rumah Algoritma. Ternyata O (h) terlalu ketat untuk runtime, karena pertanyaannya lupa untuk memberikan informasi yang lebih diperlukan: Bahwa semua kunci dari satu pohon lebih kecil dari semua kunci di pohon kanan.
efritz

Apakah saya melewatkan sesuatu, tidakkah menggabungkan pohon biner dengan mudah dapat dilakukan O(log n)dengan fungsi simpul gerak yang sederhana?
AT

@AT Ya, tapi kami tidak tahu bahwa kunci dari satu BST itu saling eksklusif dari yang lain.
efritz

1
Ini adalah pohon merah-hitam, bukan BST. Merah hitam (serta pohon dan tumpukan AVL) adalah jenis pohon khusus yang menjaga properti dengan ketinggian tinggi. Vanilla BST dapat berupa tulang belakang tunggal. Coba masukkan serangkaian angka yang tidak berkurang atau tidak bertambah ke dalam BST dan Anda akan melihat bahwa ketinggian pohon-pohon ini sebenarnya n. Hanya pohon biner penuh atau lengkap memiliki tinggi logaritmik untuk jumlah total node mereka.
efritz

Jawaban:


24

Dalam ArXiv: 1002.4248 , John Iacono dan Özgür Özkan menggambarkan algoritma yang relatif sederhana untuk menggabungkan dua pohon pencarian biner dalam waktu diamortisasi ; analisis adalah bagian yang sulit. [ Pembaruan: Seperti yang diamati Joe dengan benar dalam jawabannya, algoritma ini disebabkan oleh Brown dan Tarjan.] Mereka juga menggambarkan struktur data kamus yang lebih rumit, berdasarkan daftar lompatan yang bias, yang mendukung penggabungan dalam waktu diamortisasi O ( log n ) .O(log2n) O(logn)

Di sisi lain, ikatan kasus terburuk dari tidak mungkin. Pertimbangkan dua pohon pencarian biner dengan n node, satu menyimpan bilangan bulat genap antara 2 dan 2 n , yang lain menyimpan bilangan bulat ganjil antara 1 dan 2 n - 1 . Menggabungkan dua pohon menciptakan pohon pencarian biner baru yang menyimpan semua bilangan bulat antara 1 dan 2 n . Dalam pohon seperti itu, sebagian kecil dari node memiliki paritas yang berbeda dari orang tua mereka. (Bukti: Induk daun aneh harus genap.) Dengan demikian, menggabungkan pohon genap dan aneh perlu diubahO(logn)n22n12n112n petunjuk.Ω(n)


Satu catatan: jika saya telah membaca deskripsi di makalah ini dengan benar, pohon-pohon ini tidak mendukung penyisipan dan penghapusan. The gabungan hanya mengikuti prosedur untuk penggabungan pohon pencarian jari (dijelaskan dalam jawaban Joe). Set operasi terbatas memungkinkan untuk analisis yang lebih baik daripada O ( n lg mO(lg2n)satu. O(nlgmn)
jbapple

1
Analisis yang ditingkatkan adalah karena amortisasi, bukan pembatasan operasi yang diizinkan. Sisipan dan penghapusan dapat didukung dengan pemisahan dan penggabungan (sebenarnya "bergabung") dalam hal yang sama diamortisasi terikat waktu. O(logn)
Jeffε

Hanya karena penasaran, apakah waktu akan terpengaruh jika pohon disimpan dalam array alih-alih daftar-tertaut (yang saya asumsikan adalah apa yang Anda maksud ketika mengatakan "mengubah ... pointer ")? Ω(n)
mtahmed

Secara default, "pohon pencarian biner" adalah struktur berbasis pointer (bukan "daftar tertaut"); setiap simpul menunjuk ke dua anaknya dan mungkin juga induknya. Tetapi batas bawah tidak tergantung pada representasi yang tepat. Ada cara untuk menggabungkan duapohon pencarian binern-node, sehingga setiap algoritma berbasis perbandingan memerlukan setidaknyalog2 ( 2n(2nn)nperbandingan 2 n - O ( log n ) untuk memilih yang benar. log2(2nn)2nO(logn)
Jeffε

1
@ Jɛ ff E: Saya setuju bahwa splits dan joins didukung, tetapi saya tidak berpikir bahwa membuat atau menghancurkan pohon adalah. Jadi, misalnya, jika saya ingin menghapus "x" dari alfabet, saya tidak hanya mendapatkan "a..wyz", tetapi juga "x". Ukuran alam semesta (yaitu , lihat bagian 2.1) tidak berubah. Juga, pengantar bagian 1 mencatat bahwa himpunan harus mempartisi alam semesta, yang saya artikan (mungkin secara salah) berarti bahwa setiap elemen di alam semesta ada di pohon tertentu. Jadi, cara saya membacanya, konstruksi ini tidak berfungsi di alam semesta yang tidak terikat. Begitulah cara saya menulis komentar di atas. n
jbapple

9

Anda dapat menemukan referensi ini bermanfaat: Brown dan Tarjan, Algoritma Penggabungan Cepat , di mana penulis menunjukkan cara menggabungkan pohon biner seimbang (AVL) di yang optimal (untuk algoritma berbasis perbandingan). m dan n adalah panjang dari daftar yang disortir yang diwakili oleh pohon pencarian biner, dan diasumsikan bahwa m n .O(nlogmn)mnmn

Anda juga dapat melihat diskusi tentang berbagai teknik untuk menggabungkan set yang dipesan pada bagian 11.5 dari makalah ini pada pohon pencarian jari


2
Baik batas waktu dan batas bawah yang cocok mengasumsikan bahwamn. O(nlogmn)mn
Jeffε

Saya pikir itu tersirat oleh batas waktu, tetapi saya mengedit pertanyaan untuk membuatnya eksplisit.
Joe

0

1
Mereka mendukung struktur data bergabung di O (1) diamortisasi waktu, tidak menggabungkan. Semua elemen dalam satu pohon harus lebih kecil dari semua elemen di pohon lainnya.
Jeffε

TiTjTiTjTjTiw(Ti)=w(Tj)TjTiTiTjTi
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.