2009-05-26 10 views
6

Je suis implémentant Patricia essaie de recherche de préfixe IP, je pourrais obtenir le code de travail pour la correspondance complète de la clé, mais face à des problèmes de recherche de préfixe, quand il sont des clés qui sont préfixes d'autres clés, comme:Algorithme/étapes pour trouver plus long préfixe de recherche dans Patricia Trie

1.2.3.0 
1.2.0.0 

quelqu'un peut-il me aider avec l'algorithme de recherche de préfixe dans le cas ci-dessus Dois-je considérer comme des clés de longueur séparée (par exemple/24 et 16)?

Répondre

3

Si vous utilisez ce trie pour stocker des numéros IP en tant qu'éléments de la longueur fixe, alors ce n'est certainement pas la bonne façon. Le point ici est que PT est particulièrement utile pour stocker des données de longueur variable.

Si vous stockez des parties de numéros IP, en tant que préfixes de longueur variable, PT est un bon choix.
Dans ce cas, vos clés doivent être de longueur différente. Supposons que vous stockiez le préfixe "192.168" dans le binaire 0xC0 0xA8, vous l'ajoutez en tant que première clé.
Ensuite, lors de la recherche d'IP comme 192.168.1.1 vous pouvez obtenir des informations que votre trie contient 192.168 qui est un préfixe de ce que vous recherchez.

Tout ce que vous avez à faire est de stocker la "partie commune" en traversant le trie.
Ceci est un ajout mineur à l'implémentation this. Assurez-vous que tout en descendant le trie vous stockez la partie commune quelque part dans les paramètres de la fonction récursive.
Pour une bonne compréhension de Patricia Trie, je suggère de lire Robert Sedgewick's Algorithms book qui est une excellente source de connaissances.

EDIT: Il existe un problème lors du stockage des chaînes C dans PT. Ce trie est conçu pour stocker des données binaires, mais vous ne souhaitez obtenir que les octets entiers. Assurez-vous que vous stockez la partie commune du préfixe seulement si sa taille en bits est multiple de 8. Pour un mauvais exemple: vous avez une clé dans votre arbre: 0xC0 0xA5 et vous cherchez fro 0xC0 0xA6. Votre traversée s'arrêtera lorsque la partie commune "0xC0 0xA", mais vous ne souhaitez prendre que "0xC0". Assurez-vous donc de stocker des octets communs, pas des bits.

Questions connexes