哈夫曼编码(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. K-modes聚类算法MATLAB

    K-modes算法主要用于分类数据,如 国籍,性别等特征. 距离使用汉明距离,即有多少对应特征不同则距离为几. 中心点计算为,选择众数作为中心点. 主要功能: 随机初始化聚类中心,计算聚类. 选择每次 ...

  2. 【云安全与同态加密_调研分析(6)】云计算及云安全主流体系架构与模型——By Me

                                                            云计算及云安全的主流体系架构与模型 1. 云计算主流安全参考模型 1.1 云计算安全参考 ...

  3. 华为交换机VRP用户界面配置及Telnet登录实验

    user privilege level level 设置使用以上用户界面登录后的用户级别 5 acl acl-number { inbound | outbound } (可选)在用户界面上应用AC ...

  4. 使用selenium实现简单网络爬虫抓取MM图片

    撸主听说有个网站叫他趣,里面有个社区,其中有一项叫他趣girl,撸主点进去看了下,还真不错啊,图文并茂,宅男们自己去看看就知道啦~ 接下来当然就是爬取这些妹子的图片啦,不仅仅是图片,撸主发现里面的对话 ...

  5. 汇智课堂 Node.js相关课程

    Node.js入门 Node.js 是一个基于Chrome JavaScript 运行时建立的一个平台, 用来方便地搭建快速的 易于扩展的网络应用· Node.js 借助事件驱动, 非阻塞I/O 模型 ...

  6. IPFS搭建&集群

    下载go-ipfs wget https://github.com/ipfs/go-ipfs/releases/download/v0.4.17/go-ipfs_v0.4.17_linux-amd64 ...

  7. POJ1269:Intersecting Lines(判断两条直线的关系)

    题目:POJ1269 题意:给你两条直线的坐标,判断两条直线是否共线.平行.相交,若相交,求出交点. 思路:直线相交判断.如果相交求交点. 首先先判断是否共线,之后判断是否平行,如果都不是就直接求交点 ...

  8. 存储库之——MongoDB

    阅读目录 一 简介 二 MongoDB基础知识 三 安装 四 基本数据类型 五 CRUD操作 六 可视化工具 七 pymongo 一 简介 MongoDB是一款强大.灵活.且易于扩展的通用型数据库1. ...

  9. 实参相依查找[条款25]----《C++必知必会》

    名字空间对现代C++编程和设计有着深远的影响.其中有些影响直接而明显,例如using声明和using 指令以及采用名字空间作用域加以限定的名字.然而,名字空间还有一些在语法上不那么明显但任然很有基础. ...

  10. SQL Server自定义字符串分割函数——Split

    我相信大部分人都碰到过,处理数据的时候,字段的值是以 ',' (逗号)分隔的形式,所以我也不能避免. 然后我才知道,sql 是没有类似于 C# 和 Javascript 这种分割字符串的方法.( Sp ...