2013-06-11 6 views
7

Dies ist keine Hausaufgaben Ich nehme eine Datenstruktur-Klasse und wir haben vor kurzem Bäume abgeschlossen. Am Ende des Kurses zeigte mein Professor dieses Bild. Tree TimesWarum dauert das Einfügen sequenzieller Elemente in einem Baum mehr Zeit als das Einfügen zufälliger Elemente in einen Baum?

ConcreteBTree ist ein binärer Baum, der nicht selbst ausbalanciert. Ich habe ein paar Fragen zu den Zeiten, die ich brauchte, um diese Verfahren abzuschließen.

  1. Warum dauert das Einfügen von 100.000 sequenziellen Elementen in ConcreteBTree so viel länger als das Einfügen zufälliger Elemente? Meine Intuition wäre, dass Elemente, die sequenziell sind, weniger Zeit brauchen, als 1.000.000 zufällige Elemente einzufügen.

  2. Warum sind die Zeiten von insert() und find() von ConcreteBTree mit zufälligen Elementen so nahe beieinander? Liegt es daran, dass beide die gleiche Zeit Komplexität haben? Ich dachte, Einsatz war O (1) und finden war O (n)

ich wirklich verstehen möchte, was hier los ist, wäre eine Erklärung sehr geschätzt. Danke

+4

Das Einfügen sequentieller Elemente in einen nicht balancierenden Baum ist nur das Schlimmste, was Sie tun können. Sie werden im Endeffekt eine verknüpfte Liste erstellen, da Sie immer entweder nur den linken oder nur den rechten Knoten verwenden. – dlev

Antwort

8

Das Einfügen von sequentiellen Elementen (1,2,3,4 ...) in einen Binärbaum führt dazu, dass die Knoten immer auf derselben Seite (zum Beispiel links) hinzugefügt werden. Wenn Sie zufällige Elemente einfügen, fügen Sie Knoten zufällig links und rechts hinzu.

Das sequentielle Hinzufügen führt dazu, dass sich die Liste wie eine normale verkettete Liste verhält (für die sequentiellen Elemente), da neue Elemente jedes zuvor hinzugefügte Element aufrufen müssen und O (n) Schritte benötigt O (log N) Schritte im Durchschnitt.

+0

Okay, danke.Bedeutet das also, dass für zufällig eingefügte Elemente, da sie zufällig sind, eine gute Chance besteht, dass der Baum ausbalanciert wird, weil die Wahrscheinlichkeit, dass der zufällige Knoten größer oder kleiner als sein Elternteil ist, 0,5 ist? –

+1

Da sie zufällig sind, besteht eine gute Chance, dass der Baum ausbalanciert wird. Ja, bis Sie anfangen, neue Objekte zu entfernen und hinzuzufügen. –

+0

Verstanden, könntest du dir das Bild anschauen und sehen, ob concreteBTrees find() zusammenpasst? Ich sehe nicht, wie Sie 1 Million zufällige Elemente schneller finden finden Sie 100.000 zufällige Elemente –

3

Armins beantwortet Q1.

2.Warum sind die Zeiten von insert() und find() von ConcreteBTree mit zufälligen Elementen so nahe beieinander? Liegt es daran, dass beide die gleiche Zeit Komplexität haben? Ich dachte, Einsatz war O (1) und finden Sie wurde O (n)

insert und find haben die gleiche Arbeit zu tun - sie gehen nach unten durch, was auch immer seltsam Baum Sie zusammengestellt haben die Suche nach dem letzten Knoten, unter der der Wert ist entweder verknüpft oder wäre (und wäre im Fall von insert), so dass sie die gleiche Anzahl von Vergleichen und Knoten-Traversalen durchführen, wobei sie ähnliche Zeit benötigen.

Die Einfügung zufälliger Elemente in einen ausgeglichenen Baum ist O (log N). Ihre Einfügungen zufälliger Werte in einen Baum, der sich nicht selbst ausgleicht, werden ein wenig, aber nicht dramatisch schlechter, da einige Zweige wesentlich länger als andere enden werden - Sie werden wahrscheinlich eine Art Glockenkurve von Zweiglängen erhalten. insert ist nur O (1), wenn Sie bereits den Knoten in dem Baum kennen, unter dem die Einfügung erfolgen soll (d. H. Normalerweise wird der Schritt find oben benötigt). find ist nur O (n), wenn jeder Knoten im Baum besucht werden muss, was nur für einen pathologisch unausgeglichenen Baum der Fall ist, der effektiv eine verkettete Liste bildet, wie Sie bereits gesagt haben sortierte Elemente.

Verwandte Themen