Was ist die beste Art der Umsetzung Baum : LinkedList - Array
Ich bin auf eine Prüfung vorbereiten, eine der Fragen, die ich gestoßen bin, ist : was ist der beste Weg zur Umsetzung Baum, LinkedList oder ein Array ist.
Wahrscheinlich:
- Array verwendet 1 Adresse
- LinkedList verwenden Sie zwei Adressen.
Verwendung von LinkedList, fügen wir den Wert, den wir benötigen (wir perfekt verwalten den Speicher), aber die meisten likey Verwendung von O(N) für den Zugriff auf dieses element, während in der Reihe, es O(1).
Wie soll ich diese Frage beantworten ? Oder sollte ich einfach sagen, dass ist subjektiv.
- Es hängt davon ab, ist der Baum ein BST?
- Wir müssen auch wissen, Dinge wie, welche Sprache wir arbeiten. I. E. ist es eine Sprache mit Pointern? Welche Art von Baum, oder ist es nur zu Fragen, für wie generisch implementieren einen Knoten der Klasse (wenn die Sprache den Klassen)?
- Wenn es ist ein binärer Baum, dann verwenden Sie verknüpfte Liste. Wenn es einen BTree mit einem branching-Faktor als
B
können Sie speichern die Schlüssel in einem Knoten in einem array und der Kind-Zeiger, die als verknüpfte Liste. - Ja ! Es ist ein Binärer Suchbaum. Sie sagte in C/Python.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für eine
Binary Search Tree
, die Antwort wäre auf jeden Fall ein array ( zumindest hoffentlich ein erweiterbares array, wie einvector<>
so sind Sie nicht beschränkt auf eine Feste Größe). Ich werde tun, eine Analyse der gemeinsamen Operationen, vorausgesetzt, der Baum ist ausgeglichen.Abfrage
In einer BST-Knoten müssen die Zeiger auf linken und rechten Kindern und ist auch sehr Häufig auf den parent-Zeigern. In einem array Implementierung, der "Zeiger" können Sie einfach integer-Indizes in dem array ( das würde bedeuten das array speichern
Node
Objekte). So suchen die Eltern und die Kinder eines Knoten ist konstant, da die Indizierung in dem array konstant ist.O(1)
. Eine verkettete Liste Implementierung würde wahrscheinlich benötigen, um auch speichern Sie einen Verweis auf die position zu, wo Ihre Vorfahren/Kinder sind, so dass eineO(N)
Durchlauf durch die Liste, um die gewünschten Referenzen.Suche
Ab der
root
,array[0]
Suche wäre einO(log N)
Betrieb. Die Suche würde einfach anrufen/Holen Sie sich die info der Kinder pro Knoten ist O(1) Menge der Arbeit, etwa O(log N) - mal, soO(log N)
für die Suche in einem array.Einer verknüpften Liste erfordern würde, ist eine O(N) Durchlaufen die Daten, um die erforderlichen Links - /rechts-Zeiger und kann auch durchgeführt werden in O(log N) Schritte, damit die eine
O(n log n)
Suche in verknüpften Listen.Einfügen
Arrays ähnlich sein würden Suche, außer zusätzliche
O(1
) Konstante Zeit für Zeiger-Zuweisungen. SoO(log N)
einfügen.Verketteten Listen wäre auch ähnlich wie Ihre Suche routine, außer mit einer zusätzlichen
O(n)
Zeit für die Justage der Zeiger, soO(n log n)
Löschen
Arrays wäre auch ähnlich Suche, außer, dass Sie mehr nehmen könnte, als ein Einzelzimmer
O(log n)
Faktor zu löschen, da Sie zu durchqueren wieder auf den Baum, aber es ist immer nochO(log n).
Verketteten Listen würde auch der
O(n log n)
plus mehrO(n log n)
für aufwärts fahren. SoO(n log n)
für verknüpfte Listen als gut.Abschluss
Sollte die Antwort ziemlich klar jetzt 🙂 Plus mit arrays erhalten Sie den Vorteil der besseren
caching
als verkettete Listen. Plus, einige Derivate des binären suchbäume, wieheaps
(in der Regel min-heaps/max-heaps) sind Häufig vertreten, wie arrays,Ich hoffe, das hilft 🙂
Einer
array
ist, was ich nennen möchte ein grundlegender Typ. Das heißt, es ist im Grunde das Betriebssystem auf dem raw-Speicher des Systems. Sie können wickeln Sie einen grundlegendenarray
mit einer Klasse hinzufügen, um Dinge wie out-of-bounds-Schutz, aber du bist noch zu haben, die raw-Unterstützung für den Zugriff auf/Indizierung in einen block von Speicher, in etwas, das nicht Montage.Für eine (einfach) verkettete Liste, in python würde es so Aussehen:
Und so weiter, können Sie sehen, dass für die meisten Vorgänge, die Sie einfach Durchlaufen die Stamm-Kinder, bis Sie erhalten, wo Sie sein möchten. Einfügen eines Elements bedeutet einfach einbauen, dass man den Eintrag Kind mit den neuen Eintrag und setzen Sie den neuen Eintrag Kind auf das alte Kind (und increment size)
In der Regel für einfach verknüpfte Listen-element insertion O(1) wenn Sie bereits den alten Eintrag (der Sie für die meisten Iteratoren) oder am Heck/root. Suche nach einem element mit index O(n), wie Sie benötigen zum Durchlaufen der Liste, und Iteratoren können nur
down
die Liste (ist vonindex = 0
zuindex = size-1
.Im Grunde alle diese Informationen kann untersucht werden, indem Sie einfach die Lektüre des entsprechenden wikipedia-Einträge. Diese sind alle ziemlich grundlegende Typen, die haben schon eine sehr lange Zeit.
what is the best way to implement tree, LinkedList or Array.
Best ist eine sehr subjektive Sache. Case in point,size
für eine verknüpfte Liste ist nicht erforderlich, um O(1) (und in der Tat ist nicht in mehreren Implementierungen), der vor C++11 standard. Die Begründung ist, dass du einfügen von Elementen sehr viel häufiger als die Abfrage einer Liste der Größe, also warum sollten Sie zahlen den Preis für die Führungsize
up-to-date-element einfügen?