Estructura de Datos : Arboles Trie


Definiciones


Ejemplos de Tries

Veamos las particularidades generales de todos los ejemplos :

Primer ejemplo

El Trie tiene el órden de las porciones iguales a los números de las porciones :

                                A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
                             +-----------------------------------------------------+
                             |0|0| | |0|0|0| |0|0|0|0|0|0|0| |0|0|0|0| |0|0| |0|0|0|                                   --------- Nivel 1
                             +-----------------------------------------------------+
                                  | |       |               |         |     |
                                  | |       |               |         |     +---------------------------------+
                                  | |       |               |         +-------------------------+             |
            +---------------------+ +---+   |               +---------------------+             |             |
            |                           |   +-----------------------+             |             |             |
            |                           |                           |             |             |             |
       +---------+                 +---------+                 +---------+   ***********   +---------+   ***********
       |..l....u.|                 |a...h....|                 |.....o..u|   * oriole  *   |....h....|   *  wren   *   --------- Nivel 2
       +---------+                 +---------+                 +---------+   ***********   +---------+   ***********
          |   |                       |   |                       |   |                         |
     +----+   +----+             +----+   +----+             +----+   +----+                    |
     |             |             |             |             |             |                    |
***********   ***********   ***********   ***********   +---------+   ***********          +---------+
*bluebird *   * bunting *   *cardinal *   *chickadee*   |..d...s..|   *  gull   *          |......r..|                 --------- Nivel 3
***********   ***********   ***********   ***********   +---------+   ***********          +---------+
                                                           |   |                                |
                                                      +----+   +----+                           |
                                                      |             |                           |
                                                 ***********   ***********                 +---------+
                                                 * godwit  *   * goshawk *                 |a.......u|                 --------- Nivel 4
                                                 ***********   ***********                 +---------+
                                                                                              |   |
                                                                                         +----+   +----+
                                                                                         |             |
                                                                                    ***********   ***********
                                                                                    *thrasher *   * thrush  *          --------- Nivel 5
                                                                                    ***********   ***********

Segundo ejemplo

Veamos ahora el ejemplo visto anteriormente pero creando el Trie usando porciones que van desde la derecha hacia la isquierda :


                                A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
                             +-----------------------------------------------------+
                             |0|0|0|0| | |0| | |0|0| | |0| |0|0|0| |0| |0|0|0|0|0|0|                                         --------- Nivel 1
                             +-----------------------------------------------------+
                                      | |   | |     | |   |       |   |
                                      | |   | |     | |   |       |   +----------------------------------------------+
                                      | |   | |     | |   |       +------------------------------------+             |
     +--------------------------------+ |   | |     | |   +------------------------------+             |             |
     |             +--------------------+   | |     | +--------------------+             |             |             |
     |             |             +----------+ ++    +--------+             |             |             |             |
     |             |             |             |             |             |             |             |             |
***********   +---------+   ***********   ***********   ***********   +---------+   ***********   ***********   ***********
*bluebird *   |         |   * bunting *   * thrush  *   * goshawk *   |         |   *  wren   *   *thrasher *   * godwit  *  --------- Nivel 2
***********   +---------+   ***********   ***********   ***********   +---------+   ***********   ***********   ***********
                 |   |                                                   |   |
            +----+   +----+                                         +----+   +----+
            |             |                                         |             |
       ***********   ***********                               ***********   ***********
       *chickadee*   * oriole  *                               *cardinal *   *  gull   *                                     --------- Nivel 3
       ***********   ***********                               ***********   ***********

Tercer ejemplo

Veamos ahora el ejemplo visto anteriormente pero creando el Trie usando el cuarto caracter de los valores de la clave en primer órden :


                                A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
                             +-----------------------------------------------------+
                             |0| |0| | | |0|0| |0|0|0| |0| | |0|0|0|0| | |0| |0|0|0|                                                                    --------- Nivel 1
                             +-----------------------------------------------------+
                                |   | | |     |       |   | |         | |   |
                                |   | | |     |       |   | |         | |   +--------------------------------------------------------------------+
                                |   | | |     |       |   | |         | +----------------------------------------------------------+             |
                                |   | | |     |       |   | |         +----------------------------------------------+             |             |
                                |   | | |     |       |   | +------------------------------------------+             |             |             |
                                |   | | |     |       |   +------------------------------+             |             |             |             |
     +--------------------------+   | | |     |       +--------------------+             |             |             |             |             |
     |             +----------------+ | |     +--------------+             |             |             |             |             |             |
     |             |             +----+ +------+             |             |             |             |             |             |             |
     |             |             |             |             |             |             |             |             |             |             |
***********   ***********   ***********   ***********   ***********   ***********   ***********   ***********   ***********   ***********   ***********
*thrasher *   *chickadee*   *cardinal *   *bluebird *   * goshawk *   *  gull   *   *  wren   *   * oriole  *   * bunting *   * thrush  *   *  godwit * --------- Nivel 2
***********   ***********   ***********   ***********   ***********   ***********   ***********   ***********   ***********   ***********   ***********

Si el juego de valores es conocido de antemano es posible realizar el estudio precedente, pero carece de sentido si el juego de valores es dinámico. En el caso de juego de valores dinámico, quizas la mejor Función Muestreo sea la segunda.

Cuarto ejemplo

Es tambien posible restringuir el número de niveles del Trie a un determinado número, por ejemplo, h. En este caso todos los sinónimos del nivel h-1 se ubican en mismo Nodo Hoja. El siguiente ejemplo crea un Trie con h = 3, usando porciones según el número de las porciones, desde la isquierda hacia la derecha, un caracter a la vez.


                                A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
                             +-----------------------------------------------------+
                             |0|0| | |0|0|0| |0|0|0|0|0|0|0| |0|0|0|0| |0|0| |0|0|0|                                   --------- Nivel 1
                             +-----------------------------------------------------+
                                  | |       |               |         |     |
                                  | |       |               |         |     +---------------------------------+
                                  | |       |               |         +-------------------------+             |
            +---------------------+ +---+   |               +---------------------+             |             |
            |                           |   +-----------------------+             |             |             |
            |                           |                           |             |             |             |
       +---------+                 +---------+                 +---------+   ***********   +---------+   ***********
       |         |                 |         |                 |         |   * oriole  *   |         |   *  wren   *   --------- Nivel 2
       +---------+                 +---------+                 +---------+   ***********   +---------+   ***********
          |   |                       |   |                       |   |                         |
     +----+   +----+             +----+   +----+             +----+   +----+                    |
     |             |             |             |             |             |                    |
***********   ***********   ***********   ***********   ***********   ***********          ***********
*bluebird *   * bunting *   *cardinal *   *chickadee*   * godwit  *   *  gull   *          *thrasher *                 --------- Nivel 3
***********   ***********   ***********   ***********   * goshawk *   ***********          * thrush  *
                                                        ***********                        ***********


Función Muestreo ( Sampling Function )

Es importante tomar conciencia de que los Tries pueden residir en disco, y por lo tanto, cuantos menos niveles tenga será mejor. Este objetivo de la estructura de datos nos lleva a la Función Muestreo que se use en cada caso en particular. La tarea a realizar es analizar distintas Funciones Muestreo y los Tries producidos por ellas, para determinar la más conveniente o la que produce el Trie con menos niveles, que nos lleva la Trie más eficiente, principalmente cuando el Trie reside en disco.
Para el ejemplo primero visto, la Función Muestreo produce un Trie de 5 niveles.
Para el ejemplo segundo visto, la Función Muestreo produce un Trie de 3 niveles.
Para el ejemplo tercero visto, la Función Muestreo produce un Trie de 2 niveles.
Para el ejemplo cuarto visto, la Función Muestreo produce un Trie de 3 niveles.


Algoritmo de Búsqueda


        boolean buscarValor( Trie arbol, String clave )
        {
                clave = clave.trim();                           // Limpio la clave adelante y atrás
                Trie proximoNodo = arbol;                       // Inicializo el proximo nodo con el raiz
                String tipoEntrada = "B";                       // Inicializo el tipo de entrada a B, ya que el raiz debe ser B
                int enlace = 0;                                 // Inicializo el enlace
                
                while( true )                                   // Salgo del loop por return o break
                {
                        if ( tipoEntrada.equals("B") )
                        {
                               recuperarSiguienteNodo();        // Navego el árbol
                        }
                        else if ( tipoEntrada.equals("L") )
                        {
                               break;                           // Arribo a nodo hoja	
                        }
                        else if ( tipoEntrada.equals("0") )
                        {
                               return false                    // La clave no existe en el árbol 
                        }
                        else
						{
						}
                }

                if( claveNodoHoja.equals(clave) )              // Análisis del Nodo Hoja
                {
                        return true;                           // La clave existe en el índice
                }
                else
                {
                        return false;                          // La clave no existe en el índice
                }
        }