哈夫曼树压缩C#算法(huffman)
算法原理: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)的更多相关文章
- java实现哈弗曼树和哈夫曼树压缩
本篇博文将介绍什么是哈夫曼树,并且如何在java语言中构建一棵哈夫曼树,怎么利用哈夫曼树实现对文件的压缩和解压.首先,先来了解下什么哈夫曼树. 一.哈夫曼树 哈夫曼树属于二叉树,即树的结点最多拥有2个 ...
- 哈夫曼树(三)之 Java详解
前面分别通过C和C++实现了哈夫曼树,本章给出哈夫曼树的java版本. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载请注明出处:htt ...
- 哈夫曼树(二)之 C++详解
上一章介绍了哈夫曼树的基本概念,并通过C语言实现了哈夫曼树.本章是哈夫曼树的C++实现. 目录 1. 哈夫曼树的介绍 2. 哈夫曼树的图文解析 3. 哈夫曼树的基本操作 4. 哈夫曼树的完整源码 转载 ...
- 哈夫曼树(一)之 C语言详解
本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若 ...
- [算法]Huffman树(哈夫曼树)
目录 一.关于Huffman树 二.具体实现 例1:P1090 合并果子 例2:P2168 [NOI2015]荷马史诗 一.关于Huffman树 Huffman树(哈夫曼树)可以解决下述问题: 一颗\ ...
- 【算法】赫夫曼树(Huffman)的构建和应用(编码、译码)
参考资料 <算法(java)> — — Robert Sedgewick, Kevin Wayne <数据结构> ...
- 10: java数据结构和算法: 构建哈夫曼树, 获取哈夫曼编码, 使用哈夫曼编码原理对文件压缩和解压
最终结果哈夫曼树,如图所示: 直接上代码: public class HuffmanCode { public static void main(String[] args) { //获取哈夫曼树并显 ...
- 【数据结构】赫夫曼树的实现和模拟压缩(C++)
赫夫曼(Huffman)树,由发明它的人物命名,又称最优树,是一类带权路径最短的二叉树,主要用于数据压缩传输. 赫夫曼树的构造过程相对比较简单,要理解赫夫曼数,要先了解赫夫曼编码. 对一组出现频率不同 ...
- Android版数据结构与算法(七):赫夫曼树
版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 近期忙着新版本的开发,此外正在回顾C语言,大部分时间没放在数据结构与算法的整理上,所以更新有点慢了,不过既然写了就肯定尽力将这部分完全整理好分享出 ...
随机推荐
- Linux 配置tomcat遇见的若干问题
1.提示catalina.sh缺失 原因:未对bin目录下的.sh文件授权 执行:chmod +x bin/*.sh即可 2.正常启动Tomcat 但是外界无法访问 Linux防火墙原因,进入到 et ...
- 几种JAVA加密算法
转自:http://www.cnblogs.com/mycodelife/archive/2009/04/22/1441624.html
- Hibernate 系列教程1-枚举单例类
你还在为不知道怎样正确使用Hibernate而纠结吗 你还在为不知道怎样配置映射文件而郁闷吗 枚举单例(Enum Singleton) 是实现单例模式的一种方式而已,不过写法简单,创建枚举默认也是线程 ...
- json-c代码示例
#include <stdio.h> #include <string.h> #include <json.h> int main(int argc,char ** ...
- 使用devcon禁用启用网卡
系统平台:win2003 情况描述: 机器上装有两块网卡,8136和8139,网卡A使用静态IP,连接内部办公网,网卡B使用DHCP,连接互联网.切换两个网络时,需要先禁用一个网卡,启用另一个网卡.来 ...
- wifi 3G 流量
// // flowStatis.c // Test // // Created by iXcoder on 12-7-19. // Copyright (c) 2012年 iXcoder. ...
- QT修改默认的滚动条样式
这几天写一个类似于悬浮窗的小程序,可是qt自带的滚动条实在难看,经过多番查找终于找到一个类似于qq聊天窗口的滚动条,废话不说上代码.希望能帮到大家 1.写入到文件中,新建个xx.qss,然后复制一下内 ...
- 11--tag 和transform属性
tag 和transform属性 1.tag 标签,就相当于身份识别的标码,可以通过tag值获取对应的对象. 2.使用transform 实现对象的平移和旋转. // // ViewControlle ...
- java邮件收发
http://blog.csdn.net/ycg01/article/details/1394465 java邮件收发 标签: javaimportexceptionnulluserclass 200 ...
- ratingbar设置不可调节星星数量
<RatingBar android:id="@+id/rb_bar" android:layout_width="wrap_content" andro ...