Wir verwenden Tries als Datenstruktur, um eine Reihe von Wörtern
darzustellen. Der Begriff „trie“ kommt vom Wort „re trie val“ und wird
normalerweise „try“ ausgesprochen, um ihn von anderen
"Tree"-Strukturen zu unterscheiden.
Ein Trie ist eine baumartige Datenstruktur, deren Knoten die
Buchstaben eines Alphabets speichern. Durch das Strukturieren der Knoten
in einer bestimmten Weise, können Wörter und Zeichenfolgen aus der
Struktur durch das Durchlaufen eines Zweigpfads des Baums wiedergewonnen
werden.
Tries werden genutzt für Autocompletion (z.B. Sucheingaben bei Google). Tries ermöglichen es uns Millionen von Wörtern im minimalen Memoryspeicher zu verstauen und sie super schnell zu finden.
Search O(L)
Insert O(L)
Remove O(L)
L = Length of the word
Jeder Trie hat einen leeren Root-Knoten mit verschiedenen Links (oder
Referenzen) zu anderen Knoten…–…eine Verbindung für jeden möglichen
alphabetischen Wert.
Die Form und Struktur eines Tries ist immer ein Satz verbundener
Knoten, die mit einem leeren Wurzelknoten verbunden sind. Es ist
wichtig zu beachten, dass die Anzahl der untergeordneten Knoten in
einem Trie vollständig von der Gesamtzahl der möglichen Werte abhängt.
Wenn wir beispielsweise das englische Alphabet darstellen, ist die
Gesamtzahl der untergeordneten Knoten direkt mit der Gesamtzahl der
möglichen Buchstaben verbunden. Im deutschen Alphabet gibt es 26
Buchstaben, sodass die Gesamtzahl der untergeordneten Knoten 26
beträgt. Die Größe eines Tries korreliert direkt mit der Größe aller
möglichen Werte, die der Trie darstellen könnte. In diesem Fall
enthält der Wurzelknoten 26 Links zu 26 anderen Kindknoten. In einem
anderen Fall evtl. mehr oder weniger.
Jeder Knoten in einem Trie, einschließlich des Wurzelknotens selbst,
hat zwei Aspekte:
- Ein Wert, der null sein kann
- Ein Array von Verweisen auf untergeordnete Knoten, die alle auch
null sein können
Wenn ein Trie erstellt wird, besteht er aus einem einzelnen
Wurzelknoten, dessen Wert normalerweise auf eine leere Zeichenfolge
gesetzt wird: "". Dieser Wurzelknoten hat ebenfalls ein Array mit 26
Referenzen, die alle zunächst auf null zeigen. Wenn der Trie wächst,
werden diese Zeiger mit Verweisen auf andere Knotenknoten gefüllt.
Das Coole daran ist, dass wir die Indizes des Arrays verwenden können,
um spezifische Verweise auf Knoten zu finden. Unser Root-Knoten
enthält beispielsweise ein Array von Indizes 0 bis 25, da es 26
mögliche Slots für die 26 Buchstaben des Alphabets gibt. Wir wissen
also, dass die Referenz auf den Knoten, der den Buchstaben A enthält,
am Index 0 liegt.
Wenn wir nun fünf verschiedene Wörter, in diesem Trie repräsentieren (fischers, fritze, fischt, frische, fische), haben wir fünf
verschiedene „Zweige“ im Trie, einen für jedes dargestellte Wort.
Einige Wörter teilen sich die Elternknoten. Zum Beispiel teilen sich
alle Zweige für die Wörter fritze und frische die Knoten für f, r und
i. In ähnlicher Weise teilen sich die Pfade zu den Wörtern fischers,
fischt und fische die Knoten für f, i, s, c und h.