Пример #1
0
        public void ArmarArbol(byte[] codigo)
        {
            counts = new Dictionary <byte, int>();
            var coladeprioridad = new Coladeprioridad <HuffmanNode <T> >();
            int cantvalores     = Convert.ToInt32(codigo[0]);
            int bytes           = Convert.ToInt32(codigo[1]) + 1;
            int frecuencia      = 0;
            int probabilidad    = 0;

            for (int i = 3; i < cantvalores * (bytes) + 2; i += bytes)
            {
                frecuencia    = BitConverter.ToInt32(codigo, i);
                probabilidad += frecuencia;
            }
            for (int i = 2; i < cantvalores * bytes + 2; i += bytes)
            {
                frecuencia = BitConverter.ToInt32(codigo, i + 1);
                counts.Add(codigo[i], frecuencia);
                var node = new HuffmanNode <T>((double)frecuencia / probabilidad, codigo[i]);
                coladeprioridad.Enqueue(node.Probability, node);
                _leafDictionary[codigo[i]] = node;
            }
            while (coladeprioridad.contar > 1)
            {
                HuffmanNode <T> hijoizquieda = coladeprioridad.Dequeue();
                HuffmanNode <T> rightSon     = coladeprioridad.Dequeue();
                var             parent       = new HuffmanNode <T>(hijoizquieda, rightSon);
                coladeprioridad.Enqueue(parent.Probability, parent);
            }

            _root = coladeprioridad.Dequeue();
        }
Пример #2
0
        public Huffman(IEnumerable <byte> values)
        {
            var coladeprioridad = new Coladeprioridad <HuffmanNode <T> >();

            foreach (byte value in values)
            {
                if (!counts.ContainsKey(value))
                {
                    counts[value] = 0;
                }
                counts[value]++;
                valueCount++;
            }
            string palabras = "";
            string conocer  = "";
            int    repfrec  = 1;

            foreach (byte value in counts.Keys)
            {
                conocer = counts[value].ToString();
                if (conocer.Length > 1)
                {
                    repfrec = conocer.Length;
                }
            }

            byte[] Bytesdevalores = new byte[1];
            Bytesdevalores[0] = Convert.ToByte(counts.Count);
            var numvalores = Encoding.UTF8.GetString(Bytesdevalores);

            byte[] Bytesdecantidad = new byte[1];
            Bytesdecantidad[0] = Convert.ToByte(repfrec);
            var numcantidad = Encoding.UTF8.GetString(Bytesdecantidad);


            foreach (byte value in counts.Keys)
            {
                palabras += value.ToString() + counts[value].ToString().PadLeft(repfrec, '0');
                var node = new HuffmanNode <T>((double)counts[value] / valueCount, value);
                coladeprioridad.Enqueue(node.Probability, node);
                _leafDictionary[value] = node;
            }
            conoceri = numvalores + numcantidad + palabras;

            while (coladeprioridad.contar > 1)
            {
                HuffmanNode <T> hijoizquieda = coladeprioridad.Dequeue();
                HuffmanNode <T> rightSon     = coladeprioridad.Dequeue();
                var             parent       = new HuffmanNode <T>(hijoizquieda, rightSon);
                coladeprioridad.Enqueue(parent.Probability, parent);
            }

            _root        = coladeprioridad.Dequeue();
            _root.IsZero = false;
        }
Пример #3
0
        public byte[] Huff()
        {
            var         coladeprioridad = new Coladeprioridad <HuffmanNode <T> >();
            List <byte> palabras        = new List <byte>();

            //int conocer;
            //int repfrec = 1;
            //foreach (byte value in counts.Keys)
            //{
            //    conocer = counts[value];
            //    int cantidad = (conocer > 0xffffff || conocer < 0) ? 4 : (conocer < 0xffff) ? (conocer < 0xff) ? 1 : 2 : 3;
            //    if (cantidad  > repfrec)
            //    {
            //        repfrec = conocer;
            //    }
            //}



            palabras.Add(Convert.ToByte(counts.Count));
            palabras.Add(Convert.ToByte(4));

            foreach (byte value in counts.Keys)
            {
                palabras.Add(value);
                palabras.AddRange(BitConverter.GetBytes(counts[value]));

                var node = new HuffmanNode <T>((double)counts[value] / valueCount, value);
                coladeprioridad.Enqueue(node.Probability, node);
                _leafDictionary[value] = node;
            }


            while (coladeprioridad.contar > 1)
            {
                HuffmanNode <T> hijoizquieda = coladeprioridad.Dequeue();
                HuffmanNode <T> rightSon     = coladeprioridad.Dequeue();
                var             parent       = new HuffmanNode <T>(hijoizquieda, rightSon);
                coladeprioridad.Enqueue(parent.Probability, parent);
            }

            _root        = coladeprioridad.Dequeue();
            _root.IsZero = false;
            return(palabras.ToArray());
        }
        }                                                   //contar nodos que hay

        public Coladeprioridad(Coladeprioridad <T> x)
        {
            encolar.AddRange(x.encolar); // Clonar el objeto es un constructor (Sirve para la las colas auxiliares)
            Tamañoheap = x.Tamañoheap;   //Clona el tamaño
        }