一、什么是哈夫曼树

哈夫曼树又称为最优树.

通过权值来构造树,权值越大,离根节点越近

经常用于无损压缩算法

用于需要优化存储空间的场景

原理很简单,不多赘述

具体看百度百科的解释

需要注意 构建哈夫曼树不仅要值,还需要对应的权值

比如越常出现的,权值越大

二、构造哈夫曼树

通过权值来构造哈夫曼树

我画了几个图,具体过程如下

三、路径、编码、解码

上面通过权值构建了哈夫曼树,再将字符与权值对应起来

往左记作0 往右记作1

从根节点到各个叶子节点经过的0和1

就是该节点对应的路径

aaabbeaf编码:01010110101110011111

01010110101110011111解码:aaabbeaf

比如一个字符a原来占8位,通过哈夫曼编码后,就只占用2个位

但缺点是 权值较低的 占用字节会比较高,比如e,就占用4个位

四、代码

下面代码只是例子,编码解码并没有真的用位来表示,而是用字符串代替

HuffmanTree.h

  1. #pragma once
  2. #include<queue>
  3. #include<iostream>
  4. #include<algorithm>
  5. #include<string>
  6. using namespace std;
  7. class HuffmanTree
  8. {
  9. struct Node
  10. {
  11. int weight;//权值
  12. Node* left;//左孩子
  13. Node* right;//右孩子
  14. char value;//节点值
  15. string path;//存放路径
  16. };
  17. //仅用于优先级队列比较
  18. struct NodeCMP
  19. {
  20. bool operator()(Node* a, Node* b)
  21. {
  22. return a->weight > b->weight;
  23. }
  24. };
  25. private:
  26. Node* root = nullptr;
  27. vector<pair<char, string>*>map;
  28. public:
  29. HuffmanTree(vector<int>& weight, vector<char>& value) {
  30. createHuffmanTreeNode(weight,value);
  31. createHuffmanTreePath();
  32. }
  33. //初始化节点
  34. void createHuffmanTreeNode(vector<int>& weight, vector<char>& value) {
  35. priority_queue<Node*,vector<Node*>, NodeCMP>que;//优先级队列构造树
  36. for (size_t i = 0; i < weight.size(); i++){
  37. Node* temp = new Node{ weight[i] ,nullptr,nullptr,value[i] };
  38. que.push(temp);
  39. }
  40. while (que.size() >= 2){
  41. Node* min1 = que.top();
  42. que.pop();
  43. Node* min2 = que.top();
  44. que.pop();
  45. Node* node = new Node{ min1->weight + min2->weight,min1,min2 };
  46. que.push(node);
  47. }
  48. root = que.top();
  49. }
  50. //初始化路径
  51. void createHuffmanTreePath() {
  52. if (root == nullptr)return;
  53. queue<Node*>que;
  54. que.push(root);
  55. while (que.size()){
  56. Node* temp = que.front();
  57. que.pop();
  58. if (temp->left != nullptr) {
  59. que.push(temp->left);
  60. temp->left->path.append(temp->path + 0);
  61. }
  62. if (temp->right != nullptr){
  63. que.push(temp->right);
  64. temp->right->path.append(temp->path + 1);
  65. }
  66. if (temp->left == nullptr && temp->right == nullptr) {
  67. map.push_back(new pair<char, string>(temp->value, temp->path));
  68. }
  69. }
  70. }
  71. string encode(string data) {
  72. string result;
  73. for (size_t i = 0; i < data.size(); i++) {
  74. char ch = data[i];
  75. for (size_t j = 0; j < map.size(); j++) {
  76. pair<char, string>* mapData = map[j];
  77. if (mapData->first == ch) {
  78. result.append(mapData->second);
  79. break;
  80. }
  81. }
  82. }
  83. return result;
  84. }
  85. string decode(string data) {
  86. string result;
  87. while (data.size())
  88. {
  89. for (size_t i = 0; i < map.size(); i++)
  90. {
  91. pair<char, string>* mapData = map[i];
  92. if (data.find(mapData->second) == 0) {
  93. result.push_back(mapData->first);
  94. data = data.substr(mapData->second.size());
  95. break;
  96. }
  97. }
  98. }
  99. return result;
  100. }
  101. };

main.cpp

  1. #include<iostream>
  2. #include<vector>
  3. #includeHuffmanTree.h
  4. int main()
  5. {
  6. vector<int>weight = { 8,9,7,4,2,3 };
  7. vector<char>value = { 'a','b','c','d','e','f'};
  8. HuffmanTree tree(weight,value);
  9. string str;
  10. str = tree.encode(aaabbeaf);
  11. cout << str << endl;
  12. str = tree.decode(str);
  13. cout << str << endl;
  14. return 0;
  15. }

HuffmanTree,哈夫曼树的原理和c++实现的更多相关文章

  1. (哈夫曼树)HuffmanTree的java实现

    参考自:http://blog.csdn.net/jdhanhua/article/details/6621026 哈夫曼树 哈夫曼树(霍夫曼树)又称为最优树. 1.路径和路径长度在一棵树中,从一个结 ...

  2. 6-9-哈夫曼树(HuffmanTree)-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第6章  树和二叉树 - 哈夫曼树(HuffmanTree) ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版> ...

  3. 【算法】赫夫曼树(Huffman)的构建和应用(编码、译码)

    参考资料 <算法(java)>                           — — Robert Sedgewick, Kevin Wayne <数据结构>       ...

  4. 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码

    20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...

  5. 【algo&ds】【吐血整理】4.树和二叉树、完全二叉树、满二叉树、二叉查找树、平衡二叉树、堆、哈夫曼树、B树、字典树、红黑树、跳表、散列表

    本博客内容耗时4天整理,如果需要转载,请注明出处,谢谢. 1.树 1.1树的定义 在计算机科学中,树(英语:tree)是一种抽象数据类型(ADT)或是实作这种抽象数据类型的数据结构,用来模拟具有树状结 ...

  6. 哈夫曼树详解——PHP代码实现

    在介绍哈夫曼树之前需要先了解一些专业术语 路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径.通路中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L ...

  7. C++哈夫曼树编码和译码的实现

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

  8. 哈夫曼树(一)之 C语言详解

    本章介绍哈夫曼树.和以往一样,本文会先对哈夫曼树的理论知识进行简单介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现:实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若 ...

  9. 【数据结构】赫夫曼树的实现和模拟压缩(C++)

    赫夫曼(Huffman)树,由发明它的人物命名,又称最优树,是一类带权路径最短的二叉树,主要用于数据压缩传输. 赫夫曼树的构造过程相对比较简单,要理解赫夫曼数,要先了解赫夫曼编码. 对一组出现频率不同 ...

  10. Android版数据结构与算法(七):赫夫曼树

    版权声明:本文出自汪磊的博客,未经作者允许禁止转载. 近期忙着新版本的开发,此外正在回顾C语言,大部分时间没放在数据结构与算法的整理上,所以更新有点慢了,不过既然写了就肯定尽力将这部分完全整理好分享出 ...

随机推荐

  1. 【Azure 存储服务】MP4视频放在Azure的Blob里面,用生成URL在浏览器中打开之后,视频可以正常播放却无法拖拽视频的进度

    问题描述 把MP4视频放在Azure的Blob里面,用生成URL在浏览器中打开之后,视频可以正常播放却无法拖拽视频的进度,这是什么情况呢? 问题解答 因为MP4上传到Azure Blob后,根据公开的 ...

  2. 【Azure IoT Hub】从设备端如何向IOT发送海量数据,可以使用从设备到IoT连接的直接传输吗?如何把IoT Hub中的数据存储到Azure Storage中?

    问题描述 IoT Hub 从设备端如何向IOT发送海量数据,可以使用从设备到IOT连接的直接传输吗?还是需要另外开启连接.另外,消息路由和上传文件使用的连接是否就是设备到IOT建立的连接?还是需要额外 ...

  3. 【Azure 媒体服务】记录一个简单的媒体视频上传到Media Service无法播放问题

    问题描述 从本地上传到Azure Media Service Portal的视频,并且新增定位符后,无法播放.但是上传的其他视频是可以的.疑惑中!! 问题自查 自查发现,是视频的文件名中有个特殊符号. ...

  4. ArrayList学习总结

    1.ArrayList简介[1] ArrayList实现了List接口.ArrayList的方法实现和vector相似,只是线程不安全的. ArrayList的 size.isEmpty.get.se ...

  5. Python中那些简单又好用的特性和用法

    Python作为我的主力语言帮助我开发了许多DevOps运维自动化系统,这篇文章总结几个我在编写Python代码过程中用到的几个简单又好用的特性和用法,这些特性和用法可以帮助我们更高效地编写Pytho ...

  6. AtCoder Beginner Contest 338(A~E补题)

    目录 A B C题 D题 E题 A 签到 #include <bits/stdc++.h> #define rep(i,a,b) for(int i = (a); i <= (b); ...

  7. set中的erase使用的一个错误

    如果在遍历set的时候去erase很容易出事 事故代码: multiset<int>a; for(auto it=a.begin();it!=a.end();it++){ a.erase( ...

  8. 记spring boot启动出现Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.问题处理

    今天拉下了一个新的springboot工程,启动时出现了Unable to start web server; nested exception is org.springframework.cont ...

  9. linux vs code extension C# `GLIBC_2.27' not found

    settings中omnisharp:useModernNet改为true reboot虚机

  10. 1 - RTOS简介&规范&任务创建

    对外部响应能力: 实时(规定时间内)操作系统 , 有强(飞机系统)弱(信息采集系统)之分 与分时(顺序时间片)操作系统 FreeRTO实时操作系统 支持抢占式调度,合作式调度和时间片调度:内核大小在4 ...