哈夫曼树压缩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语言,大部分时间没放在数据结构与算法的整理上,所以更新有点慢了,不过既然写了就肯定尽力将这部分完全整理好分享出 ...
随机推荐
- sql server数据库中 INFORMATION_SCHEMA的用法
1.查询数据库的所有表: select * from INFORMATION_SCHEMA.TABLES 2.查询表名为xxx的所有列的信息 select * from INFORMATION_SCH ...
- Hibernate 系列教程4-单向多对一
项目图片 hibernate.cfg.xml <mapping resource="com/jege/hibernate/one/way/manytoone/User.hbm.xml& ...
- dedecms 标签的基本用法
1.关键描述调用标签: <meta name="keywords" content="{:fieldname='keywords'/}"> < ...
- Git学习 -- 自定义Git
忽略特殊文件 在工作区创建.gitignore文件,编写内容 # Windows: Thumbs.db ehthumbs.db Desktop.ini # Python: 忽略Python编译产生的. ...
- If only it could be all the same like we first me
为什么 你当时对我好 Why? You nice to me at that time. 又为什么 现在变得冷淡了 Why? Now you give a cold shoulder to me. 我 ...
- L10,not for jazz
expressions: It is called a clavichord这被称为古钢琴 a friend of my father's我父亲的朋友 words: musical,adj,音乐的 ...
- UAC下的程序权限提升
来源:http://blog.kingsamchen.com/archives/801 UAC是微软为了提高Windows的安全性,自Windows Vista开始引入的新安全机制. 传统的NT内核系 ...
- STM32软件复位(基于库文件V3.5)
源:STM32软件复位(基于库文件V3.5) void SoftReset(void) { __set_FAULTMASK(); // 关闭所有中端 NVIC_SystemReset();// 复位 ...
- zf-启动项目报错Server 127.0.0.1 has no instance named dlx 解决办法
由于百度出来的看不明白,于是我就在群里问,吴善如经理说:你这个问题我上次给李宽看过,用端口连,把instance去掉 然后我去掉之后 项目过程能够成功运行了,原来是这样
- GridView的RowCreated与RowDataBound事件区别
在西门子面试时,项目负责人除了道试题关于RowCreated与RowDataBound事件区别,经过google一下,得出结果: GridView的RowCreated与RowDataBound的一个 ...