示例#1
0
        ComponentesDeCadaNodo sumaDeProbabilidades(ComponentesDeCadaNodo nodo1, ComponentesDeCadaNodo nodo2)
        {
            var padre = new ComponentesDeCadaNodo();
            var informacionNuevoPadre = new ComponentesLecturaInicial();

            padre.datosDelCaracter = informacionNuevoPadre;
            padre.hijoIzquierdo    = nodo1;
            padre.hijoDerecho      = nodo2;
            padre.datosDelCaracter.probabilidad = nodo1.datosDelCaracter.probabilidad + nodo2.datosDelCaracter.probabilidad;
            return(padre);
        }
示例#2
0
        static void Main(string[] args)
        {
            const int buffersLength             = 100;
            var       contador                  = 0;
            var       CantidadTotalDeCaracteres = 0;
            List <ComponentesLecturaInicial> listaDeCaracteres = new List <ComponentesLecturaInicial>();

            using (var stream = new FileStream("PruebaLecturas.txt", FileMode.Open))
            {
                using (var reader = new BinaryReader(stream))
                {
                    CantidadTotalDeCaracteres = Convert.ToInt32(reader.BaseStream.Length);
                    var byteBurffer = new Char[buffersLength];
                    while (reader.BaseStream.Position != reader.BaseStream.Length)
                    {
                        byteBurffer = reader.ReadChars(buffersLength);

                        while (contador < byteBurffer.Length)
                        {
                            ComponentesLecturaInicial caracterParaLista = new ComponentesLecturaInicial();
                            caracterParaLista = listaDeCaracteres.Find(x => x.caracter == byteBurffer[contador]);
                            if (caracterParaLista == null)
                            {
                                caracterParaLista            = new ComponentesLecturaInicial();
                                caracterParaLista.caracter   = byteBurffer[contador];
                                caracterParaLista.frecuencia = 1;
                                listaDeCaracteres.Add(caracterParaLista);
                            }
                            else
                            {
                                caracterParaLista.frecuencia++;
                            }
                            contador++;
                        }
                    }
                }
            }
            //2 opciones para el calculo de las probabilidades....
            //o lo vamos calculando por cada vez que entre a cada condicion del ciclo que tenemos arriba o
            //cuando ya esten todos los datos en la lista recorrer cada posicion de la lista para sacar la probabilidad
            //yo preferiria el 2do la verdad porque se me hace mas optimo
            contador = 0;
            while (contador < listaDeCaracteres.Count)
            {
                listaDeCaracteres[contador].probabilidad = Convert.ToDouble(listaDeCaracteres[contador].frecuencia) / Convert.ToDouble(CantidadTotalDeCaracteres);
                contador++;
            }
            //una vez leido y con las probabilidades ya se comienza el Huffman :v
            listaDeCaracteres.Sort((comp1, comp2) => comp1.probabilidad.CompareTo(comp2.probabilidad));
            var nodosParaHuffman = new List <ComponentesDeCadaNodo>();

            contador = 0;
            while (contador < listaDeCaracteres.Count)
            {
                var nodoTransicion = new ComponentesDeCadaNodo();
                nodoTransicion.datosDelCaracter = listaDeCaracteres[contador];
                nodosParaHuffman.Add(nodoTransicion);
                contador++;
            }
            listaDeCaracteres = null;
            var algoritmoDeHuffman = new Huffman();

            algoritmoDeHuffman.EnsambladoDeHuffman(nodosParaHuffman);
            algoritmoDeHuffman.Prefijos();
            contador = 0;
        }