示例#1
0
        public void Decode(string fileNameSource, string fileNameDecode)
        {
            BitArray bitArray = null;

            try
            {
                bitArray = new BitArray((File.ReadAllBytes(fileNameSource)));
            }
            catch (Exception exc)
            {
                throw exc;
            }
            //считываем длину битов декодировочной таблицы
            BitArray numBitCodeTable = new BitArray(32);

            for (int i = 0; i < 32; i++)
            {
                numBitCodeTable[i] = bitArray[i];
            }
            byte[] num = new byte[4];
            numBitCodeTable.CopyTo(num, 0);
            int lenTable = BitConverter.ToInt32(num, 0);

            Frequencies = GetFrequencyDictionaryFromFile(bitArray, 32, lenTable + 32);
            BuildTree(Frequencies);
            Decode(bitArray, lenTable + 32, fileNameDecode);
        }
示例#2
0
        public HuffmanTree(FrequencyDictionary frequencyDictionary)
        {
            Frequencies = new FrequencyDictionary();
            Frequencies = frequencyDictionary;

            var startTime = System.Diagnostics.Stopwatch.StartNew();

            BuildTree(Frequencies);

            startTime.Stop();
            var    resultTime  = startTime.Elapsed;
            string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:000}",
                                               resultTime.Hours,
                                               resultTime.Minutes,
                                               resultTime.Seconds,
                                               resultTime.Milliseconds);

            Console.WriteLine("Build tree:  " + elapsedTime);

            startTime = System.Diagnostics.Stopwatch.StartNew();

            BuildCodeTable(Frequencies);

            startTime.Stop();
            resultTime = startTime.Elapsed;

            elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:000}",
                                        resultTime.Hours,
                                        resultTime.Minutes,
                                        resultTime.Seconds,
                                        resultTime.Milliseconds);
            Console.WriteLine("Build code table:  " + elapsedTime);
            //BuildCodeTable(Frequencies);
        }
示例#3
0
 public void BuildCodeTable(FrequencyDictionary frequencyDictionary)
 {
     CodeTable = new Dictionary <string, List <bool> >();
     foreach (var wordNode in nodesDictionary)
     {
         List <bool> encodedWord = GetCode(wordNode.Value); //Root.Traverse(word.Key, new List<bool>());
         CodeTable.Add(wordNode.Key, encodedWord);
     }
 }
        /// <summary>
        /// Получить вектор с честотами для блока слов
        /// </summary>
        /// <param name="frequencyDictionary">Словарь всех слов текста</param>
        /// <param name="words">Блок слов</param>
        /// <returns>Вектор, с частотами слов в блоке</returns>
        public static Dictionary <string, double> GetVectorFrequencyFromBlock(FrequencyDictionary frequencyDictionary, List <string> words)
        {
            //Получаем нулевой вектор
            Dictionary <string, double> vector = GetVectorZerosFromFrequencyDictionary(frequencyDictionary);

            //подсчитываем количество слов
            foreach (var word in words)
            {
                vector[word] += 1;
            }
            //получаем частоту
            foreach (var item in words)
            {
                vector[item] /= words.Count;
            }
            return(vector);
        }
示例#5
0
        public void BuildTree(FrequencyDictionary frequencyDictionary)
        {
            foreach (KeyValuePair <string, int> word in frequencyDictionary.Dictionary)
            {
                nodes.Add(new NodeHT()
                {
                    Word = word.Key, Frequency = word.Value
                });
                nodesDictionary.Add(word.Key, nodes.Last());
            }

            while (nodes.Count > 1)
            {
                List <NodeHT> orderedNodes = nodes.OrderBy(node => node.Frequency).ToList <NodeHT>();

                if (orderedNodes.Count >= 2)
                {
                    // Take first two items
                    List <NodeHT> taken = orderedNodes.Take(2).ToList();

                    // Create a parent node by combining the frequencies
                    NodeHT parent = new NodeHT()
                    {
                        Word      = "",
                        Frequency = taken[0].Frequency + taken[1].Frequency,
                        Left      = taken[0],
                        Right     = taken[1]
                    };
                    taken[0].Parent = parent;
                    taken[1].Parent = parent;

                    nodes.Remove(taken[0]);
                    nodes.Remove(taken[1]);
                    nodes.Add(parent);
                }

                Root        = nodes.FirstOrDefault();
                Root.Parent = null;
            }
        }
        /// <summary>
        /// Получение нулевого вектора, для текста
        /// </summary>
        /// <param name="frequencyDictionary">Частотный словарь по всему тексту</param>
        /// <returns>Нулевой вектор, где каждое слово ассоциируется с конкретной позицией в векторе</returns>
        public static Dictionary <string, double> GetVectorZerosFromFrequencyDictionary(FrequencyDictionary frequencyDictionary)
        {
            Dictionary <string, double> vector = new Dictionary <string, double>();

            //Отсортируем по частоте встречания слова
            frequencyDictionary.SortDescValue();
            //Вормируем ассоциативный 0-вектор
            foreach (var item in frequencyDictionary.Dictionary)
            {
                vector.Add(item.Key, 0.0);
            }
            return(vector);
        }
示例#7
0
 public HuffmanTree()
 {
     nodes       = new List <NodeHT>();
     Root        = null;
     Frequencies = new FrequencyDictionary();
 }
示例#8
0
        public List <bool> GetBitArrayTable(FrequencyDictionary frequencyDictionary)
        {
            List <bool> res = new List <bool>();

            byte lenBitWord = 0x00;

            foreach (var item in frequencyDictionary.Dictionary)
            {
                lenBitWord = (byte)item.Key.Length;
                for (int i = 0; i < 8; i++)
                {
                    if (((lenBitWord << i) & maskForEncode) == 0x00)
                    {
                        res.Add(false);
                    }
                    else
                    {
                        res.Add(true);
                    }
                }

                byte[] wordByteArray = Encoding.Default.GetBytes(item.Key);
                foreach (var symbol in wordByteArray)
                {
                    for (int i = 0; i < 8; i++)
                    {
                        if ((byte)((symbol << i) & maskForEncode) == 0x00)
                        {
                            res.Add(false);
                        }
                        else
                        {
                            res.Add(true);
                        }
                    }
                }

                //выполняем реверс
                byte[] buf  = BitConverter.GetBytes(item.Value);
                byte[] freq = new byte[4];
                freq = buf;
                //for (int i = 0; i < buf.Length; i++)
                //{
                //    freq[i] = buf[buf.Length - 1 - i];
                //}


                foreach (var b in freq)
                {
                    for (int i = 0; i < 8; i++)
                    {
                        if (((b << i) & maskForEncode) == 0x00)
                        {
                            res.Add(false);
                        }
                        else
                        {
                            res.Add(true);
                        }
                    }
                }
            }
            //if(codeTableBit.Count % 8 == 0)
            return(res);
        }