1、算法流程

(1)构建霍夫曼树:自底向上

根据统计频率构建霍夫曼树:

A、把所有的节点扔进排序队列queue中;

B、从queue选择选择前面两个最小的元素a、b,把最小的树a作为左节点,把最小的b作为右节点,以此构建父节点c(c的频率值为a+b的频率值),然后把a、b从队列删除、把c节点插入队列;

C、循环(A)、(B)步骤构建霍夫曼树,直到queue为空。

(2)编码阶段:自顶向下

A、除了树的根节点没有码值之外,其他的根据左右子节点进行编码,做节点编码为0,右节点编码为1;

B、子节点在父节点码值的基础上,在后面加上一位对应的码值。

(3)解码阶段:自顶向下解码

根据给定的码值,从树根开始递归遍历,遇到0向左走,遇到1向又走,直到码值为空或者遇到叶子节点返回。

2、代码实现

#ifndef DATA_STRUCT_TREE_H
#define DATA_STRUCT_TREE_H
#include<vector>
#include <set>
#include <queue>
#include <string>
using namespace std;
class node{
public:node(){left_child=NULL;right_child=NULL;frequency=0;coding.clear();words="";};~node(){};node* left_child;node* right_child;int frequency;std::vector<bool> coding;string words;public:bool operator <(const node& n1) const{return frequency<n1.frequency;}
};
class huffman_coding{
public:static void create_tree(std::set<node>&queue,std::vector<node*>&tree){while (!queue.empty()){node *left= new node(*queue.begin());queue.erase(queue.begin());tree.push_back(left);if (!queue.empty()){node *right=new node(*queue.begin());queue.erase(*queue.begin());tree.push_back(right);node merge;merge.frequency=left->frequency+right->frequency;merge.left_child=left;merge.right_child=right;queue.insert(merge);}}}//自顶向下编码static void huffman_encoding(node*head){//广度优先遍历std::queue<node*>Q;Q.push(head);while (!Q.empty()){node*n=Q.front();Q.pop();if(n->left_child){n->left_child->coding=n->coding;n->left_child->coding.push_back(false);Q.push(n->left_child);}if(n->right_child){n->right_child->coding=n->coding;n->right_child->coding.push_back(true);Q.push(n->right_child);}}}static string huffman_decoding(node*head,vector<bool>coding){if(coding.empty()||!(head->right_child)||!(head->left_child))return head->words;std::vector<bool>::iterator this_code=coding.begin();if(*this_code)//右节点{coding.erase(this_code);return  huffman_decoding(head->right_child,coding);}else{coding.erase(this_code);return huffman_decoding(head->left_child,coding);}}static  void main(){//http://blog.csdn.net/xgf415/article/details/52628073int frequency[5]={10,8,3,4,5};string words[5]={"B","A","C","D","E"};std::set<node>queue;for(int i=0;i<5;i++){node n;n.frequency=frequency[i];n.words=words[i];queue.insert(n);}std::vector<node*>tree;create_tree(queue,tree);huffman_encoding(tree[tree.size()-1]);//打印编码结果for(std::vector<node*>::iterator it=tree.begin();it!=tree.end();it++){if ((*it)->words=="")continue;std::cout<<(*it)->words<<":";for (int i = 0; i <(*it)->coding.size() ; ++i) {std::cout<<(*it)->coding[i];}std::cout<<std::endl;}//测试解码string decode=huffman_decoding(tree[tree.size()-1],tree[0]->coding);std::cout<<decode<<":";for (int j = 0; j < tree[0]->coding.size(); ++j) {std::cout<<tree[0]->coding[j];}std::cout<<std::endl;}
};#endif //DATA_STRUCT_TREE_H

数据结构(六)霍夫曼树与编码相关推荐

  1. 【数据结构】赫夫曼树与编码

    赫夫曼树与赫夫曼编码 前言 赫夫曼树 存储结构 初始化树 构建树 赫夫曼编码 初始化编码 构建编码 前言 (概念) 路径:从一个节点到另一个节点的分支 路径长度:从一个节点到另一个节点的分支总数 节点 ...

  2. 霍夫曼树:霍夫曼编码(Huffman Tree:Huffman Coding)

    一.简介 霍夫曼树常处理符号编写工作.根据整组数据中符号出现的频率高低,决定如何给符号编码.如果符号出现的频率越高,则给符号的码越短,相反符号的号码越长. 相关术语 路径:从书中一个节点到另一个节点之 ...

  3. 数据结构与算法 / 霍夫曼树、霍夫曼编码和解码

    一. 诞生原因 找出存放一串字符所需的最少的二进制编码. 二. 构造方法 首先统计出每种字符出现的频率,即:概率.权值. 例如:频率表 A:60,    B:45,   C:13   D:69   E ...

  4. Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树

    Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 文章目录 Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 0x00 摘要 0x01 背景概念 1.1 词向量 ...

  5. c语言霍夫曼函数,使用C语言详解霍夫曼树数据结构

    1.基本概念 a.路径和路径长度 若在一棵树中存在着一个结点序列 k1,k2,--,kj, 使得 ki是ki+1 的双亲(1<=i 从 k1 到 kj 所经过的分支数称为这两点之间的路径长度,它 ...

  6. labview 霍夫曼树_哈夫曼树编码实验报告_信息论与编码实验2 实验报告_信息论与编码报告...

    huffman编码C语言实验报告 今日推荐 180份文档 2014...4页 1下载券 安卓版100 doors 2攻略1... 3页 1下载券 <逃脱本色>doors....语文教育实习 ...

  7. 数据结构之二叉树,二叉树存储结构,二叉树遍历,霍夫曼树以及图解

    数据结构之二叉树 树 什么是树? 树是一种一对多的数据结构.树有很多子集,比如:二叉树.完全二叉树.满二叉树.二叉搜索树等等. 树的特征: 没有父结点的叫做根,一个树有且只有一个根: 每个结点有0个或 ...

  8. 数据结构(二叉树相关、满、完全二叉树、霍夫曼树、排序方法及时间复杂度总结、)笔记-day11

    目录 前言 一.树(Tree) 1.1树及特征 1.2二叉树概念及性质 1.3二叉树存储结构及遍历 1.4链式存储编码 二.霍夫曼树(最优二叉树) 2.1权值及带权路径长度 2.2霍夫曼树特征及构建 ...

  9. 创建霍夫曼树,霍夫曼编码以及使用霍夫曼编码压缩文件

    那么,什么是霍夫曼树(赫夫曼树)呢? 给定n个权值(权值就是每个节点里面存放的数据,但是根据业务需求不同,存放的数据类型有些差别)作为n个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样 ...

最新文章

  1. service数据保存_「数据架构」数据流程图与实例-客户服务系统
  2. 查找Linux中内存和CPU使用率最高的进程
  3. 冷热rx-java可观察
  4. aws v2.2.exe_如何在AWS Elastic Beanstalk上部署Rails 5.2 PostgreSQL应用
  5. iview admin 使用爬坑
  6. Vue.js对数组对象的序号字段初始化重新生成序号
  7. linux eth0网卡配置详解
  8. 新操作系统有哪些新功能?一起来看看吧!
  9. Doxygen + Graphviz 安装(windows 10系统)
  10. python 进行深入学习
  11. Php 股票系统,利用PHP命令行模式采集股票趋势信息
  12. 暑期项目实训——08
  13. 与表达式p =0等价的c语言表达式是,2015年3月全国计算机二级C语言选择第1套
  14. laravel Carbon函数
  15. ACM新生赛部分题解
  16. Android 测量文字宽高
  17. 几场考试,垫格了一生
  18. js计算一年有多少周(星期一为第一天)
  19. 中国社交电商行业发展分析
  20. ping 命令详解 - DSCP

热门文章

  1. mysql中使用正则表达式,mysql中使用正则表达式查询
  2. 40vf什么意思_变频器的VF模式是什么意思?VF什么意思
  3. fastjson 检测json格式_FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换...
  4. cupsd进程_关于Linux操作系统进程操作(ps)命令简介
  5. c语言 文件加密头文件,[C语言]文件加密
  6. Django框架 day03
  7. 产品质量不过关怎么办?一招帮你大幅提高生产质量
  8. Vue.js 牛刀小试(持续更新~~~)
  9. 洛谷P2351 [SDOi2012]吊灯 【数学】
  10. Redis 发布订阅