算法原理: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. 关于C#静态构造函数的几点说明

    静态构造函数是C#的一个新特性,其实好像很少用到.不过当我们想初始化一些静态变量的时候就需要用到它了.这个构造函数是属于类的,而不是属于哪里实例的,就是说这个构造函数只会被执行一次.也就是在创建第一个 ...

  2. Css 之 px em %

    在页面整体布局中,页面元素的尺寸大小(长度.宽度.内外边距等)和页面字体的大小也是重要的工作之一.一个合理设置,则会让页面看起来层次分明,重点鲜明,赏心悦目.反之,一个不友好的页面尺寸和字体大小设置, ...

  3. Android OpenGL ES(五)GLSurfaceView .

    Android OpenGL ES 相关的包主要定义在 javax.microedition.khronos.opengles    GL 绘图指令 javax.microedition.khrono ...

  4. 实验用rootkit

    进程对比实验用得到rootkit: 1.FU rootkit 简单的来说,FU是一个隐藏进程的工具.,FU_Rootkit是开源的,用C语言编写.FU_Rootkit主程序包括2个部分:Fu.exe和 ...

  5. boost库之geometry<二>

    #include <boost/assign.hpp> #include <boost/geometry/core/point_type.hpp> #include <b ...

  6. 大并发大数量中的MYSQL瓶颈与NOSQL介绍

    NoSQL在2010年风生水起,大大小小的Web站点在追求高性能高可靠性方面,不由自主都选择了NoSQL技术作为优先考虑的方面.今年伊始,InfoQ中文站有幸邀请到凤凰网的孙立先生,为大家分享他之于N ...

  7. eclipse修改豆沙绿

    长时间的使用eclipse开发会很累吧  设置一个保护眼睛的豆沙绿色 不刺眼 是不是会更好一些呢 那么如何设置呢现在就教大家   工具/原料 eclipse jdk 方法/步骤 1 首先打开eclip ...

  8. <link rel="stylesheet" href="3.css"/> 链接方式

    <link rel="stylesheet" href="3.css"/> <!doctype html> <html> & ...

  9. android 图片拍照图片旋转的处理方式

    第一种:String str=path; /** * 读取图片属性:旋转的角度 * * @param path * 图片绝对路径 * @return degree旋转的角度 */ private vo ...

  10. [原]界面上有几个球队名字的列表,将鼠标放到球队名字上就变为红色背景,其他球队背景颜色为白色,点击一个球队的时候就将点击的球队变为fontSize=30字体(fontSize=‘’回到默认)。

    window.onload = function () {             var uls = document.getElementById('ui').getElementsByTagNa ...