哈夫曼树
来源:互联网 发布:淘宝投诉三无产品举证 编辑:程序博客网 时间:2024/06/04 19:30
一、定义
(1)专业解释
给定n个权值作为n的叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。
(2)自己理解
Huffman树,也称最优二叉树,是加权路径长度最短的二叉树。
简单的来说就是权值越大路径越短(权值),这样整体最优(权值*路径长度的和最小)
二、贪心法则构建哈夫曼数
(1)什么是贪心法则
是指在问题求解时,总是做出当前看起来最好的选择。也就是说贪心算法做出的不是整体最优的的选择,而是某种意义上的局部最优解。贪心算法不是对所有的问题都能得到整体最优解。
(2)怎么构建哈夫曼树
从权值最小的值开始构建,开始的时候选择两个权值最低的两个构建一个局部哈夫曼树,然后将这个构建好的数的根节点(权重值为左右节点权重的相加)返回到原来的序列中,构建好的数就从序列中删除了,这样不断选择两个权重最小的两个进行构建,知道序列中的元素个数为0
三、大体结构
1、huffmanNode的声明
template<class T>struct HuffmanNode{HuffmanNode<T>* _left;HuffmanNode<T>* _right;T _weight;//权值public:HuffmanNode(const T& w):_weight(w), _left(NULL), _right(NULL){}};
2、huffmanTree的结构
#include"Heap.h"template<class T>class HuffmanTree{typedef HuffmanNode<T> Node;public:HuffmanTree();//默认构造函数HuffmanTree(const T* a, size_t size);//建立huffmanTreevoid GenerateHuffmanCode();//获取对应的huffman编码,找什么,怎么找protected:Node* _GreatTree(const T* a, size_t size);protected:Node* _root;};
四、具体实现
1、默认构造函数
HuffmanTree():_root(NULL){}
2、构建huffmanTree(使用递归构建)
(1)主函数:
HuffmanTree(const T* a, size_t size){_root = _GreatTree(a, size);}
(2)递归函数
Node* _GreatTree(const T* a, size_t size){struct Compare//建立小根堆{bool operator()(const Node* l, const Node* r){return l->_weight < r->_weight;}};Heap<Node*,Compare> minHeap;//保存的是节点,而不是T类型的具体的数据,若为数那么节点摘下来,那不是后面的数没有了for (size_t i = 0; i < size; i++){minHeap.Push(new Node(a[i]));}while (minHeap.Size()>1)//不能使用minHeap.Empty(),因为有两两配对,会剩下只有一个数的情况{<span style="white-space:pre"></span>//也就是节点数两两配对,最后会剩下一个root节点Node* left = minHeap.Top();minHeap.Pop();Node* right = minHeap.Top();minHeap.Pop();Node* parent = new Node(left->_weight + right->_weight);parent->_left = left;parent->_right = right;minHeap.Push(parent);}return minHeap.Top();}
0 0
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 哈夫曼树
- 从一条石家庄到长沙的最好路线
- (结构型模式)ADAPTER——适配器模式
- View的滑动冲突
- install tomcat on mac
- Problem3-1016
- 哈夫曼树
- LeetCode Intersection of Two Arrays II
- 给 Android 开发者的 RxJava 详解
- (行为模式)MEMENTO——备忘录模式
- 15、关于元素CSS函数的封装,可用于获取和设置元素的CSS样式
- 探讨BPM与大数据的关系一数据驱动BPM
- 华信第一阶段Java试卷分析
- (结构型模式)COMPOSITE——组合模式
- python 爬虫抓取19楼租房信息