Berdasarkan permintaan, berikut adalah struktur yang saya temukan setelah saya merumuskan pertanyaan:
Ide dasarnya adalah menggunakan pohon kambing hitam berulir bersama dengan pointer ke minimum (dan untuk ukuran yang baik, maksimum juga). Alternatif yang lebih sederhana untuk threading adalah mempertahankan pointer pendahulu dan penerus di setiap node (yang setara, lebih sederhana, tetapi memiliki lebih banyak overhead). Saya datang untuk menyebutnya tumpukan kambing hitam , hanya untuk memberinya beberapa nama.
Hanya struktur dasar ini memberi Anda operasi ini:
- Cari: diberi kunci, mengembalikan pointer ke simpul yang sesuai pada waktu .O(logn)
- Sisipkan: diberikan kunci, memasukkan kunci ke dalam struktur, mengembalikan pointer ke simpul itu dalam waktu .O(logn)
- Predecessor / successor: diberi pointer, mengembalikan penerus atau pendahulunya dalam waktu .O(1)
- Get-Min / Max: mengembalikan pointer ke minimum atau maksimum.
Dalam analisis pohon kambing hitam, keseimbangan biaya penghapusan dianalisis sebagai , tetapi analisis sebenarnya memberikan keseimbangan overhead dari (yang diabaikan dalam makalah karena mereka juga menghitung waktu untuk menemukan simpul yang akan dihapus). Jadi, jika kita memiliki pointer ke sebuah node, kita dapat menghapusnya dalam waktu konstan (Anda dapat melakukan ini di pohon pencarian biner dalam waktu ) dan dikombinasikan dengan overhead of balancing, ini memberi waktu hapus:O ( 1 ) O ( log n ) O ( 1 ) O ( 1 ) O ( 1 )O(logn)O(1)O(logn)O(1)O(1)O(1)
- Hapus: diberi pointer, menghapus simpul dalam waktu .O(1)
Menggabungkan ini:
- Extract-Min / Max: menghapus simpul minimum / maksimum dalam waktu .O(1)
Anda dapat melakukan sedikit lebih banyak dengan pointer: misalnya tidak sulit untuk mempertahankan pointer ke median atau statistik urutan lainnya, sehingga Anda dapat mempertahankan jumlah pointer yang konstan jika Anda membutuhkannya.
Beberapa hal lain:
- Membangun: diberikan kunci dalam urutan diurutkan, membangun tumpukan kambing hitam dalam waktu .nO(n)
- Saldo: menyeimbangkan pohon sehingga membentuk pohon pencarian biner seimbang sempurna (mengurangi overhead pencarian) dalam waktu (Anda dapat melakukan ini dengan faktor konstan lebih cepat dari yang disarankan oleh makalah, dengan memanfaatkan dari pendahulu / penggantinya).O(n)
Dan akhirnya, saya cukup yakin Anda dapat mendukung operasi ini, tetapi saya perlu memikirkan ini lebih banyak sebelum mengetahui ini dengan pasti:
- Sisipkan-New-Min / Max: diberi kunci yang lebih kecil / lebih besar dari kunci apa pun yang ada dalam struktur, memasukkan kunci ke dalam struktur, mengembalikan pointer ke simpul itu dalam waktu .O(1)