哈夫曼编码,旨在对信息实现一种高效的编码,这种编码中任何一个都不是其他编码的前缀码。因此,在实际接收时,一旦匹配,就可以立即解码。

具体算法过程可以参加网上的很多教程。

给出一个自己的实现,一方面加强印象,一方面练习一下。能力有限,还请同学们多多帮助。

 /////////////////////////////////////////////////////////////////////////////////
///
/// 代码并没有做仔细的参数验证等异常处理,仅仅做了功能级别的实现
///
///////////////////////////////////////////////////////////////////////////////// #define __debug
using System;
using System.Collections.Generic;
using System.Linq; namespace Algo
{
public class ChainedNode
{
public string symbol;
public double probab;
public ChainedNode parent;
public string flag;
public bool isLeave;
} public class Huffman
{
private List<ChainedNode> nodelist; public Huffman(Dictionary<string, double> dic)
{
nodelist = new List<ChainedNode>();
foreach (var item in dic)
{
ChainedNode node = new ChainedNode();
node.probab = item.Value;
node.symbol = item.Key;
node.isLeave = true;
nodelist.Add(node);
}
} public List<ChainedNode> BuildHuffman()
{
List<ChainedNode> res = new List<ChainedNode>(); while (nodelist.Count > )
{
nodelist = (from t in nodelist orderby t.probab ascending select t).ToList(); ChainedNode first = nodelist[];
first.flag = "";
nodelist.RemoveAt();
ChainedNode second = nodelist[];
second.flag = "";
nodelist.RemoveAt(); ChainedNode c = new ChainedNode();
c.probab = first.probab + second.probab;
c.symbol = first.symbol + second.symbol; first.parent = c;
second.parent = c; nodelist.Add(c);
if (first.isLeave)
{
res.Add(first);
}
if (second.isLeave)
{
res.Add(second);
}
}
return res;
} public void GenerateCode(List<ChainedNode> head)
{
for (int i = ; i < head.Count; i++)
{
ChainedNode cn = head[i];
string symbol = cn.symbol;
string build = string.Empty;
double prop = cn.probab;
while (cn.parent != null)
{
build = cn.flag + build;
cn = cn.parent;
}
cn = head[i];
cn.flag = build;
#if __debug
Console.WriteLine("{0}:{1}:{2}.", cn.symbol, cn.probab, cn.flag);
#endif
}
}
} class Program
{
static void Main(string[] args)
{
Dictionary<string, double> dic = new Dictionary<string, double>();
dic.Add("u1", 0.1);
dic.Add("u2", 0.2);
dic.Add("u3", 0.4);
dic.Add("u4", 0.2);
dic.Add("u5", 0.1); Huffman hc = new Huffman(dic);
var list = hc.BuildHuffman();
hc.GenerateCode(list); Console.ReadLine();
}
}
}

运行结果如下图

算法系列——huffman编码的更多相关文章

  1. 【算法】Huffman编码(数据结构+算法)

    1.描述 Huffman编码,将字符串利用C++编码输出该字符串的Huffman编码. Huffman树是一种特殊结构的二叉树,由Huffman树设计的二进制前缀编码,也称为Huffman编码在通信领 ...

  2. 【uva 10954】Add All(算法效率--Huffman编码+优先队列)

    题意:有N个数,每次选2个数合并为1个数,操作的开销就是这个新的数.直到只剩下1个数,问最小总开销. 解法:合并的操作可以转化为二叉树上的操作[建模],每次选两棵根树合并成一棵新树,新树的根权值等于两 ...

  3. 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Huffman编码

    2014.07.06 16:47 简介: 给定一段有固定符号集合S构成的文本T,集合S中总共有n种符号.如果对于每种符号,使用一种不同的由‘0’和‘1’构成的位字符串来代替,比如: ‘a’->‘ ...

  4. Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序

    前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的re ...

  5. [老文章搬家] 关于 Huffman 编码

    按:去年接手一个项目,涉及到一个一个叫做Mxpeg的非主流视频编码格式,编解码器是厂商以源代码形式提供的,但是可能代码写的不算健壮,以至于我们tcp直连设备很正常,但是经过一个UDP数据分发服务器之后 ...

  6. huffman 编码

    huffman压缩是一种压缩算法,其中经典的部分就是根据字符出现的频率建立huffman树,然后根据huffman树的构建结果标示每个字符.huffman编码也称为前缀编码,就是每个字符的表示形式不是 ...

  7. Atitit s2018.6 s6 doc list on com pc.docx Atitit s2018.6 s6 doc list on com pc.docx  Aitit algo fix 算法系列补充.docx Atiitt 兼容性提示的艺术 attilax总结.docx Atitit 应用程序容器化总结 v2 s66.docx Atitit file cms api

    Atitit s2018.6 s6  doc list on com pc.docx Atitit s2018.6 s6  doc list on com pc.docx  Aitit algo fi ...

  8. DS二叉树--Huffman编码与解码

    题目描述 1.问题描述 给定n个字符及其对应的权值,构造Huffman树,并进行huffman编码和译(解)码. 构造Huffman树时,要求左子树根的权值小于.等于右子树根的权值. 进行Huffma ...

  9. Huffman 编码压缩算法

    前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 David Huffman 和他的压缩算法—— Huffman Code,一种通过字 ...

随机推荐

  1. GMap.Net

    GMap.Net开发之在WinForm和WPF中使用GMap.Net地图插件   GMap.NET是什么? 来看看它的官方说明:GMap.NET is great and Powerful, Free ...

  2. [转]Libev教程

    libev Table of Contents 1 libev 1.1 About The Code 1.2 EventLoop 1.3 Watcher 1.4 How it works 1.4.1 ...

  3. sql 数据库的备份还原问题

    今天工作中犯了一个严重的错误,就是在sql中写了一个update语句,还没写条件呢,结果误按了F5,唉,太佩服自己啦...这个脑子怎么不管用了呢?? 唉不说了,我在网上翻来覆去的找资料,最终想是不是可 ...

  4. Leetcode::JumpGame

    Description: Given an array of non-negative integers, you are initially positioned at the first inde ...

  5. Python远程视频监控

    Python远程视频监控程序   老板由于事务繁忙无法经常亲临教研室,于是让我搞个监控系统,让他在办公室就能看到教研室来了多少人.o(>﹏<)o||| 最初我的想法是直接去网上下个软件,可 ...

  6. IP地址分类(转)

    IP地址分类以及C类IP地址的子网划分 国际规定:把所有的IP地址划分为 A,B,C,D,E A类地址:范围从0-127,0是保留的并且表示所有IP地址,而127也是保留的地址,并且是用于测试环回用的 ...

  7. 随机生成n个不相等的随机数

    在计算机视觉中,(例如8点算法)经常用到RANSAC算法在N个数据中找到最合适的一组n(n<N)个数据对,使某项指标达到最大.解决这个问题需要随机的在N个数据对中采样.本文实现一种线性的,复杂度 ...

  8. 微信移动端web页面调试小技巧

    技术贴还是分享出来更加好,希望能对一些朋友有帮助,个人博客  http://lizhug.com/mymajor/微信移动端web页面调试小技巧

  9. android 弹出带输入框的对话框

    private void inputTitleDialog() { final EditText inputServer = new EditText(this);         inputServ ...

  10. 转义字符(\)对JavaScript中JSON.parse的影响

    Email:longsu2010 at yeah dot net 按照ECMA262第五版中的解释,JSON是一个提供了stringify和parse方法的内置对象,前者用于将js对象转化为符合jso ...