Hogyan lehet egyesíteni két BST által hatékonyan?

szavazat
23

Hogyan lehet egyesíteni két bináris keresési fák fenntartása tulajdonát BST?

Ha úgy döntünk, hogy minden egyes elem egy fáról, és helyezze be a másik, ez egy összetett eljárás lenne O(n1 * log(n2)), ahol n1a csomópontok száma a fa (mondjuk T1), amelyet már feloszlott, és n2a csomópontok száma a a másik fa (mondjuk T2). Ezután a művelet után csak egy BST van n1 + n2csomópontokat.

A kérdésem: tehetünk jobbat, mint O (n1 * log (n2))?

A kérdést 17/06/2009 18:35
a forrás felhasználó
Más nyelveken...                            


6 válasz

szavazat
8

Mi a helyzet a simító mindkét fák rendezve felsorolja, összevonása a listákat, majd hozzon létre egy új fát?

Válaszolt 17/06/2009 18:43
a forrás felhasználó

szavazat
18
  • A görbületek fák rendezve felsorolja.
  • Merge kiválogatott listákat.
  • Készítsen fa ki egyesített listán.

IIRC, hogy a jelentése O (n1 + n2).

Válaszolt 17/06/2009 18:43
a forrás felhasználó

szavazat
26

Naaff válasza egy kicsit bővebben:

  • Lapítása egy BST egy rendezett listát O (N)
    • Ez csak „in-order” ismétlés az egész fa.
    • Csinálni mindkét jelentése O (n1 + n2)
  • Egyesülő két sorba rendezett listák egyetlen rendezett lista O (n1 + n2).
    • Tartsa mutatókat a feje mindkét lista
    • Pick a kisebb fej és előre a mutató
    • Így az egyesítés a merge-sort munkák
  • Létrehozása tökéletesen kiegyensúlyozott BST egy rendezett lista O (N)
    • Az érték a középső lenne a gyökér, és recurse.
    • A mi esetünkben a rendezett lista méretű n1 + n2. így O (n1 + n2)
    • Az így kapott fa lenne a fogalmi BST bináris keresést a lista

Három lépés O (n1 + n2) eredményeként O (n1 + n2)

N1 és N2 azonos nagyságrendű, ez jobb, mint O (n1 * log (n2))

Válaszolt 18/06/2009 01:14
a forrás felhasználó

szavazat
1

Jonathan,

A válogatás után, van egy lista hossza n1 + n2. Épület egy bináris fa ki fog tartani log (n1 + n2) idő. Ez ugyanaz, mint a merge sort, csak hogy minden rekurzív lépésben szokás van egy O (n1 + n2) kifejezés van az egyesítés rendezési algoritmusnak. Tehát az idő komplexitás log (n1 + n2).

Most összetettsége az egész problémát O (n1 + n2).

Továbbá azt mondják, hogy ez a megközelítés jó, ha két lista hasonló méretű. Ha a méret nem összehasonlítható, akkor a legjobb, hogy helyezze minden csomópontnak a kis fa egy nagy fa. Ez O (n1 * log (n2)) időben. Például ha van két fa egyik mérete 10 és a másik méret 1024 Itt n1 + n2 = 1034, ahol, mint n1log (n2) = 10 * 10 = 100. Tehát a megközelítésnek, hogy függ a mérete a két fa.

Válaszolt 27/07/2010 22:08
a forrás felhasználó

szavazat
0

O (n1 * log (n2)) az az átlagos esetben is, ha van 2 egyesítés bármely rendezetlen listát egy BST. Nem vagyunk kihasználva azt a tényt, hogy a lista lista vagy BST.

Szerint nekem tételezzük fel, egy BST van n1 és egyéb elemek is n2 elemekkel. Most átalakítani egy BST egy rendezett tömbben List L1 O (n1).

Egyesített BST (BST, Array)

ha (Array.size == 0) visszatérési BST, ha (Array.size == 1) helyezze az elem a BST. visszatérés BST;

Keresse az index a tömb, amelynek baloldali elem <BST.rootnode és jobbra elem> = BST.rootnode mondani Index. ha (BST.rootNode.leftNode == null) // azaz nincs bal csomópont {illessze a tömb összes a Index 0 bal- BST és} else {Egyesített BST (BST.leftNode, Array {0 index})}

ha (BST.rootNode.rightNode == null) // azaz nincs joga csomópont {illessze a tömb összes a Index Array.size be jobbra BST} else {Egyesített BST (BST.rightNode, Array {Index Array.size} )}

visszatér BST.

Ez az algoritmus kerül << időt igényel, mint O (n1 * log (n2)), mint minden alkalommal, amikor particionálásakor a tömb és a BST kezelni a részkérdésnek.


Válaszolt 30/08/2010 11:12
a forrás felhasználó

szavazat
-1

Az ötlet az, hogy az iteratív inorder bejárása. Az általunk használt két kiegészítő stack két BSTs. Mivel mi kell nyomtatni az elemek rendezett formában, amikor kapunk egy kisebb eleme minden a fák, kiírjuk azt. Ha az elem nagyobb, akkor tolja vissza verem a következő iteráció.

Válaszolt 08/01/2013 07:04
a forrás felhasználó

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