2009-05-26 12 views
6

Ich bin Patricia versucht für IP-Präfix-Lookup, könnte ich die Code für die vollständige Schlüsselübereinstimmung, aber mit Problemen mit Präfix Suche, wenn es sind Schlüssel, die sind Präfixe von anderen Tasten, wie:Algorithmus/Schritte zu finden längsten Präfix Suche in Patricia Trie

1.2.3.0 
1.2.0.0 

mir jemand mit dem Algorithmus für Präfix sucht im obigen Fall helfen kann Soll ich diese als Schlüssel getrennter Länge (dh/24 und 16) in Betracht ziehen?

Antwort

3

Wenn Sie diesen Trie zum Speichern von IP-Nummern als Elemente der festen Länge verwenden, ist es definitiv nicht der richtige Weg. Der Punkt hier ist, dass PT besonders nützlich zum Speichern von Daten mit variabler Länge ist.

Wenn Sie Teile von IP-Nummern als Präfixe mit variabler Länge speichern, ist PT eine gute Wahl.
In diesem Fall sollten ja Ihre Schlüssel unterschiedlich lang sein.
Nehmen wir an, Sie speichern Präfix "192.168" in binär 0xC0 0xA8, Sie fügen dies als ersten Schlüssel hinzu.
Wenn Sie dann nach IP wie 192.168.1.1 suchen, können Sie Informationen erhalten, dass Ihr Trie 192.168 enthält, was ein Präfix dessen ist, nach dem Sie suchen.

Alles, was Sie tun müssen, ist, den "gemeinsamen Teil" zu speichern, während Sie den Trie durchqueren.
Dies ist eine geringfügige Ergänzung zu der this Implementierung. Stellen Sie nur sicher, dass Sie den allgemeinen Teil in den Parametern der rekursiven Funktion speichern.
Für ein gutes Verständnis von Patricia Trie würde ich vorschlagen, lesen Robert Sedgewick's Algorithms book, die eine große Quelle des Wissens ist.

BEARBEITEN: Es gibt ein Problem beim Speichern von C-Zeichenfolgen in PT. Dieser Trie dient zum Speichern binärer Daten, aber Sie sind nur daran interessiert, die ganzen Bytes zu erhalten. Stellen Sie sicher, dass Sie den gemeinsamen Teil des Präfix nur dann speichern, wenn seine Größe in Bits ein Vielfaches von 8 ist. Für ein falsches Beispiel: Sie haben einen Schlüssel in Ihrem Baum: 0xC0 0xA5 und Sie suchen nach 0xC0 0xA6. Ihr Durchlauf stoppt, wenn der gemeinsame Teil "0xC0 0xA" ist, aber Sie möchten nur "0xC0" nehmen. Stellen Sie also sicher, dass Sie gemeinsame Bytes und keine Bits speichern.

Verwandte Themen