priority_queue实现哈夫曼树的时间复杂度
时间: 2023-12-19 20:29:55 浏览: 128
优先队列C++实现哈夫曼树
根据引用中提到的,优先队列的时间复杂度为O(logn),其中n为队列中元素的个数。因此,使用priority_queue实现哈夫曼树的时间复杂度为O(nlogn),其中n为哈夫曼树中叶子节点的个数。
实现哈夫曼树的步骤如下:
1. 统计每个字符在文本中出现的频率,并将其作为权值构建一个森林,每个节点都是一棵只包含一个字符的树。
2. 从森林中选出两棵根节点权值最小的树,将它们合并成一棵新树,新树的根节点权值为两棵树的根节点权值之和。
3. 将新树插入到森林中,并删除原来的两棵树。
4. 重复步骤2和3,直到森林中只剩下一棵树,即为哈夫曼树。
下面是使用priority_queue实现哈夫曼树的C++代码示例:
```c++
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode {
char ch;
int freq;
TreeNode *left, *right;
TreeNode(char c, int f) : ch(c), freq(f), left(NULL), right(NULL) {}
};
struct cmp {
bool operator() (TreeNode* a, TreeNode* b) {
return a->freq > b->freq;
}
};
TreeNode* buildHuffmanTree(string s) {
int n = s.size();
vector<int> freq(256, 0);
for (int i = 0; i < n; i++) {
freq[s[i]]++;
}
priority_queue<TreeNode*, vector<TreeNode*>, cmp> pq;
for (int i = 0; i < 256; i++) {
if (freq[i] > 0) {
pq.push(new TreeNode(i, freq[i])); }
}
while (pq.size() > 1) {
TreeNode* left = pq.top();
pq.pop();
TreeNode* right = pq.top();
pq.pop();
TreeNode* parent = new TreeNode('#', left->freq + right->freq);
parent->left = left;
parent->right = right;
pq.push(parent);
}
return pq.top();
}
int main() {
string s = "hello world";
TreeNode* root = buildHuffmanTree(s);
// do something with the Huffman tree
return 0;
}
```
阅读全文