数据结构
二、哈夫曼树(栈部分还没做完)
定义:
给定n个结点和它们的权值,以它们为叶子节点构造一棵带权路径长度和最小的二叉树,该二叉树即为哈夫曼树,也被称为最优树。
基础:
从一个结点到另一个结点的路径上所需经过的边的个数称为该路径的长度;路径长度再乘以结点的权值称为该结点的带权路径长度。此类题一般都是求解最小带权路径长度和。
实现方法:
堆数据结构--可以以O(logn)的复杂度取得n个元素中的最小元素--小顶堆
标准模板库:
优先队列:priority_queue<int> Q; (大顶堆)
priority_queue<int, vector<int>, greater<int> > Q; (小顶堆)
这里>>连在一起会报错:[Error] '>>' should be '> >' within a nested template argument list 因为>>会被当作右移运算符 不过新标准的C++好像就没问题了
代码部分:
Q.push(x) a=Q.top() Q.pop() 弹出堆顶元素后堆会自动调整为一个新的小顶堆
求哈夫曼树的时间复杂度:
O(nlogn)
例3.3
很简单 掌握之前的逻辑就好了 主要是回顾堆的基本操作和哈夫曼树求法
可以补充的两个函数:Q.empty() 和 Q.size() 元素个数
网友评论