算法原理:http://www.cnblogs.com/skywang12345/p/3706833.html。

上代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.IO;
using System.Web.Script;
using System.Web.Script.Serialization; namespace ConsoleApplication2
{
public class Program
{
public static void Main()
{
string content = @"bacbccddeeeddee";
Console.WriteLine("需要压缩的内容(长度:" + content.Length + "):");
Console.WriteLine(content);
Console.WriteLine(); HuffmanTree huffman = new HuffmanTree(); string compressionString = huffman.Compression(content);
Console.WriteLine("压缩后的内容(长度:" + compressionString.Length + "):");
Console.WriteLine(compressionString);
Console.WriteLine(); string unZipContent = huffman.Unzip(compressionString);
Console.WriteLine("解压后的的内容:");
Console.WriteLine(unZipContent);
Console.Read();
}
} public class HuffmanTreeInfo
{
public string ZipCode { get; set; }
public string ZipCodeRemainder { get; set; }
public Dictionary<string, char> UnZipDictionary { get; set; }
} public class HuffmanTree
{
public class HuffmanNote
{
public int Weight { get; set; }
public char Word { get; set; }
public HuffmanNote LeftNote { get; set; }
public HuffmanNote RightNote { get; set; }
public char HuffmanCode { get; set; }
} public string Compression(string content)
{
HuffmanNote huffmanNote = CreateHuffmanTree(CreateWordWeightDictionary(content)); Dictionary<char, string> encodeDictionary = new Dictionary<char, string>();
CreateWordCodeDictionay(huffmanNote, "", encodeDictionary); StringBuilder sb = new StringBuilder(content.Length);
foreach (var item in content)
{
sb.Append(encodeDictionary[item]);
} string huffmanCode = sb.ToString(); HuffmanTreeInfo huffmanTreeInfo = new HuffmanTreeInfo();
huffmanTreeInfo.ZipCodeRemainder = huffmanCode.Substring(huffmanCode.Length - huffmanCode.Length % );
huffmanTreeInfo.ZipCode = HuffmanCodeToByte(huffmanCode.Substring(, huffmanCode.Length - huffmanCode.Length % ));
huffmanTreeInfo.UnZipDictionary = CreateUnZipDictionary(encodeDictionary); return ObjectToJson(huffmanTreeInfo);
} private string ObjectToJson(object obj)
{
return new JavaScriptSerializer().Serialize(obj);
} private T JsonToObject<T>(string json)
{
return new JavaScriptSerializer().Deserialize<T>(json);
} private List<HuffmanNote> CreateWordWeightDictionary(string content)
{
Dictionary<char, int> wordWeightDictionary = new Dictionary<char, int>(); foreach (var item in content)
{
if (wordWeightDictionary.ContainsKey(item))
{
wordWeightDictionary[item] += ;
}
else
{
wordWeightDictionary[item] = ;
}
} List<HuffmanNote> huffmanNoteList = new List<HuffmanNote>();
foreach (var item in wordWeightDictionary)
{
huffmanNoteList.Add(new HuffmanNote()
{
Weight = item.Value,
Word = item.Key
});
}
return huffmanNoteList;
} public string Unzip(string content)
{
HuffmanTreeInfo huffmanTreeInfo = JsonToObject<HuffmanTreeInfo>(content); StringBuilder sb = new StringBuilder(huffmanTreeInfo.ZipCode.Length);
for (int i = ; i < huffmanTreeInfo.ZipCode.Length; i++)
{
sb.Append(Convert.ToString((int)huffmanTreeInfo.ZipCode[i], ).PadLeft(, ''));
}
string huffmanCodes = sb.ToString() + huffmanTreeInfo.ZipCodeRemainder; StringBuilder decode = new StringBuilder(huffmanCodes.Length);
string temp = string.Empty;
for (int i = ; i < huffmanCodes.Length; i++)
{
temp += huffmanCodes[i].ToString();
if (huffmanTreeInfo.UnZipDictionary.ContainsKey(temp))
{
decode.Append(huffmanTreeInfo.UnZipDictionary[temp]);
temp = string.Empty;
}
}
return decode.ToString();
} private string HuffmanCodeToByte(string huffmanCodes)
{
StringBuilder sb = new StringBuilder(huffmanCodes.Length);
for (int i = ; i* < huffmanCodes.Length; i++)
{
sb.Append((char)Convert.ToInt32(huffmanCodes.Substring(i * , ), ));
}
return sb.ToString();
} private Dictionary<string, char> CreateUnZipDictionary(Dictionary<char, string> encodeDictionary)
{
Dictionary<string, char> unZipDictionary = new Dictionary<string, char>();
foreach (var item in encodeDictionary)
{
unZipDictionary.Add(item.Value, item.Key);
}
return unZipDictionary;
} private HuffmanNote CreateHuffmanTree(List<HuffmanNote> huffmanNoteList)
{
if (huffmanNoteList.Count == )
{
return huffmanNoteList[];
} var huffmanNoteListBySort = huffmanNoteList.OrderBy(o => o.Weight).ToList(); var minWeight2Note = huffmanNoteListBySort.Take().ToList();
huffmanNoteListBySort.RemoveAt();
huffmanNoteListBySort.RemoveAt(); var leftNote = minWeight2Note[];
leftNote.HuffmanCode = ''; var rightNote = minWeight2Note[];
rightNote.HuffmanCode = ''; var newNote = new HuffmanNote()
{
LeftNote = leftNote,
RightNote = rightNote,
Weight = leftNote.Weight + rightNote.Weight
}; huffmanNoteListBySort.Add(newNote); return CreateHuffmanTree(huffmanNoteListBySort);
} private void CreateWordCodeDictionay(HuffmanNote huffmanNote, string HuffmanCode, Dictionary<char, string> encodeDictionary)
{
if (huffmanNote.LeftNote == null)
{
encodeDictionary[huffmanNote.Word] = HuffmanCode.Substring() + huffmanNote.HuffmanCode;//HuffmanCode.Substring(1) 为什么有这句呢 因为char默认值是\0 所以这里要把第一个字符\0去掉
return;
}
HuffmanCode += huffmanNote.HuffmanCode; CreateWordCodeDictionay(huffmanNote.LeftNote, HuffmanCode, encodeDictionary);
CreateWordCodeDictionay(huffmanNote.RightNote, HuffmanCode, encodeDictionary);
}
}
}

哈夫曼树压缩C#算法(huffman)的更多相关文章

  1. java实现哈弗曼树和哈夫曼树压缩

    本篇博文将介绍什么是哈夫曼树,并且如何在java语言中构建一棵哈夫曼树,怎么利用哈夫曼树实现对文件的压缩和解压.首先,先来了解下什么哈夫曼树. 一.哈夫曼树 哈夫曼树属于二叉树,即树的结点最多拥有2个 ...

  2. 哈夫曼树(三)之 Java详解

    前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:htt ...

  3. 哈夫曼树(二)之 C++详解

    上一章介绍了哈夫曼树的基本概念,并通过C语言实现了哈夫曼树.本章是哈夫曼树的C++实现. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载 ...

  4. 哈夫曼树(一)之 C语言详解

    本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若 ...

  5. [算法]Huffman树(哈夫曼树)

    目录 一.关于Huffman树 二.具体实现 例1:P1090 合并果子 例2:P2168 [NOI2015]荷马史诗 一.关于Huffman树 Huffman树(哈夫曼树)可以解决下述问题: 一颗\ ...

  6. 【算法】赫夫曼树(Huffman)的构建和应用(编码、译码)

    参考资料 <算法(java)>                           — — Robert Sedgewick, Kevin Wayne <数据结构>       ...

  7. 10: java数据结构和算法: 构建哈夫曼树, 获取哈夫曼编码, 使用哈夫曼编码原理对文件压缩和解压

    最终结果哈夫曼树,如图所示: 直接上代码: public class HuffmanCode { public static void main(String[] args) { //获取哈夫曼树并显 ...

  8. 【数据结构】赫夫曼树的实现和模拟压缩(C++)

    赫夫曼(Huffman)树,由发明它的人物命名,又称最优树,是一类带权路径最短的二叉树,主要用于数据压缩传输. 赫夫曼树的构造过程相对比较简单,要理解赫夫曼数,要先了解赫夫曼编码. 对一组出现频率不同 ...

  9. Android版数据结构与算法(七):赫夫曼树

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 近期忙着新版本的开发,此外正在回顾C语言,大部分时间没放在数据结构与算法的整理上,所以更新有点慢了,不过既然写了就肯定尽力将这部分完全整理好分享出 ...

随机推荐

  1. wpa_supplicant wpa_cli 的使用说明

    wpa_supplicant -d -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf -iwlan0 -B   会在/data/misc/wifi/下产生 ...

  2. 12.04 ubuntu 更改IP

    在一个局域网里面,如果是自动获取IP,就会导致IP冲突 进入要连接的热点进行设置 IPV4 Setting address                     netmask           ...

  3. linux命令:find详解

    Linux中find命令常见用法示例: find path -option [-print] [ -exec -ok command ] {} \; #-print 将查找到的文件输出到标准输出#-e ...

  4. NSTimer内存方面的探究

    今天研究一个框架,看到它对NSTimer的处理,感觉很有意思.于是自己在各种情况下都研究了一下,现总结如下. 我们用到NSTimer时,似乎习惯于会在dealloc方法中把它invalidate掉,但 ...

  5. jsp base标签与meta标签学习小结

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  6. ReactiveCocoa 用法实例

      我个人非常推崇ReactiveCocoa,它就像中国的太极,太极生两仪,两仪生四象,四象生八卦,八卦生万物.ReactiveCocoa是一个高度抽象的编程框架,它真的很抽象,初看你不知道它是要干嘛 ...

  7. heartbeat集群安装配置

    安装配置高可用集群需要注意:1.节点名称:集群每个节点的名称都得能互相解析 /etc/hosts hosts主机名的正反解析结果必须跟"uname -n"的结果保持一致2.时间必须 ...

  8. ArrayList遍历的同时删除--- 删除还是用迭代器的比较好,其它的都会有问题.

    http://javag.iteye.com/blog/403097 ArrayList遍历的同时删除-- 删除还是用迭代器的比较好,其它的都会有问题.     博客分类: 随笔 Javathread ...

  9. Javascript面向对象编程(二):构造函数的继承

    这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个" ...

  10. Android 手机应用开发经验 之 通过Socket(TCP/IP)与PC通讯

    Android 是一个开源的手机操作系统平台,已经被非常多的开发者视作未来最有潜力的智能手机操作系统.而且,在很短的时间内就在Android Market上出现大量的第三方应用程序,供用户下载与使用, ...