Subrange dari Pohon Merah dan Hitam

14

Ketika mencoba memperbaiki bug di perpustakaan, saya mencari makalah tentang menemukan subranges di pohon merah dan hitam tanpa hasil. Saya sedang mempertimbangkan solusi menggunakan ritsleting dan sesuatu yang mirip dengan operasi append yang biasa digunakan pada algoritma penghapusan untuk struktur data yang tidak dapat diubah, tetapi saya masih bertanya-tanya apakah ada pendekatan yang lebih baik yang tidak dapat saya temukan, atau bahkan batas kompleksitas minimum pada operasi seperti itu?

Untuk lebih jelasnya, saya berbicara tentang algoritma yang, mengingat pohon merah & hitam dan dua batas, akan menghasilkan pohon merah & hitam baru dengan semua elemen pohon pertama yang termasuk dalam batas-batas itu.

Tentu saja, batas atas kompleksitas adalah kompleksitas melintasi satu pohon dan membangun yang lain dengan menambahkan elemen.

Daniel C. Sobral
sumber
3
@ Radu: Ada bug di fitur edit komentar. Jika Anda menggunakan lateks dalam komentar dan mengedit komentar, Anda melihat perilaku aneh, seperti duplikasi, dll.
Aryabhata
@ Radu Saya menambahkan beberapa paragraf untuk lebih menjelaskan pertanyaan saya.
Daniel C. Sobral
Apakah pohon tidak dapat diubah?
Tsuyoshi Ito
Juga, apakah maksud Anda batas atas dan bukan batas bawah pada paragraf terakhir?
Tsuyoshi Ito
2
Tampaknya operasi pemisahan pada pohon merah-hitam dapat diimplementasikan dalam kasus terburuk O (log n), di mana n adalah jumlah elemen dalam sebuah pohon. Klaim ini dapat ditemukan dalam pengantar makalah “Daftar kasus terpaten yang dapat dipatenkan dengan waktu normal sepenuhnya berfungsi” oleh Gerth Stølting Brodal, Christos Makris dan Kostas Tsichlas, ESA 2006: cs.au.dk/~gerth/pub/esa06trees.html . Seperti yang saya sebutkan di komentar saya sebelumnya, ini memungkinkan implementasi kasus terburuk dari operasi subrange O (log n).
Tsuyoshi Ito

Jawaban:

10

Jawaban ini menggabungkan beberapa komentar saya dengan pertanyaan dan mengembangkannya.

Operasi subrange pada pohon merah-hitam dapat dilakukan dalam kasus O (log n) terburuk, di mana n adalah jumlah elemen dalam pohon asli. Karena pohon yang dihasilkan akan berbagi beberapa node dengan pohon asli, pendekatan ini hanya cocok jika pohon tidak dapat diubah (atau pohon bisa berubah tetapi pohon asli tidak lagi diperlukan).

Pemberitahuan pertama bahwa operasi subrange dapat diimplementasikan oleh dua operasi terpisah. Di sini operasi pemisahan mengambil pohon T hitam merah dan kunci x dan menghasilkan dua pohon L dan R sedemikian rupa sehingga L terdiri dari semua elemen T kurang dari x dan R elemen T lebih besar dari x. Oleh karena itu, tujuan kami sekarang adalah untuk mengimplementasikan operasi pemisahan pada pohon merah-hitam pada kasus O (log n) terburuk.

Bagaimana kita melakukan operasi split pada pohon merah-hitam dalam waktu O (log n)? Ya, ternyata ada metode yang terkenal. (Saya tidak tahu, tapi saya bukan ahli struktur data.) Pertimbangkan operasi gabungan , yang mengambil dua pohon L dan R sehingga setiap nilai dalam L kurang dari setiap nilai dalam R dan menghasilkan pohon yang terdiri dari semua nilai-nilai dalam L dan R. bergabung operasi dapat diterapkan dalam kasus terburuk waktu O (| r L r R | 1), di mana r L dan r Radalah jajaran L dan R, masing-masing (yaitu, jumlah simpul hitam di jalur dari akar ke setiap daun). Operasi pemisahan dapat diimplementasikan dengan menggunakan operasi gabungan O (log n) kali, dan total waktu terburuk masih O (log n) dengan mempertimbangkan jumlah telescoping.

Bagian 4.1 dan 4.2 dari sebuah buku [Tar83] oleh Tarjan menjelaskan bagaimana mengimplementasikan operasi join dan split pada pohon merah-hitam dalam waktu kasus terburuk O (log n). Implementasi ini menghancurkan pohon asli, tetapi mudah untuk mengubahnya menjadi implementasi fungsional yang tidak dapat diubah dengan menyalin node alih-alih memodifikasi mereka.

Sebagai catatan tambahan, modul Set dan Map Objective Caml menyediakan operasi pemisahan serta operasi standar lainnya pada pohon pencarian biner seimbang (tidak dapat diubah). Meskipun mereka tidak menggunakan pohon merah-hitam (mereka menggunakan pohon pencarian biner seimbang dengan batasan bahwa tinggi kiri dan tinggi kanan berbeda paling banyak 2), melihat implementasi mereka mungkin berguna juga. Berikut ini adalah implementasi dari modul Set .

Referensi

[Tar83] Robert Endre Tarjan. Struktur Data dan Algoritma Jaringan . Volume 44 Seri Konferensi Regional CBMS-NSF dalam Matematika Terapan , SIAM, 1983.

Tsuyoshi Ito
sumber
@ Radu GRIGore: Ya, kecuali saya kehilangan sesuatu.
Tsuyoshi Ito
@ Radu GRIGore: Atau mungkin tidak, sekarang saya tidak yakin. Implementasi operasi pemisahan ini mengalokasikan O (log n) node baru untuk pohon output, tapi saya pikir seluruh operasi mungkin dapat diimplementasikan dengan cara rekursif ekor, hanya membutuhkan O (1) ruang kerja. Jika ini benar, jawaban untuk pertanyaan Anda akan tergantung pada apa yang Anda maksud dengan “ruang ekstra.”
Tsuyoshi Ito
@ Radu GRIGore: Dalam hal ini, saya pikir ruang ekstra adalah O (1), meskipun saya belum memeriksanya dengan cermat.
Tsuyoshi Ito
@ Radu GRIGore: Saya tidak bisa melihat alasan mengapa orang peduli tentang jumlah ruang kerja tanpa peduli dengan jumlah ruang yang dibutuhkan untuk menyimpan hasilnya sendiri. Dalam teori kompleksitas, masalah biasanya menentukan apa hasilnya dan oleh karena itu ruang yang dibutuhkan untuk menyimpan hasilnya tidak tergantung pada algoritma. Namun, dalam masalah saat ini, ada banyak cara untuk mengimplementasikan operasi yang diperlukan dan beberapa implementasi membutuhkan lebih banyak ruang untuk menyimpan hasilnya daripada yang lain. Jika Anda mengabaikan perbedaan jumlah ruang ini, saya tidak mengerti mengapa Anda peduli seberapa banyak ruang kerja yang kami butuhkan.
Tsuyoshi Ito
Masalah untuk pohon yang tidak berubah berbeda dari yang untuk pohon yang bisa berubah. Saya mengerti perbedaannya sehingga saya tidak perlu bertanya tentang hal itu. Sekarang, memperbesar satu dari dua masalah ada dua aspek untuk didiskusikan --- memori dan waktu. Anda tidak mengatakan berapa banyak memori yang Anda gunakan dan tampaknya tidak jelas bagi saya apa jawabannya, jadi saya bertanya. Saya gagal melihat bagaimana ini membuat Anda berpikir bahwa saya mengabaikan perbedaan antara dua masalah.
Radu GRIGore
8

Solusinya adalah jangan menggunakan pohon merah-hitam. Dalam pohon splay dan pohon AVL kode untuk memisahkan dan bergabung sangat sederhana. Saya merujuk Anda ke URL berikut dengan kode java untuk pohon splay dan pohon AVL yang mendukung ini. Buka URL berikut dan periksa Set.java (avl trees) dan SplayTree.java (splay trees).

ftp://ftp.cs.cmu.edu/usr/ftp/usr/sleator/splaying/

--- Danny Sleator

Danny Sleator
sumber
5
Selamat datang di situs, Danny!
Suresh Venkat
2
Bagaimana ini akan membantu memodifikasi implementasi Scala Red Black untuk mendukung subranging dalam waktu kurang dari O(n)? Saya belum bertanya jenis pohon apa yang memiliki implementasi subrange sederhana karena itu bukan masalah yang saya miliki. Jawaban ini, meskipun dimaksudkan dengan baik, adalah di luar topik dan tidak berguna untuk masalah yang dihadapi.
Daniel C. Sobral
6

(Ini dimaksudkan sebagai komentar tetapi saya terlalu baru untuk meninggalkan komentar.)

Saya hanya ingin mencatat bahwa Anda mungkin juga tertarik dengan operasi "eksisi", yang mengembalikan subrange sebagai pohon baru dan pohon input tanpa subrange yang lain. Anda perlu memiliki kontrol pada representasi yang mendasari pohon karena metode yang dikenal bergantung pada tautan level. Eksisi berjalan dalam waktu logaritmik dengan ukuran lebih kecil pohon yang , meskipun dalam arti diamortisasi ("diamortisasi" adalah iirc, karena saya tidak memiliki akses ke kertas lagi) Lihat:

K. Hoffman, K. Mehlhorn, P. Rosenstiehl, dan RE Tarjan, menyortir urutan Jordan dalam waktu linier menggunakan pohon pencarian level linked, Information and Control, 68 (1986), 170-1-184

PS Kutipan di atas berasal dari penulisan treap Seidel. Treaps juga mendukung eksisi.

Maverick Woo
sumber
Metode ini mengasumsikan bahwa seseorang sudah memiliki pointer (atau "jari") ke dua batas.
jbapple
3

nm[a,b]

  1. O(lgn)aa 's pengganti).
  2. O(m)
  3. O(m)

O(m+lgn)O(n+mlgm)

o(m)Ω(lgm)klgm

Saya tidak mengetahui detailnya, jadi saya tidak yakin bagaimana pembukuan tambahan memengaruhi waktu berjalan.

O(1)Ω(lgm)

Radu GRIGore
sumber
Memikirkan hal ini, saya pikir saya bisa mendapatkan hitungan kasar O(logn), dengan mana saya bisa menghindari array sementara.
Daniel C. Sobral
Anda bisa mendapatkan hitungan dalam O (lg n) dengan menyimpan ukuran subtree di akarnya.
Radu GRIGore
... tetapi menyimpan ukuran dalam node bertentangan dengan persyaratan untuk tidak menggunakan ruang tambahan, jadi pengamatan saya tidak membahas masalah Anda tentang memori.
Radu GRIGore
1
Pohon biner dapat diseimbangkan sempurna hanya dengan menggunakan ruang ekstra KONSTAN (selain dari pohon itu sendiri): eecs.umich.edu/ ~ qstout
abs
HAI(m+lgn)HAI(1)