哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最短的码字,有时称之为最佳编码,一般就叫做Huffman编码(有时也称为霍夫曼编码)。

 #include "stdafx.h"
#include <iostream>
#include<queue>
#include<vector>
#include <string> using namespace std; typedef struct
{
//内容
unsigned char character;
//频次
unsigned int frequency; } CharNode; struct MinHeapNode
{
char data;
unsigned int freq;
MinHeapNode *left, *right;
MinHeapNode(char data, unsigned int freq)
{
left = right = NULL;
this->data = data;
this->freq = freq;
}
};
typedef struct MinHeapNode MinHeapNode; struct compare
{
bool operator()(MinHeapNode *a, MinHeapNode *b)
{
//"a > b" 表示 数值小 的 优先级高, 排最上面
//反之 "<" 表示大的优先级高
return (a->freq > b->freq);
}
}; void get_huffuman_code(MinHeapNode *topNode, string code)
{
if (NULL == topNode)
{
return;
}
//表示已到达最末端,含有左右节点的元素中(由while循环中生成)data必为-1
if (topNode->data != -)
{
cout << topNode->data << " : " << code<<endl;
}
get_huffuman_code(topNode->left, code + "");
get_huffuman_code(topNode->right, code + "");
} int main()
{
FILE * inputFile = NULL;
fopen_s(&inputFile,"input.txt", "rb");
if (!inputFile)
{
cout<< "Error: open file failed !" << endl;
return -;
} //初始化ASCII码数组
CharNode nodeArr[] = { {,} };
while (!feof(inputFile))
{
char buf = getc(inputFile);
cout << buf;
nodeArr[buf].character = buf;
nodeArr[buf].frequency++;
}
cout << endl;
//定义一个小顶堆
priority_queue<MinHeapNode*, vector<MinHeapNode*>, compare > minHeap;
for (size_t i = ; i < ; i++)
{
//将数据堆中,与升序排序效果类似,即堆首为小值,堆尾为大值
if (nodeArr[i].frequency > )
{
minHeap.push(new MinHeapNode(nodeArr[i].character, nodeArr[i].frequency));
cout << "Node " << i << ": [" << nodeArr[i].character << ", " << nodeArr[i].frequency << "]" << endl;
}
} MinHeapNode *leftNode = NULL, *rightNode = NULL, *topNode = NULL;
//从堆首中抛出两个较小节点,生成一个新节点放回堆中并进行重新排序,
//故,每次操作完成后 堆中会减少一个元素, 且堆顶必为权值最小的2个元素
//直至堆中只剩一个元素时,哈夫曼树生成完毕
while (minHeap.size() > )
{
//较小放左侧
leftNode = minHeap.top();
minHeap.pop();
//较大的放右侧
rightNode = minHeap.top();
minHeap.pop(); topNode = new MinHeapNode(-, leftNode->freq + rightNode->freq);
topNode->left = leftNode;
topNode->right = rightNode;
minHeap.push(topNode);
}
get_huffuman_code(topNode, "");
getchar();
return ;
}

对于解码过程,从根节点出发,依次读取文件流的bit 遇到“0”找leftNode,遇到“1”找rightNode,直至 data != -1

Huffuman Coding (哈夫曼编码)的更多相关文章

  1. Huffman Coding 哈夫曼编码

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4096079.html 使用优先队列实现,需要注意以下几点: 1.在使用priority_qu ...

  2. 霍夫曼编码(Huffman Coding)

    霍夫曼编码(Huffman Coding)是一种编码方法,霍夫曼编码是可变字长编码(VLC)的一种. 霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符 ...

  3. 哈夫曼编码(Huffman coding)的那些事,(编码技术介绍和程序实现)

    前言 哈夫曼编码(Huffman coding)是一种可变长的前缀码.哈夫曼编码使用的算法是David A. Huffman还是在MIT的学生时提出的,并且在1952年发表了名为<A Metho ...

  4. 哈夫曼编码的理解(Huffman Coding)

    哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,可变字长编码(VLC)的一种.Huffman于1952年提出一种编码方法,该方法完全依据字符出现概率来构造异字头的平均长度最 ...

  5. 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  6. HDU2527 哈夫曼编码

    Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. 赫夫曼\哈夫曼\霍夫曼编码 (Huffman Tree)

    哈夫曼树 给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离 ...

  8. hdu2527哈夫曼编码

    /* Safe Or Unsafe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...

  9. 哈夫曼树(Huffman Tree)与哈夫曼编码

    哈夫曼树(Huffman Tree)与哈夫曼编码(Huffman coding)

随机推荐

  1. Linux下桥接模式详解一

    注册博客园已经好长时间,一直以来也没有在上面写过文章,都是随意的记录在了未知笔记上,今天开始本着分享和学习的精神想把之前总结的笔记逐步分享到博客园,和大家一起学习,一起进步吧! 2016-09-20  ...

  2. 4.GIT安装

    最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑.不过,慢慢地有人把它移植到了Windows上.现在,Git可以在Linux.Unix.Mac和Window ...

  3. 正则表达式验证合法的IP地址

    IPv4地址 最初设计互联网络时,为了便于寻址和层次化构造网络,每个IP地址包括两个标识码(ID),即网络ID和主机ID.同一个物理网络上的所有主机都使用同一个网络ID,网络上的一个主机(包括网络上的 ...

  4. TensorFlow学习笔记(三)-- feed_dict 使用

    个人理解:就是TF的一种输入语法. 跟C语言的scanf(),C++的 cin>> 意思差不多,只是长相奇怪了点而已. 做完下面几个例子,基本也就适应了. 首先占位符申请空间:使用的时候, ...

  5. 在MFC下如何定义全局变量和全局函数

    用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行.实际上有多种方法可以实现,这里只介绍两种 ...

  6. Codeforces Round #425 (Div. 2) C - Strange Radiation

    地址:http://codeforces.com/contest/832/problem/C 题目: C. Strange Radiation time limit per test 3 second ...

  7. Django 部署(Apache下)

    前言: 因为需要在服务器下运行python脚本,所以需要搭建Django服务器.所以将自己的学习过程也记录下来,方便日后查阅. 本文环境如下: Ubuntu 16.04  python2.7 Apac ...

  8. C#数组的Map、Filter、Reduce操作

    在Javascript.Python等语言里,Map.Filter和Reduce是数组的常用方法,可以让你在实现一些数组操作时告别循环,具有很高的实用价值.它们三个的意义大家应该都清楚,有一个十分形象 ...

  9. windows上使用clang编译程序

    环境:windows7,64位 1.下载并安装llvm,安装包里除了llvm,也有clang: http://releases.llvm.org/5.0.0/LLVM-5.0.0-win64.exe ...

  10. tomcat源码调试

    三.tomcat目录结构 tomcat的下载安装有很多教程,不再赘述. 现在的tomcat已经到9了,当tomcat下载安装完成后,其目录大致如下:     除了上面的文件夹,还有四个文件:     ...