Saludos,
quisiera recibir opiniones y sugerencias para optimizar el rendimiento de esta funcion porque me esta costando mucho trabajo y no se que mas hacerle.
La funcion
ObtenerTablaHuffman recibe como parámetro el primer nodo de un árbol binario donde los únicos nodos que me interesan son las hojas, esta función invoca a la función
ProcesarNodo la cual se encarga de recorrer el árbol de manera recursiva e ir elaborando un mapa para llegar a cada una de las hojas, cuando tiene completo el mapa para llegar a una de las hojas guarda esa información en el objeto tablaHuffman.
El problema desde luego esta en la funcion recursiva, he hecho pruebas usando arrays en vez de listas pero los resultados, si bien han existido, son casi despreciables, y estoy necesitando optimizar esta rutina de alguna manera.
Recibo sugerencias y/o correcciones.
Gracias.
<!--xc1--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>
XCODE </td></tr><tr><td id='XCODE'><!--exc1-->
/// <summary> /// Obtiene una tabla con el color y el mapa a seguir en el arbol binario /// para hallar dicho color /// </summary> /// <param name="nodoPadre">Nodo padre del arbol huffman</param> /// <returns>Un array que representa la tabla creada</returns> public NumeroColorHuff[] ObtenerTablaHuffman(NodoHuffman nodoPadre)
{
List<NumeroColorHuff> tablaHuffman =
new List<NumeroColorHuff>(nodoPadre.frecuencia);
NodoHuffman nodoAux = nodoPadre;
CodificadorJKI<T>.CompNumColorHuff_NumColorHuff_Color comparador =
new CodificadorJKI<T>.CompNumColorHuff_NumColorHuff_Color();
List<byte> listaBytes =
new List<byte>(
32);
ProcesarNodo(nodoAux, tablaHuffman, listaBytes);
NumeroColorHuff[] tabla = tablaHuffman.ToArray();
Array.Sort(tabla, comparador);
return tabla;
}
/// <summary> /// Procesa un nodo y sus hijos, determina si agrega u nuevo nodo a la tabla y lleva un registo de la /// ruta seguida hasta llegar a un nodo que debe ser ingresado en la tabla /// </summary> /// <param name="nodo">Nodo padre del arbol huffman</param> /// <param name="tablaHuffman">Tabla donde se dejaran los nodos validos hallados</param> /// <param name="listaBytes">Lista de bytes que sirve de mapa para determinar la ruta hasta llegar a los diferentes nodos hoja.</param> private void ProcesarNodo(NodoHuffman nodo, List<NumeroColorHuff> tablaHuffman, List<byte> listaBytes)
{
if (nodo.color != null)
tablaHuffman.Add(
new NumeroColorHuff(
(T)nodo.color,
listaBytes)
);
else {
if (nodo.derecha != null)
{
listaBytes.Add(
1);
ProcesarNodo(nodo.derecha, tablaHuffman, listaBytes);
}
if (nodo.izquierda != null)
{
listaBytes.Add(
0);
ProcesarNodo(nodo.izquierda, tablaHuffman, listaBytes);
}
}
if (listaBytes.Count >
0)
listaBytes.RemoveAt(listaBytes.Count -
1);
}
}<!--xc2--></td></tr></table><div class='postcolor'><!--exc2-->
Actualmente esta tardando mas 20 segundos en recorrer un árbol que tiene 22.196 hojas aunque el total de nodos es considerablemente mayor y no lo tengo estimado. b:(