哈夫曼编码,旨在对信息实现一种高效的编码,这种编码中任何一个都不是其他编码的前缀码。因此,在实际接收时,一旦匹配,就可以立即解码。
具体算法过程可以参加网上的很多教程。
给出一个自己的实现,一方面加强印象,一方面练习一下。能力有限,还请同学们多多帮助。
/////////////////////////////////////////////////////////////////////////////////
///
/// 代码并没有做仔细的参数验证等异常处理,仅仅做了功能级别的实现
///
///////////////////////////////////////////////////////////////////////////////// #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,一种通过字 ...
随机推荐
-
[bzoj1670][Usaco2006 Oct]Building the Moat
Description 为了防止口渴的食蚁兽进入他的农场,$Farmer John$决定在他的农场周围挖一条护城河.农场里一共有$N$股泉水,并且,护城河总是笔直地连接在河道上的相邻的两股泉水.护城河 ...
-
Data Flow的Error Output
一,在Data Flow Task中,对于Error Row的处理通过Error Output Tab配置的. 1,操作失败的类型:Error(Conversion) 和 Truncation. 2, ...
-
saltstack 入门命令
master服务启动 CentOS 7 (Debian.OpenSuse.Fedora) systemctl start salt-master /etc/init.d/salt-master sta ...
-
android sdk manager 无法更新解决方法
因为在开始->运行->cmd 中敲入 ping dl-ssl.google.com -t 始终ping不通 ,关闭cmd后 首先需要下载一个代理服务器下载地址 http://pan.bai ...
-
mysql 1067 启动错误!!!
图二:服务器启动不成功 -- 解决方法
-
第01节:ActiveMQ入门和消息中间件
1.ActiveMQ最主要的功能:实现JMS Provider,用来帮助实现高可用.高性能.可伸缩.易用和安全的企业级面向消息服务的系统.是一个异步的功能. 2.ActiveMQ特点: 完全支持JMS ...
-
.Net Core+Angular6 学习 第四部分(EF Core(Code First))
目的: 打算通过EF core 练习从database receive data 显示到UI. 1. 创建一个新的project Model.定义一个 base interface entity以及实 ...
-
Chrome 插件安装技巧
参考http://blog.csdn.net/shiyaru1314/article/details/49303317 最近在学习WEBAPI 由于没有界面可以调试,需要安装Chrome中的插件 P ...
-
Eclipse中创建一个新的SpringBoot项目
在Eclipse中创建一个新的spring Boot项目: 1. 首先在Eclipse中安装STS插件:在Eclipse主窗口中点击 Help -> Eclipse Marketplace... ...
-
GIT中常用的命令
最近项目中使用到了GIT,所以记录一下GIT中常用的命令. GIT使用的客户端有Git Bash:http://code.google.com/p/msysgit/ 还有乌龟TortoiseGit:h ...