Nasıl verimli iki BST en birleştirmek?

oy
23

Nasıl BST özelliğini koruyarak iki ikili arama ağaçları birleştirmek?

Biz bir ağaçtan her bir öğeyi alıp, diğer eklemek için karar verirseniz, bu yöntemin karmaşıklığı olacağını O(n1 * log(n2))nerede, n1ağacın düğümler (diyelim sayısıdır T1biz parçalı olması), ve n2bir düğüm sayısı ise diğer ağaç (diyelim T2). Bu işlemden sonra tek BST sahiptir n1 + n2düğümleri.

Sorum şu: Biz Ey daha iyi (n1 * log (n2)) yapabilirim?

Oluştur 17/06/2009 saat 18:35
kaynak kullanıcı
Diğer dillerde...                            


6 cevaplar

oy
8

Ne sıralanabilir listeler halinde hem ağaçları düzleştirme listeleri birleştirme ve ardından yeni bir ağaç oluşturma hakkında?

Cevap 17/06/2009 saat 18:43
kaynak kullanıcı

oy
18
  • sıralanmış listeler halinde ağaçlara düzleştirin.
  • sıralı listeleri Birleştirme.
  • Birleştirilmiş listenin dışına ağacı oluşturun.

IIRC, O olduğu (n1 + n2) 'dir.

Cevap 17/06/2009 saat 18:43
kaynak kullanıcı

oy
26

Biraz daha ayrıntılı bilgi içeren Naaff cevabı:

  • sıralı bir listesini gösteren bir BST düzleşme O olduğu (H)
    • Bu bütün ağaç üzerinde sadece "in-order" yineleme var.
    • her ikisi için de genişlemiş O (n1 + n2) 'dir
  • iki sıralı listeleri birleştirme bir kriteri listesine O (n1 + n2) 'dir.
    • Her iki listelerin başkanlarına işaretçileri tutun
    • Daha küçük baş alın ve onun ilerletir
    • Bu birleştirme-tür eserlerin nasıl birleştirme olduğunu
  • Sıralanmış listeden mükemmel dengeli BST oluşturma O (N)
    • ortasında değer kök ve recurse olacaktır.
    • Bizim durumumuzda sıralı liste boyutu n1 + n2 taşımaktadır. böylece O (n1 + n2)
    • Ortaya çıkan ağaç listenizde arama ikili kavramsal BST olurdu

O'da O (n1 + n2) sonucu üç adım (n1 + n2)

aynı büyüklük düzenin n1 ve n2 için, bu O iyidir (n1 * log (n2))

Cevap 18/06/2009 saat 01:14
kaynak kullanıcı

oy
1

Jonathan,

sıraladıktan sonra, biz uzunluk n1 + n2 bir listesi var. bunun dışında bir ikili ağaç Bina (n2 + n1) zaman log alacaktır. Biz birleştirme sıralama algoritması sahip olarak bu birleştirme tür aynıdır, sadece her tekrarlayan adım alışkanlık, bir O (n1 + n2) terimi sahiptir. Yani zaman karmaşıklığı log (n1 + n2) 'dir.

Şimdi bütün sorunun karmaşıklığı O (n1 + n2) 'dir.

Ayrıca iki listeleri karşılaştırılabilir boyuttadır eğer bu yaklaşım iyi olduğunu söyleyebilirim. boyutları daha sonra karşılaştırılabilir değilseniz o büyük ağacın içine küçük ağacın her düğümü eklemek için en iyisidir. Bu O (n1 * log (n2)) zaman alacaktı. Örneğin iki ağaç büyüklüğü 1024 büyüklüğü 10 ve bir varsa 1034 = n2 + Burada n1 burada n1log (n2) = 10 * 10 = 100 Böylece yaklaşım iki ağaç boyutları bağlıdır için olduğu gibi.

Cevap 27/07/2010 saat 22:08
kaynak kullanıcı

oy
0

O (n1 * log (n2)) biz 2 birleştirme bir BST herhangi sıralanmamış liste olsa bile ortalama senaryodur. Biz liste sıralı liste veya BST olduğu gerçeğini kullanarak verilmez.

bir BST varsaymak bana Lets göre n1 öğesi vardır ve diğer n2 elemanları vardır. Şimdi O (n1) bir sıralama Array List L1 içine bir BST'yi dönüştürün.

Birleştirilmiş BST (BST, Dizisi)

(Array.size == 0) dönüş TSİ halinde (Array.size == 1) eğer BST elemanını yerleştirin. BST döndürür;

Sol eleman <BST.rootnode ve sağ eleman> = BST.rootnode Index demek dizideki endeksi bulun. if (BST.rootNode.leftNode == null) // yani hiçbir sol düğüm else {BST sol ve içine 0'a Index tüm dizi ekleyin} {Birleştirilmiş BST (BST.leftNode, Array {0} Endeksine)}

(BST.rootNode.rightNode == null) // yani hiçbir hak düğüm else {BST sağında içine Array.size için Index gelen tüm dizi ekleyin} eğer {BST Birleştirilmiş (BST.rightNode, Array {Endeksi Array.size için} )}

BST'yi dönün.

Bu algoritma, her zaman biz subproblem işlemek için diziyi ve BST bölünmesine gibi O (n1 * log (n2)) daha << zaman alacaktır.


Cevap 30/08/2010 saat 11:12
kaynak kullanıcı

oy
-1

Fikir kastetmek inorder yinelemeli kullanmaktır. İki BSTS için iki yardımcı yığınları kullanın. Biz ağaçların herhangi birinden daha küçük bir elemanı olsun her, sıralı biçimde baskı unsurlarına gerektiğinden, bunu yazdırmak. eleman büyükse, o zaman bir sonraki tekrarına yönelik yığın geri itin.

Cevap 08/01/2013 saat 07:04
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more