算法原理: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. addEventListener与removeEventListener

    addEventListener:添加事件监听器 element.addEventListener(event, function, useCapture) event:事件类型,字符串,不要加&qu ...

  2. 01_change_schema.sql

    set echo on feedback on spool ./log/01_change_schema.log -- -- schema change to v_idocdata_un -- -- ...

  3. Jquery 实现原理之 Ajax

    一:Jquery Ajax底层接口有:$.ajaxPrefilters.$.ajaxTransport.$.ajaxSettings.$ajaxSetup.$ajaxSettings; 其中$.aja ...

  4. C++字符串(1)

    C++ 拼接字符串常量 C++允许拼接字符串字面值,即将两个用引号括起的字符串合并为一个.事实上,任何两个由空白(空格,制表符和换行符)分隔的字符串常量都将自动拼接成一个. 例子: cout < ...

  5. 关于Spring的69个面试问答——终极列表

    本文由 ImportNew - 人晓 翻译自 javacodegeeks.欢迎加入翻译小组.转载请见文末要求. 这篇文章总结了一些关于Spring框架的重要问题,这些问题都是你在面试或笔试过程中可能会 ...

  6. 单元测试、自动化测试、接口测试过程中的Excel数据驱动(java实现)

    import java.io.FileInputStream;import java.io.InputStream;import java.util.HashMap;import java.util. ...

  7. makefile的编写规则

    2.       编写makefile 示例: test:main.o func.o gcc -o test main.o func.o func.o:func.c gcc -c func.c mai ...

  8. CodeForces 500 A. New Year Transportation

    Description New Year is coming in Line World! In this world, there are n cells numbered by integers ...

  9. 转:使用WebDriver过程中遇到的那些问题

    在做web项目的自动化端到端测试时主要使用的是Selenium WebDriver来驱动浏览器.Selenium WebDriver的优点是支持的语言多,支持的浏览器多.主流的浏览器Chrome.Fi ...

  10. java导读

    导读:      我们学习Java大概有3个方向,第一,桌面系统,包括C/S结构:第二,J2ME,面向无限领域,很有潜力的家伙,看看中国的手机用户就知道了.第三,面向企业应用.计算的平台,J2EE. ...