2009-05-26 8 views
6

Me estoy poniendo en práctica Patricia intenta para la búsqueda de prefijo IP, que podría conseguir el código trabajar para partido clave completa, pero se enfrentan a problemas con la búsqueda de prefijo, cuando hay son claves que sean prefijos de otras claves, como:algoritmo/pasos para encontrar la búsqueda más larga Prefijo de Patricia Trie

1.2.3.0 
1.2.0.0 

¿Puede alguien ayudarme con el algoritmo de búsquedas de prefijos en el caso anterior Debería considerar éstas como las llaves de longitud por separado (es decir,/24 y 16)?

Respuesta

3

Si utiliza este trie para almacenar números de IP como elementos de longitud fija, definitivamente no es el camino correcto. El punto aquí es que PT es especialmente útil para almacenar datos de longitud variable.

Si almacena partes de números IP, como prefijos de longitud variable, PT es una buena opción.
En este caso, sí, las llaves deben ser de diferente longitud.
Digamos que está almacenando el prefijo "192.168" en binario 0xC0 0xA8, lo agrega como primera clave.
Luego, al buscar IP como 192.168.1.1 puede obtener información de que su trie contiene 192.168 que es un prefijo de lo que busca.

Todo lo que tiene que hacer es almacenar la "parte común" al atravesar el trie.
Esta es una pequeña adición a la implementación this. Solo asegúrate de que mientras estés abajo guardes la parte común en algún lugar de los parámetros de la función recursiva.
Para una buena comprensión de Patricia trie, sugeriría leer Robert Sedgewick's Algorithms book que es una gran fuente de conocimiento.

EDIT: Hay un problema al almacenar C cadenas en PT. Este trie está diseñado para almacenar datos binarios, pero solo le interesa obtener todos los bytes. Asegúrese de guardar una parte común del prefijo solo si su tamaño en bits es múltiplo de 8. Para un ejemplo incorrecto: tiene una clave en su árbol: 0xC0 0xA5 y está buscando 0xC0 0xA6. Su recorrido se detendrá cuando la parte común "0xC0 0xA", pero está interesado en tomar solo "0xC0". Así que asegúrese de almacenar bytes comunes, no bits.

Cuestiones relacionadas