算法系列——huffman编码
哈夫曼编码,旨在对信息实现一种高效的编码,这种编码中任何一个都不是其他编码的前缀码。因此,在实际接收时,一旦匹配,就可以立即解码。
具体算法过程可以参加网上的很多教程。
给出一个自己的实现,一方面加强印象,一方面练习一下。能力有限,还请同学们多多帮助。
/////////////////////////////////////////////////////////////////////////////////
///
/// 代码并没有做仔细的参数验证等异常处理,仅仅做了功能级别的实现
///
///////////////////////////////////////////////////////////////////////////////// #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编码的更多相关文章
- 【算法】Huffman编码(数据结构+算法)
1.描述 Huffman编码,将字符串利用C++编码输出该字符串的Huffman编码. Huffman树是一种特殊结构的二叉树,由Huffman树设计的二进制前缀编码,也称为Huffman编码在通信领 ...
- 【uva 10954】Add All(算法效率--Huffman编码+优先队列)
题意:有N个数,每次选2个数合并为1个数,操作的开销就是这个新的数.直到只剩下1个数,问最小总开销. 解法:合并的操作可以转化为二叉树上的操作[建模],每次选两棵根树合并成一棵新树,新树的根权值等于两 ...
- 《数据结构与算法分析:C语言描述》复习——第十章“算法设计技巧”——Huffman编码
2014.07.06 16:47 简介: 给定一段有固定符号集合S构成的文本T,集合S中总共有n种符号.如果对于每种符号,使用一种不同的由‘0’和‘1’构成的位字符串来代替,比如: ‘a’->‘ ...
- Jcompress: 一款基于huffman编码和最小堆的压缩、解压缩小程序
前言 最近基于huffman编码和最小堆排序算法实现了一个压缩.解压缩的小程序.其源代码已经上传到github上面: Jcompress下载地址 .在本人的github上面有一个叫Utility的re ...
- [老文章搬家] 关于 Huffman 编码
按:去年接手一个项目,涉及到一个一个叫做Mxpeg的非主流视频编码格式,编解码器是厂商以源代码形式提供的,但是可能代码写的不算健壮,以至于我们tcp直连设备很正常,但是经过一个UDP数据分发服务器之后 ...
- huffman 编码
huffman压缩是一种压缩算法,其中经典的部分就是根据字符出现的频率建立huffman树,然后根据huffman树的构建结果标示每个字符.huffman编码也称为前缀编码,就是每个字符的表示形式不是 ...
- 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 ...
- DS二叉树--Huffman编码与解码
题目描述 1.问题描述 给定n个字符及其对应的权值,构造Huffman树,并进行huffman编码和译(解)码. 构造Huffman树时,要求左子树根的权值小于.等于右子树根的权值. 进行Huffma ...
- Huffman 编码压缩算法
前两天发布那个rsync算法后,想看看数据压缩的算法,知道一个经典的压缩算法Huffman算法.相信大家应该听说过 David Huffman 和他的压缩算法—— Huffman Code,一种通过字 ...
随机推荐
- Dynamics CRM 警惕Odata查询的陷阱
Dynamics CRM可以很方便的通过用Odata通过AJAX查询到数据.查询分为两种:精确查找和模糊查找. 精确查找是指通过GUID匹配得到一条数据,如: http://CRMURL/org/XR ...
- [转]SVN操作手册
[转]SVN操作手册 2012-04-28 11:26 by NewSea, 2495 阅读, 0 评论, 收藏, 编辑 原文: http://hi.baidu.com/caiqiupeng/blog ...
- Linux网络编程(三)
Linux网络编程(三) wait()还是waitpid() Linux网络编程(二)存在客户端断开连接后,服务器端存在大量僵尸进程.这是由于服务器子进程终止后,发送SIGCHLD信号给父进程,而父进 ...
- 1 Java学习之 基本数据类型
1. 基本概念 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式.接触每种语言的时候,都会存在数据类型的认识,有复杂的.简单的,各种数据类型都需要在学习 ...
- WCF学习笔记之事务编程
WCF学习笔记之事务编程 一:WCF事务设置 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元: WCF通过System.ServiceModel.TransactionFlowA ...
- 定时器Timer不定时
订餐系统之定时器Timer不定时 经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统 ...
- python schedule processor
run some tasks which could look like CRON within linux/UNIX in python. Here's a demo which run on ub ...
- Arduino 串口篇 Arduino发送二进制 send binary via RS232-to-USB to PC
有用的链接在这里:http://hi.baidu.com/mizuda/item/06b7fdc1d0e45a0ec710b2dd 更加详细的内容请查阅Arduino官方:http://arduino ...
- Apache遇到的问题:APR not found
#./configure --prefix……检查编辑环境时出现: checking for APR... no configure: error: APR not found . Please r ...
- Tapestry5.3使用总结
1.Tapestry框架的加载是通过Filter来完成的,需要在web.xml中加入以下配置: <filter> <filter-name>app</filter-nam ...