HUFFMAN编码可以很有效的压缩数据,通常可以压缩20%到90%的空间(算法导论)。具体的压缩率取决于数据的特性(词频)。如果采取标准的语料库进行编码,一般可以得到比较满意的编码结果(对不同文件产生不同压缩率的折中方法)。

本文采取对单独一个文件进行编码的方式来演示此压缩算法的使用。

分为下面几个步骤:

1.统计词频数据

2.词频数据转换成HUFFMAN算法能够处理的类型(本文为HuffmanNode,内部有存储词频和树节点的结构)

  (1)由输入的HuffmanNode[]数组创建最小优先级队列

  (2)依次取出队列中的每两个节点,然后由此两个节点构造一个新的节点,然后在重新插入回队列。直到队列中只剩唯一一个节点。

    此节点为编码树的根节点。

  (3)依次遍历原来输入的每个HUFFMAN节点,得到每个字符的对应编码(压缩使用)。

  (4)解码方式,依次输入0/1字符码到算法,算法遍历产生的编码树,如果有返回字符,则得到解码字符。

 词频统计的实现:

 public class FrequencyCounter
    {
        public IEnumerable<KeyValuePair<char, int>> MapReduce(string str)
        {
            //the GroupBy method is acting as the map, 
            //while the Select method does the job of reducing the intermediate results into the final list of results.
            var wordOccurrences = str
                .GroupBy(w => w)
                .Select(intermediate => new
                    {
                        Key = intermediate.Key,
                        Value = intermediate.Sum(w => 1)
                    })
                .OrderBy(kvp => kvp.Value);
            IEnumerable<KeyValuePair<char, int>> kvps = from wo in wordOccurrences select new KeyValuePair<char, int>(wo.Key, wo.Value);
            return kvps;
        }
    }
MapReduce

相关文章: