¿Cuál es la diferencia entre los árboles radix y los intentos de Patricia?

31

Estoy aprendiendo sobre los árboles radix (también conocidos como intentos comprimidos) y Patricia intenta, pero encuentro información contradictoria sobre si realmente son lo mismo o no. Se puede obtener un árbol de raíz de un trie normal (sin comprimir) fusionando nodos con sus padres cuando los nodos son el único hijo. Esto también es válido para los intentos de Patricia. ¿De qué maneras son diferentes las dos estructuras de datos?

Por ejemplo, NIST enumera los dos como iguales:

Árbol patricia

(estructura de datos)

Definición: Una representación compacta de un trie en el que cualquier nodo que es hijo único se fusiona con su padre.

También conocido como árbol radix.

Muchas fuentes en la web afirman lo mismo. Sin embargo, aparentemente los intentos de Patricia son un caso especial de árboles radix. La entrada de Wikipedia dice:

Los intentos de PATRICIA son intentos de radix con radix igual a 2, lo que significa que cada bit de la clave se compara individualmente y cada nodo es una rama de dos vías (es decir, izquierda versus derecha).

Realmente no entiendo esto. ¿Es la diferencia solo en la forma en que se hacen las comparaciones al hacer búsquedas? ¿Cómo puede cada nodo ser una "rama de dos vías"? ¿No debería haber como máximo ALPHABET_SIZEramas posibles para un nodo dado?

¿Alguien puede aclarar esto? Para fines prácticos, ¿los intentos de radix se implementan típicamente como los intentos de Patricia (y, por lo tanto, a menudo se consideran lo mismo)? ¿O no se pueden hacer tales generalizaciones?

w128
fuente

Respuestas:

23

Encontré esta publicación muy útil.

Para ver la diferencia entre los intentos de Patricia y los árboles radix, es importante comprender:

  • La noción de radix , ya que Patricia intenta son árboles radix con radix igual a 2.
  • La forma en que se tratan las claves: como flujos de bits . Las claves se comparan bits a la vez, donde es la raíz del trie.r2r

Supongamos que insertamos las teclas sonrisa , sonrisa y sonrisas (en este orden) en un patricio de Patricia. La representación binaria de estas claves es la siguiente:

Representación binaria de las tres claves de ejemplo.

Tenga en cuenta que la sonrisa es un prefijo de sonrisa y, analizando la representación binaria, podemos ver que el primer bit que difiere (de izquierda a derecha) es 0 (resaltado en rojo en la segunda fila); Por esta razón, sonrió será el hijo izquierdo de la sonrisa . Del mismo modo, sonrisas serán el hijo correcto de sonríe porque comparten el mismo prefijo hasta un bit cuyo valor es 1 (resaltado en rojo en la tercera fila). La resultante Patricia trie después de insertar las tres claves es la siguiente:

Patricia trie con 3 nodos

Si la raíz era, por ejemplo, 4, entonces los nodos internos podrían tener, como máximo, cuatro hijos (con sus bordes etiquetados como 00, 01, 10 y 11, respectivamente). En este caso, las claves se compararían con fragmentos de 2 bits y no con 1 (como en el caso de Patricia).


¿De qué maneras son diferentes las dos estructuras de datos?

A mi entender, la única diferencia es la raíz, que es igual a 2 en el caso de los intentos de Patricia. Este valor puede ser cualquier potencia de 2 en árboles radix regulares.

¿Es la diferencia solo en la forma en que se hacen las comparaciones al hacer búsquedas?

En ambas estructuras de datos, la operación de comparación es bit a bit. Sin embargo, el número de bits que se verifican atómicamente varía según la raíz. En el caso de los intentos de Patricia, los bits se comparan individualmente (ya que radix = 2). Este no es necesariamente el caso en los árboles radix. En general, los bits se verifican en trozos de tamaño , donde es la raíz del trie.log2RR

¿Cómo puede cada nodo ser una "rama de dos vías"? ¿No debería haber como máximo ALPHABET_SIZEramas posibles para un nodo dado?

La raíz establece el número máximo de hijos que pueden tener los nodos de un árbol de raíz. Por ejemplo, cuando radix = 2, cada nodo puede tener como máximo dos hijos. Este es el caso de los intentos de Patricia (también conocidos como árboles radix binarios).

¿Los intentos de radix se implementan típicamente como los intentos de Patricia (y, por lo tanto, a menudo se consideran lo mismo)? ¿O no se pueden hacer tales generalizaciones?

Para ser honesto, no tengo una respuesta para esta pregunta. Parece que ambas estructuras de datos fueron propuestas al mismo tiempo por diferentes autores. Por razones históricas que desconozco, ambos términos aún viven hoy.

Mario Cervera
fuente
3

Un Patricia trie es un bix radix trie resultante de la aplicación del algoritmo PATRICIA a datos alfanuméricos.

PATRICIA significa Algoritmo práctico para recuperar información codificada en alfanumérico [ documento original de Donald R. Morrison ]. El documento define un vocabulario básico que consiste en INICIO, PARADA, FIN, L-PHRASE, BRANCH, TWIN y CHAIN. Los intentos de PATRICIA son los intentos que resultan de la aplicación de este algoritmo: los intentos de radix binarios donde el radix, r, es 2 [ wikipedia ] (y superior); una opción binaria en cada nodo al atravesar el trie).

Sin embargo, en la práctica, el término Patricia parece usarse con r> = 2 (es decir, intentos de radix), donde se utiliza un algoritmo de almacenamiento y búsqueda similar. Por ejemplo, esto se titula como patricia. El Ethereum Patricia Merkle Trie es otro ejemplo, donde r es 16 en ciertos nodos.

atomh33ls
fuente