Was ist der Unterschied zwischen Radix-Bäumen und Patricia-Versuchen?

31

Ich lerne etwas über Radix-Bäume (aka komprimierte Versuche) und Patricia-Versuche, finde aber widersprüchliche Informationen darüber, ob sie tatsächlich gleich sind oder nicht. Ein Radix-Baum kann aus einem normalen (nicht komprimierten) Versuch erhalten werden, indem Knoten mit ihren Eltern zusammengeführt werden, wenn die Knoten das einzige Kind sind. Dies gilt auch für Patricia Versuche. Inwiefern unterscheiden sich die beiden Datenstrukturen?

Zum Beispiel listet NIST die beiden als gleich auf:

Patricia Baum

(Datenstruktur)

Definition: Eine kompakte Darstellung eines Versuchs, bei dem jeder Knoten, der ein einziges untergeordnetes Element ist, mit seinem übergeordneten Element zusammengeführt wird.

Auch als Radixbaum bekannt.

Viele Quellen im Internet behaupten dasselbe. Anscheinend handelt es sich bei Patricia-Versuchen jedoch um einen speziellen Fall von Radix-Bäumen. Wikipedia- Eintrag sagt:

PATRICIA-Versuche sind Radix-Versuche mit Radix gleich 2, was bedeutet, dass jedes Bit des Schlüssels einzeln verglichen wird und jeder Knoten ein Zwei-Wege-Zweig (dh Links-Rechts-Zweig) ist.

Ich verstehe das nicht wirklich. Ist der Unterschied nur in der Art und Weise, wie Vergleiche beim Nachschlagen durchgeführt werden? Wie kann jeder Knoten eine "bidirektionale Verzweigung" sein? Sollte es ALPHABET_SIZEfür einen bestimmten Knoten nicht höchstens mögliche Verzweigungen geben?

Kann das jemand klären? Werden Radix-Versuche aus praktischen Gründen normalerweise als Patricia-Versuche implementiert (und werden sie daher häufig als gleich angesehen)? Oder können solche Verallgemeinerungen nicht gemacht werden?

w128
quelle

Antworten:

22

Ich fand diesen Beitrag sehr hilfreich.

Um den Unterschied zwischen Patricia-Versuchen und Radix-Bäumen zu erkennen, ist es wichtig zu verstehen:

  • Der Begriff Radix , da Patricia versucht, Radixbäume mit Radix gleich 2 zu sein.
  • r2r

Angenommen, wir fügen die Schlüssel smile , smiled und smiles (in dieser Reihenfolge) in eine Patricia-Trie ein. Die binäre Darstellung dieser Schlüssel lautet wie folgt:

Binäre Darstellung der drei Beispielschlüssel

Beachten Sie, dass smile ein Präfix für smiled ist. Wenn Sie die Binärdarstellung analysieren, können Sie feststellen, dass das erste Bit, das sich unterscheidet (von links nach rechts), 0 ist (in der zweiten Zeile rot hervorgehoben). Aus diesem Grund wird Smiled das linke Kind des Lächelns sein . Ebenso Lächeln wird der sein rechtes Kind von gelächelt , weil sie die gleichen Präfix bis zu einem Bit , dessen Wert teilen , ist 1 (in rot in der dritten Reihe hervorgehoben). Der resultierende Patricia-Versuch nach dem Einfügen der drei Schlüssel ist der folgende:

Patricia Trie mit 3 Knoten

Wenn die Basis beispielsweise 4 wäre, könnten interne Knoten höchstens vier untergeordnete Knoten haben (deren Kanten mit 00, 01, 10 bzw. 11 gekennzeichnet sind). In diesem Fall würden die Schlüssel mit Blöcken von 2 Bits verglichen und nicht mit 1 (wie bei Patricia).


Inwiefern unterscheiden sich die beiden Datenstrukturen?

Meines Erachtens ist der einzige Unterschied der Radix, der bei Patricia-Versuchen gleich 2 ist. Dieser Wert kann in regulären Radix-Bäumen eine beliebige Zweierpotenz sein.

Ist der Unterschied nur in der Art und Weise, wie Vergleiche beim Nachschlagen angestellt werden?

Log2RR

Wie kann jeder Knoten eine "bidirektionale Verzweigung" sein? Sollte es ALPHABET_SIZEfür einen bestimmten Knoten nicht höchstens mögliche Verzweigungen geben?

Die Basis gibt die maximale Anzahl von untergeordneten Elementen an, die die Knoten eines Basisbaums haben können. Wenn beispielsweise radix = 2 ist, kann jeder Knoten höchstens zwei untergeordnete Knoten haben. Dies ist der Fall bei Patricia-Versuchen (auch als binäre Radix-Bäume bekannt).

Werden Radix-Versuche normalerweise als Patricia-Versuche implementiert (und werden sie daher oft als gleich angesehen)? Oder können solche Verallgemeinerungen nicht gemacht werden?

Um ehrlich zu sein, habe ich keine Antwort auf diese Frage. Es scheint, dass beide Datenstrukturen ungefähr zur gleichen Zeit von verschiedenen Autoren vorgeschlagen wurden. Aus historischen Gründen, die mir nicht bekannt sind, leben beide Begriffe noch heute.

Mario Cervera
quelle
3

Ein Patricia-Trie ist ein binärer Radix-Trie, der sich aus der Anwendung des PATRICIA-Algorithmus auf alphanumerische Daten ergibt.

PATRICIA steht für Practical Algorithm To Retrieve Information Coded in Alphanumeric [ Originalarbeit von Donald R. Morrison ]. Der Artikel definiert ein Grundwortschatz bestehend aus START, STOP, ENDE, L-PHRASE, ZWEIG, ZWEI und KETTE. PATRICIA-Versuche sind die Versuche, die sich aus der Anwendung dieses Algorithmus ergeben - binäre Radix-Versuche, bei denen der Radix r 2 ist [ Wikipedia ] (und höher); eine binäre Auswahl an jedem Knoten, wenn der Versuch durchlaufen wird).

In der Praxis scheint der Begriff Patricia jedoch mit r> = 2 (dh Radix-Versuchen) verwendet zu werden, wo ein ähnlicher Speicher- und Suchalogorithmus verwendet wird. Dies wird zum Beispiel als Patricia bezeichnet. Das Ethereum Patricia Merkle Trie ist ein weiteres Beispiel, bei dem r an bestimmten Knoten 16 ist.

atomh33ls
quelle