算法系列——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,一种通过字 ...
随机推荐
- Java多线程学习笔记--生产消费者模式
实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...
- usaco 1.2.1(指针技巧)
★Milking Cows 挤牛奶 三个农民每天清晨 5 点起床,然后去牛棚给 3 头牛挤奶.第一个农民在 300 时刻(从 5 点开始计时,秒为单位)给他的牛挤奶,一直到 1000 时刻.第二个农民 ...
- python中staticmethod classmethod及普通函数的区别
staticmethod 基本上和一个全局函数差不多,只不过可以通过类或类的实例对象 (python里光说对象总是容易产生混淆, 因为什么都是对象,包括类,而实际上 类实例对象才是对应静态语言中所谓对 ...
- 通用性站点管理后台(Bee OPOA Platform)
当前标签: Bee OPOA Platform 通用性站点管理后台(Bee OPOA Platform) (5)- [扩展]基于WebSocket的监视Sql执行功能 蜂 2013-10-25 1 ...
- 使用NeatUpload控件实现ASP.NET大文件上传
使用NeatUpload控件实现ASP.NET大文件上传 一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不 ...
- ASP.NET MVC 用户登录Login
ASP.NET MVC 用户登录Login一.先来看个框架例子:(这个是网上收集到的) 第一步:创建一个类库ClassLibrary831. 第二步:编写一个类实现IHttpM ...
- markdown实现
博客园文章markdown实现 博客园也可以使用markdown写博客了~_~ 实现方法 在博客园管理-设置-页首Html代码中加入: <!-- Markdown --> <sc ...
- CSS样式基础知识
CSS样式基础知识 CSS样式概述 CSS是Cascading Style Sheet 的缩写.译作“层叠样式表单”.是用于(增强)控制网页样式并允许将样式信息与网页内容分离的一种标记性语言. 引用位 ...
- 图解JOIN
阅读导航 一.概要 二.JOIN分类 三.JOIN分类详解 一.概要 JOIN对于接触过数据库的人,这个词都不陌生,而且很多人很清楚各种JOIN,还有很多人对这个理解也不是很透彻,这次就说说JOIN操 ...
- java微信平台,发源码
最近写了一个微信平台的架构,采用servlet + spring3.0 + hibernate4.1.整体架构由我负责建设,我尽可能的把业务模块分出来.趁着刚搭好的框架,留着这版.代码是大部份都由其他 ...