2009-05-26 11 views
6

Sto implementando i tentativi di Patricia per la ricerca del prefisso IP, potrei ottenere il codice funzionante per la corrispondenza completa della chiave, ma i problemi con la ricerca del prefisso, quando ci sono chiavi che sono prefissi di altri tasti, come:Algoritmo/passi per cercare il prefisso più lungo in Patricia Trie

1.2.3.0 
1.2.0.0 

qualcuno mi può aiutare con l'algoritmo per le ricerche prefisso nel caso di cui sopra Devo considerare questi come chiavi di lunghezza separato (cioè,/24 e 16)?

risposta

3

Se si utilizza questo trie per memorizzare i numeri IP come elementi della lunghezza fissa, non è sicuramente la strada giusta. Il punto qui è che PT è particolarmente utile per la memorizzazione di dati di lunghezza variabile.

Se si memorizzano parti di numeri IP, come prefissi di lunghezza variabile, PT è una buona scelta.
In questo caso sì, le chiavi devono essere di lunghezza diversa.
Diciamo che stai memorizzando il prefisso "192.168" in 0xC0 0xA8 binario, lo aggiungi come prima chiave.
Quindi, durante la ricerca di IP come 192.168.1.1 è possibile ottenere informazioni che il trie contiene 192.168 che è un prefisso di ciò che si cerca.

Tutto ciò che dovete fare è memorizzare la "parte comune" mentre attraversate il trie.
Questa è una piccola aggiunta all'implementazione this. Assicurati che mentre vai giù per il trie memorizzi la parte comune da qualche parte nei parametri della funzione ricorsiva.
Per una buona comprensione di Patricia trie suggerirei di leggere Robert Sedgewick's Algorithms book che è una grande fonte di conoscenza.

EDIT: C'è un problema durante la memorizzazione di stringhe C in PT. Questo trie è progettato per memorizzare dati binari, ma sei interessato solo a ottenere l'intero byte. Assicurati di memorizzare una parte comune del prefisso solo se la sua dimensione in bit è multiplo di 8. Per un esempio errato: hai la chiave nella tua struttura: 0xC0 0xA5 e stai guardando da 0xC0 0xA6. Il tuo attraversamento si fermerà quando la parte comune "0xC0 0xA", ma sei interessato a prendere solo "0xC0". Quindi assicurati di memorizzare byte comuni, non bit.