İki İkili Arama Ağacını Birleştirme


17

Ben keyfi boyut ve aralık iki ikili arama ağaçlarını birleştirmek için bir algoritma arıyorum. Bunu uygulamakla ilgili en açık yol, menzili diğer ağaçtaki keyfi bir dış düğüme sığabilecek tüm alt ağaçları bulmak olacaktır. Bununla birlikte, bu tür bir algoritma için en kötü durum çalışma süresi, sırasıyla her ağacın O(n+m)nerede nve mbüyüklüğündedir.

Ancak, bunun yapılabileceği söylendi , ağacın yüksekliği daha büyük olan yükseklik O(h)nerede h. Ve bunun nasıl mümkün olduğu konusunda tamamen kayboldum. İlk önce bir ağacı döndürmeyi denedim, ama bir ağacı bir omurgaya döndürmek zaten O (h).


Ben de aynı soruyu soruyorum erick bilmiyorum.

Adil olmak gerekirse, bu bir Algoritma ödevinde verilen bir soruydu. Soru , daha gerekli bilgileri vermeyi unuttuğu için O (h) 'nin bir çalışma süresinden çok katı olduğu ortaya çıkıyor : Bir ağaçtaki tüm anahtarlar, sağ ağaçtaki tüm anahtarlardan daha küçüktü.
efritz

Bir şey mi kaçırıyorum, ikili ağaçları birleştirmek O(log n)basit bir hareket düğümü işleviyle kolayca yapılamaz mı?
AT

@AT Evet, ancak bir BST'nin tuşlarının diğerinden karşılıklı olarak ayrı olduğunu bilmiyorduk.
efritz

1
Bu kırmızı-siyah bir ağaç, bir BST değil. Kırmızı siyah (ayrıca AVL ağaçları ve yığınları) yüksekliğe bağlı bir özelliği tutan özel ağaç türleridir. Vanilya BST'leri tek bir omurga olabilir. BST'ye azalmayan veya artmayan bir sayı dizisi eklemeyi deneyin ve bu ağaçların yüksekliğinin aslında olduğunu göreceksiniz n. Sadece tam veya tam ikili ağaçların toplam düğüm sayısına göre logaritmik bir yüksekliği vardır.
efritz

Yanıtlar:


24

Gelen arXiv: 1002.4248 , John Iacono Özgür Özkan birleştirme iki ikili arama ağaçları için nispeten basit bir algoritma tarif itfa zaman; analiz zor kısmıdır. [ Güncelleme: Joe cevabında doğru bir şekilde gözlemlediğinden, bu algoritma Brown ve Tarjan'dan kaynaklanıyor.] Ayrıca, O ( log n ) itfa edilmiş zamanındaki birleştirmeleri destekleyen, önyargılı atlama listelerine dayanan daha karmaşık bir sözlük veri yapısını tarif ediyorlar .O(log2n) O(logn)

Öte yandan, en kötü durumda sınırı mümkün değildir. İki ikili arama ağaçları göz önünde n- düğüm arasındaki daha tam sayıları saklama bir 2 ve 2 N arasında tek tamsayı depolanması, diğer 1 ve 2 , n - 1 . İki ağacı birleştirmek, 1 ve 2 n arasındaki tüm tam sayıları saklayan yeni bir ikili arama ağacı oluşturur . Böyle bir ağaçta, düğümlerin sabit bir kısmının ebeveynlerinden farklı bir paritesi vardır. (Kanıt: Tek bir yaprağın ebeveyni eşit olmalıdır.) Böylece, çift ve tek ağaçların birleştirilmesi değişmeyi gerektirirO(logn)n22n12n112n işaretçisi.Ω(n)


One note: if I have read the description in this paper correctly, these trees do not support insert and delete. The O(lg2n) merge just follows the procedure for merging finger search trees (described in Joe's answer). The restricted set of operations allows for a better analysis than the O(nlgmn) one.
jbapple

1
Geliştirilmiş analiz, izin verilen işlemlerin bir kısıtlaması değil, amortismandan kaynaklanmaktadır. Ekleme ve silme işlemleri, bölmeler ve birleştirmelerle (aslında "birleştirmeler") aynı şekilde desteklenebilirO(logn) amortized time bound.
Jeffε

Ω(n)

(2nn)nlog2(2nn)2nO(logn) comparisons to choose the right one.
Jeffε

1
@JɛffE: I agree that splits and joins are supported, but I don't think that creating or destroying trees are. So, for instance, if I want to delete "x" from the alphabet, I don't get just "a..wyz", but also "x". The size of the universe (which is n, see section 2.1) doesn't change. Also, the intro to section 1 notes that the sets must partition the universe, which I interpret (perhaps incorrectly) to mean that each element in the universe is in some tree. So, the way I read it, this construction does not work over unbounded universes. That's how I should I written my comment above.
jbapple

9

You may find this reference helpful: Brown and Tarjan, A Fast Merging Algorithm, in which the authors show how to merge balanced binary (AVL) trees in O(nlogmn) which is optimal (for comparison based algorithms). m and n are the lengths of the sorted lists represented by the binary search trees, and it is assumed that mn.

You could also see a discussion of different techniques for merging ordered sets in section 11.5 of this paper on finger search trees


2
Both the O(nlogmn) time bound and the matching lower bound assume that mn.
Jeffε

I thought that that was implied by the time bound, but I edited the question to make it explicit.
Joe

0

1
Their data structure supports join in O(1) amortized time, not merge. All elements in one tree must be smaller than all elements in the other.
Jeffε

Ahh, true. Had to reread the article: "Join(Ti ,Tj), joins the two trees in one tree. Trees Ti and Tj are ordered in the sense that all elements of Tj are either smaller or larger than the smallest or largest element of Ti . Assume without loss of generality that w(Ti)=w(Tj). In this case, tree Tj is attached to tree Ti , and the result of this operation is the tree TiTj is attached to a node on the spine of Ti."
A T
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.