Struktur kamus yang diurutkan mendukung penggabungan yang efisien?


8

Banyak struktur pohon yang seimbang (pohon merah / hitam, pohon splay, dll.) Dan beberapa struktur kamus yang diurutkan lainnya (daftar centang) mendukung operasi gabungan yang menggunakan dua kamus di mana semua kunci dalam struktur pertama kurang dari semua kunci di yang kedua, kemudian menggabungkan dua kamus ke dalam kamus tunggal yang diurutkan dalam waktu , di mana adalah jumlah total kunci. Namun, ini hanya berfungsi jika tidak ada tumpang tindih dalam rentang kunci yang disimpan di pohon-pohon itu.nO(logn)n

Demikian pula, banyak antrian prioritas (tumpukan binomial, tumpukan Fibonacci, dll.) Mendukung - penggabungan waktu. Penggabungan ini bekerja terlepas dari kunci apa yang disimpan, tetapi mengingat bahwa struktur data adalah antrian prioritas, kami tidak dapat melakukan pencarian untuk elemen acak dalam struktur yang dihasilkan.O(logn)

Apakah ada struktur kamus yang diurutkan yang mendukung penggabungan kamus sewenang-wenang dalam waktu sementara secara bersamaan mendukung operasi kamus yang diurutkan secara normal (penyisipan, penghapusan, pencarian, permintaan penerus / pendahulu, dll.) Dalam waktu , atau bukti batas bawah bahwa struktur seperti itu tidak bisa ada?O ( log n )O(logn)O(logn)


2
Operasi apa lagi yang harus dimiliki kamus yang disortir, dan seberapa cepat itu? Tanpa persyaratan pada penyortiran insert dan lookup, daftar yang ditautkan ganda akan baik-baik saja, tetapi operasi non-penggabungan membutuhkan waktu linier, dalam panjang daftar, yang dapat menjadi superlinear dalam jumlah kunci yang berbeda.
jbapple

Saya berasumsi bahwa kami akan mendukung operasi kamus lainnya yang disortir (menyisipkan, menghapus, mencari, penerus, pendahulu) dan bahwa mereka semua berjalan secara ideal dalam waktu . O(logn)
templatetypedef

Saya sarankan Anda mengedit pertanyaan Anda untuk memasukkan informasi ini dalam pertanyaan ...
DW

Apakah saya memahaminya dengan benar bahwa Anda memerlukan struktur data pengurutan (kamus atau lainnya) yang dapat digabungkan dalam waktu dengan menjadi jumlah total elemen? nO(logn)n
Shahab

Jawaban:


8

Jika Anda memiliki struktur data pohon pencarian biner seimbang dengan properti pohon pencarian jari (pencarian untuk item posisi jauhnya membutuhkan waktu ), seperti misalnya splay tree, maka jika Anda memasukkan urutan diurutkan dari item ke dalamnya total waktu untuk penyisipan adalah .O ( log d ) k O ( k log ( n / k ) )dO(logd)kO(klog(n/k))

Sekarang, anggaplah Anda ingin mendukung penyisipan, penggabungan yang merusak, dan pencarian. Untuk penyisipan dan pencarian, cukup gunakan operasi pohon pencarian yang ada. Untuk penggabungan, selalu gabungkan pohon yang lebih kecil ke yang lebih besar, dan gunakan lintasan inorder dari pohon yang lebih kecil untuk mendapatkan urutannya dalam waktu linier. Kemudian, masukkan elemen pohon yang lebih kecil satu per satu ke pohon yang lebih besar dalam urutan yang diurutkan ini.

Jika elemen dimasukkan kemudian digabung ke dalam urutan pohon yang lebih besar dengan ukuran maka jumlah waktu untuk penyisipan dan penggabungan (hanya menghitung fraksi dari total waktu gabungan) akan menjadi , , , yang menambahkan urutan telescoping ke . Jadi jika seseorang menggunakan skema amortisasi di mana total waktu logaritmik ini untuk urutan potensial gabungan dibebankan ke operasi penyisipan untuk , maka kita masih mendapatkan waktu diamortisasi per penyisipan atau pencarian, dan hanya waktu diamortisasi per merger.n 1 , n 2 , ... x O ( log n 1 ) O ( log ( n 2 / n 1 ) ) ... O ( log n ) x O ( log n ) O ( 1 )xn1,n2,xO(logn1)O(log(n2/n1))O(logn)xO(logn)O(1)

Penghapusan mempersulit analisis ini, tetapi tidak banyak. Salah satu cara untuk mengatasinya adalah dengan melakukan penghapusan setengah malas, di mana item yang dihapus dihapus dari pohonnya tetapi tidak dihapus dari jumlah item di pohon ini, sehingga ketika kami memutuskan mana dari dua pohon yang lebih kecil atau lebih besar kami hitung semua barang yang pernah ada di pohon. Kemudian, diO ( log n )nO(logn)waktu per operasi harus menjadi jumlah total item yang pernah dimasukkan atau dihapus daripada jumlah yang ada saat ini. Jika dua angka ini tumbuh terlalu jauh, Anda dapat membuat pembaruan yang menyesuaikan kembali semua jumlah dengan angka aktualnya, mengatur ulang struktur data ke keadaan tanpa item yang dihapus malas; waktu yang diamortisasi untuk pembaruan ini dapat dibebankan terhadap operasi penghapusan yang harus Anda lakukan untuk mendapatkan angka yang terpisah begitu jauh. Atau mungkin Anda dapat membuat amortisasi gabungan bekerja secara langsung dengan penghapusan yang tidak malas, tetapi saya belum mengerjakan detail bagian itu.


1
Dalam skema amortisasi ini, waktu penggabungan dua set didasarkan pada ukuran struktur terbesar yang akan digabungkan? Apakah ini membuat waktu gabungan , di mana adalah ukuran alam semesta? UlogUU
jbapple

Tidak, cukup catat jumlah item maksimum yang pernah ada di pohon pada saat yang sama.
David Eppstein
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.