Kırmızı ve siyah ağaç subrange


14

Bir kitaplıktaki bir hatayı düzeltmeye çalışırken, kırmızı ve siyah ağaçlarda sübvansiyon bulmak için yazılar aradım. Değişmez veri yapıları için silme algoritmalarında kullanılan normal ekleme işlemine benzer fermuarlar ve benzer bir şey kullanarak bir çözüm düşünüyorum , ancak hala bulamadığım daha iyi bir yaklaşım olup olmadığını ve hatta minimum karmaşıklık sınırını merak ediyorum böyle bir operasyonda?

Açıkça söylemek gerekirse, kırmızı ve siyah bir ağaç ve iki sınır verildiğinde, bu sınırlar içinde yer alan ilk ağacın tüm unsurları ile yeni bir kırmızı ve siyah ağaç üretecek bir algoritmadan bahsediyorum.

Tabii ki, karmaşıklık için bir üst sınır, bir ağacın içinde gezinmenin ve ögeler ekleyerek diğerini inşa etmenin karmaşıklığı olacaktır.


3
@Radu: Yorum düzenleme özelliğinde bir hata var. Bir yorumda lateks kullanır ve yorumu düzenlerseniz, çoğaltma vb. Gibi garip davranışlar görürsünüz.
Aryabhata

@Radu Sorumu daha iyi açıklamak için birkaç paragraf ekledim.
Daniel C.Sobral

Ağaçlar değişmez mi?
Tsuyoshi Ito

Ayrıca, son paragrafta alt sınır yerine üst sınır mı demek istediniz?
Tsuyoshi Ito

2
Görünüşe göre kırmızı-siyah ağaçlardaki bölünmüş operasyon en kötü zaman O (log n) 'de uygulanabilir, burada n bir ağaçtaki eleman sayısıdır. Bu iddia Gerth Stølting Brodal, Christos Makris ve Kostas Tsichlas, ESA 2006 tarafından yayınlanan “Tamamen işlevsel en kötü durum sabit zamanlı katlanabilir sıralı listeler” makalesinin tanıtımında bulunabilir: cs.au.dk/~gerth/pub/esa06trees.html . Önceki yorumumda belirttiğim gibi, bu, subrange işleminin en kötü durum O (log n) -zamanında uygulanmasına izin verir.
Tsuyoshi Ito

Yanıtlar:


10

Bu cevap, bazı yorumlarımı soruya birleştiriyor ve genişletiyor.

Kırmızı-siyah ağaçlardaki subrange işlemi en kötü O (log n) zamanında gerçekleştirilebilir; burada n, orijinal ağaçtaki eleman sayısıdır. Ortaya çıkan ağaç bazı düğümleri orijinal ağaçla paylaşacağından, bu yaklaşım yalnızca ağaçlar değiştirilemezse (veya ağaçlar değiştirilebilir ancak orijinal ağaca artık ihtiyaç duyulmuyorsa) uygundur.

İlk olarak alt aralık işleminin iki bölünmüş işlem tarafından uygulanabileceğine dikkat edin. Burada bölme işlemi kırmızı-siyah bir ağaç T ve bir x anahtarını alır ve iki L ve R ağacı üretir, öyle ki L, x'den küçük T elemanlarını ve R, X'ten büyük T elemanlarını içerir. Bu nedenle, şimdi amacımız bölünmüş işlemi en kötü O (log n) zamanında kırmızı-siyah ağaçlara uygulamaktır.

O (log n) zamanında kırmızı-siyah ağaçlarda bölünme işlemini nasıl gerçekleştiririz? İyi bilinen bir yöntem olduğu ortaya çıktı. (Bilmiyordum, ama veri yapılarının uzmanı değilim.) İki L ve R ağacını alan birleştirme işlemini düşünün , böylece L'deki her değer R'deki her değerden daha az olacak ve tüm Birleştirme işlemi en kötü zaman O (| r L Rr R | +1) içinde uygulanabilir, burada r L ve r Rsırasıyla L ve R dereceleridir (yani, kökten her bir yaprağa giden yolda siyah düğümlerin sayısı). Bölme işlemi, birleştirme işlemi O (log n) süreleri kullanılarak gerçekleştirilebilir ve toplam en kötü durum süresi hala bir teleskop toplamı dikkate alınarak O (log n) 'dir.

Tarjan'ın bir kitabının 4.1 ve 4.2 bölümleri [Tar83], kırmızı-siyah ağaçlarda birleştirme ve ayrık işlemlerin en kötü zamanda O nasıl uygulanacağını açıklar (log n). Bu uygulamalar orijinal ağaçları yok eder, ancak düğümleri kopyalamak yerine kopyalayarak onları değiştirilemez, işlevsel uygulamalara dönüştürmek kolaydır.

Bir yan not olarak, Objektif Caml'ın Set ve Harita modülleri , (değiştirilemez) dengeli ikili arama ağaçlarındaki bölünmüş işlemi ve diğer standart işlemleri sağlar. Kırmızı-siyah ağaçlar kullanmasalar da (sol yükseklik ve sağ yüksekliğin en fazla 2 farklı olduğu kısıtlamasıyla dengeli ikili arama ağaçları kullanırlar), uygulamalarına bakmak da yararlı olabilir. İşte Set modülünün uygulanması .

Referanslar

[Tar83] Robert Endre Tarjan. Veri Yapıları ve Ağ Algoritmaları . CBMS-NSF Uygulamalı Matematik Bölgesel Konferans Serisi Cilt 44 , SIAM, 1983.


@Radu GRIGore: Evet, bir şey eksik olmadıkça.
Tsuyoshi Ito

@Radu GRIGore: Ya da belki değil, şimdi emin değilim. Bölünmüş işlemin bu uygulaması, çıkış ağacı için O (log n) yeni düğümleri ayırır, ancak tüm işlemin muhtemelen sadece O (1) çalışma alanı gerektiren kuyruk özyinelemeli şekilde uygulanabileceğini düşünüyorum. Bu doğruysa, sorunuzun cevabı “fazladan boşluk” ile ne demek istediğinize bağlı olacaktır.
Tsuyoshi Ito

@Radu GRIGore: Bu durumda, fazladan alanın O (1) olduğunu düşünüyorum, ancak dikkatlice kontrol etmedim.
Tsuyoshi Ito

@Radu GRIGore: Sonucun kendisini saklamak için gereken alan miktarını önemsemeden, çalışma alanı miktarını önemsemenin nedenini göremiyorum. Karmaşıklık teorisinde sorun genellikle sonucun ne olduğunu belirler ve bu nedenle sonucu depolamak için gereken alan algoritmalara bağlı değildir. Bununla birlikte, mevcut problemde, gerekli operasyonu uygulamanın birçok yolu vardır ve bazı uygulamalar sonucu saklamak için diğerlerinden daha fazla alana ihtiyaç duyar. Bu alanın farkını göz ardı ederseniz, neden ne kadar çalışma alanına ihtiyacımız olduğunu umursamıyorum.
Tsuyoshi Ito

Değişmez ağaçlar için problem değişebilir ağaçlar için olandan farklıdır. Farkı anlıyorum, bu yüzden soracak hiçbir şeyim yoktu. Şimdi, iki problemden birine yaklaşmak, tartışmak için iki yönü vardır --- bellek ve zaman. Ne kadar bellek kullandığınızı söylemediniz ve cevabın ne olduğu bana açık görünmüyordu, bu yüzden sordum. Bunun sizi iki sorun arasındaki farkı göz ardı ettiğimi nasıl düşündürdüğünü göremiyorum.
Radu GRIGDaha fazla

8

Çözüm kırmızı-siyah ağaçlar kullanmak değildir. Yayvan ağaçlarda ve AVL ağaçlarında bölme ve birleştirme kodu çok basittir. Sizi, splay ağaçları ve bunu destekleyen AVL ağaçları için java kodlu aşağıdaki URL'lere yönlendiriyorum. Aşağıdaki URL'ye gidin ve Set.java (avl ağaçları) ve SplayTree.java'ya (splay ağaçları) göz atın.

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

--- Danny Sleator


5
Siteye hoş geldin Danny!
Suresh Venkat

2
Bu, Scala Red Black uygulamasının, daha az bir sürede yer değiştirmeyi destekleyecek şekilde değiştirilmesine nasıl yardımcı olacak O(n)? Ne tür ağaçların basit subrange uygulamaları olduğunu sormadım çünkü bu benim sorunum değil. Bu cevap, her ne kadar iyi tasarlanmış olsa da, konu dışıdır ve mevcut sorun için işe yaramaz.
Daniel C. Sobral

6

(Bu bir yorum olmak içindir, ancak yorum bırakmak için çok yeniyim.)

Ben sadece yeni bir ağaç olarak subrange ve başka bir subrange olmadan giriş ağacı döndüren "eksizyon" operasyonu ilginizi çekebilir unutmayın. Bilinen yöntem seviye bağlantılarına dayandığından, ağacın altında temsili üzerinde kontrol sahibi olmanız gerekir. Eksizyon , amortismana tabi tutulmuş olsa da , daha küçük ağacın büyüklüğüne göre logaritmik olarak çalışır ("itfa edilmiş" iirc'dir, çünkü artık kağıda erişimim yok)

K. Hoffman, K. Mehlhorn, P. Rosenstiehl ve RE Tarjan, Seviye bağlantılı arama ağaçlarını kullanarak Ürdün dizilerini lineer zamanda sıralama, Bilgi ve Kontrol, 68 (1986), 170-184

PS: Yukarıdaki alıntı Seidel'in tartışma yazılarından geldi. Davranışlar eksizyonu da destekler.


Bu yöntem, kişinin iki sınıra işaretçi (veya "parmak") olduğunu varsayar.
jbapple

3

Ki sahip olduğu Kırmızı-siyah ağacında (mukayese) elemanları ve çıkarmak istediğiniz ait elemanları bir kırmızı-siyah ağaca.m [ a , b ]nm[a,b]

  1. Zaman içinde kökünden İniş en küçük elemana (aka halefi).a aO(lgn)aa
  2. Oradan istenen elemanlarla zamanında bir dizi oluşturan sıralı bir geçişi başlatın .O(m)
  3. O(m)

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

o(m)Ω(lgm)klgm

Ayrıntıları çözmedim, bu yüzden ekstra defter tutmanın çalışma süresini nasıl etkilediğinden emin değilim.

O(1)Ω(lgm)


Bunu düşünerek O(logn), geçici diziden kaçınabileceğim kaba bir sayım yapabileceğimi düşünüyorum .
Daniel C.Sobral

Alt ağaç boyutlarını köklerinde saklayarak O (lg n) cinsinden sayımı alabilirsiniz.
Radu GRIGDaha fazla

... ancak düğümlerde boyutlar depolamak, yardımcı alan kullanmama gereksinimine aykırıdır, bu yüzden gözlemim bellek konusundaki endişenizi gidermez.
Radu GRIGDaha fazla

1
İkili ağaçlar, yalnızca CONSTANT ekstra alan kullanılarak (ağacın kendisine ek olarak) mükemmel bir şekilde yeniden dengelenebilir: eecs.umich.edu/~qstout/abs/CACM86.html
Jeffε

O(m+lgn)O(1)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.