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); }
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); }
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); }
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); }
public HuffmanTree() { nodes = new List <NodeHT>(); Root = null; Frequencies = new FrequencyDictionary(); }
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); }