霍夫曼编码c++实现

一、霍夫曼编码的原理:
     在数据通信时,可以用0,1码的不同排列来表示字符。例如给定一段报文CAST CAST SAT AT A TASA
,在报文中出现的字符集合是{C,A,S,T},各个字符出现的频度是{2,7,4,5}。若给每个字符一个等
长的二进制表示,例如 C:00 A:01 S:10 T:11,则所发的报文将是00011011 00011011 100111 0111 01 11011001,
共计(2+7+5+4)*2=36个码。
若按字符出现的频度不同给予不同长度的编码,出现频度较大的字符采用
为数较少的编码,出现频度较小的字符采用位书较多的编码,可以是报文的码数降到最小,这就是所谓的最小
冗余编码问题。
霍夫曼编码就能实现这种最小冗余编码。上例中按字符出现的频度进行编码,A:0 T:10 S:110
C:111,则最终的报文只有35个码,节省了传输中使用的单元。


二、核心算法:
    一般情况下,霍夫曼编码的工作主要分为两步。第一步是准备工作,对于需要编码的字符(一般存在于文件里)
进行扫描,统计每个字符出现的频次,得到一个整数数组。第二步根据这个频次数组构造一棵霍夫曼树,这一步
是霍夫曼编码的核心内容。第三步,再次扫描一遍待编码的字符

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是C++实现霍夫曼编码的代码示例: ```c++ #include <iostream> #include <queue> #include <unordered_map> #include <vector> using namespace std; // 定义哈夫曼树的节点 struct Node { char ch; int freq; Node* left; Node* right; Node(char c, int f) : ch(c), freq(f), left(NULL), right(NULL) {} ~Node() { delete left; delete right; } }; // 定义哈夫曼树节点的比较器 struct NodeComparator { bool operator()(Node* a, Node* b) { return a->freq > b->freq; } }; // 哈夫曼编码函数 unordered_map<char, string> huffmanEncoding(string str) { // 统计字符出现的频率 unordered_map<char, int> freqMap; for (char ch : str) { freqMap[ch]++; } // 将字符频率信息转换为节点信息 priority_queue<Node*, vector<Node*>, NodeComparator> minHeap; for (auto pair : freqMap) { minHeap.push(new Node(pair.first, pair.second)); } // 构建哈夫曼树 while (minHeap.size() > 1) { Node* left = minHeap.top(); minHeap.pop(); Node* right = minHeap.top(); minHeap.pop(); Node* parent = new Node('$', left->freq + right->freq); parent->left = left; parent->right = right; minHeap.push(parent); } // 构建哈夫曼编码表 unordered_map<char, string> encodingMap; function<void(Node*, string)> dfs = [&](Node* node, string code) { if (!node) { return; } if (node->ch != '$') { encodingMap[node->ch] = code; } dfs(node->left, code + "0"); dfs(node->right, code + "1"); }; dfs(minHeap.top(), ""); return encodingMap; } int main() { string str = "Hello, Huffman Encoding!"; unordered_map<char, string> encodingMap = huffmanEncoding(str); for (auto pair : encodingMap) { cout << pair.first << ": " << pair.second << endl; } return 0; } ``` 上述代码中,首先使用 `unordered_map` 统计字符串中各个字符的出现频率,然后将频率信息转换为节点信息,并使用最小堆构建哈夫曼树。接着使用深度优先搜索构建哈夫曼编码表,并返回编码表。最后,输出各个字符对应的编码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值