<--------- clave ---------->
+--------------------------+
| | | | | | | | | |
+--------------------------+
<> <> <> <> <> <> <> <> <> <> = Porción
Clave = aef789g, Porción 1 = ae, Porción 2 = f7, Porción 3 = 89, Porción 4 = g , Porción 5 = , Porción 6 = , Porción 7 = , Porción 8 = , Porción 9 = .
+--------------------------+
|ae|f7|89|g | | | | | |
+--------------------------+
Cantidad de caracteres distintos = 26 letras + 1 blanco = 27 caracteres
Cantidad de caracteres en cada porción = 1 caracter
Cantidad de entradas por nodo = 27 ** 1 = 27 entradas
Diseño del nodo :
a b c d ........ x y z
+--------------------------+
| | | | | | ........ | | | |
+--------------------------+
Cantidad de caracteres distintos = 28 letras + 1 blanco = 29 caracteres
Cantidad de caracteres en cada porción = 2 caracter
Cantidad de entradas por nodo = 29 x 29 = 29 ** 2 = 841 entradas
Diseño del nodo :
a b c d .......... ñn ññ ñm .......... zx zy zz
+----------------------------------------------------------+
| | | | | | .......... | | | | .......... | | | |
+----------------------------------------------------------+
Cantidad de caracteres distintos = 29 letras + 1 blanco + 10 numeros = 39 caracteres
Cantidad de caracteres en cada porción = 1 caracter
Cantidad de entradas por nodo = 39 ** 1 = 39 entradas
Diseño del nodo :
a b c d ... ñ ... x y z 1 2 ... 9 0
+-------------------------------------------+
| | | | | | ... | | ... | | | | | | ... | | |
+-------------------------------------------+
Cantidad de caracteres distintos = 28 letras + 1 blanco + 10 numeros + 7 caracteres especiales = 46 caracteres
Cantidad de caracteres en cada porción = 1 caracter
Cantidad de entradas por nodo = 46 ** 1 = 46 entradas
Diseño del nodo :
a b c d ... ñ ... x y z 1 2 ... 9 0 = < > % # & @
+---------------------------------------------------------+
| | | | | | ... | | ... | | | | | | ... | | | | | | | | | |
+---------------------------------------------------------+
+-------------------------------------------------------------------+
| | | | | | ................ | | .......... | | | |
+-------------------------------------------------------------------+
1 2 3 4 5 ................ i ........... n-2 n-1 n ----> Número de la porción
............---------------------..............
| Tipo | Enlace |
............---------------------..............
<--- Entrada --->
............---------------------..............
| B | *....|......................> Apunta a un Nodo Rama
............---------------------..............
<--- Entrada --->
............---------------------..............
| L | *....|......................> Apunta a un Nodo Hoja
............---------------------..............
<--- Entrada --->
............---------------------..............
| 0 | 0 | Entrada Vacia
............---------------------..............
<--- Entrada --->
Si el tipo es B el enlace apunta a un nodo rama, si el tipo es L el enlace apunta a un
nodo hoja y si el tipo es 0 es una entrada vacia, no apunta a ningún nodo y el árbol
termina en esa entrada.
+--------------------------------------+
| clave | direccion del registro |
+--------------------------------------+
+-------------------------------------------------------------------+
| | | | | | ................................. | | | |
+-------------------------------------------------------------------+
1 2 3 4 5 ................................. n-2 n-1 n ----> Número de la porción
1 2 3 4 5 ................................. n-2 n-1 n ----> Orden Ejemplo A
n n-1 n-2 n-3 n-4 ................................. 3 2 1 ----> Orden Ejemplo B
1 3 5 7 9 6 4 2 ----> Orden Ejemplo C
Veamos las particularidades generales de todos los ejemplos :
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
*********** ***********
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
*********** *********** *********** ***********
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.
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 *
*********** ***********
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.
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
}
}