哈夫曼树编码代码实现,Python与C++经典示例


Python实现哈夫曼树编码

哈夫曼树是一种用于数据压缩的树形结构。它的基本思想是根据数据出现的频率构建一棵树,出现频率高的数据对应的节点离根节点近,出现频率低的数据对应的节点离根节点远。

python

import heapq

from collections import namedtuple

定义节点

Node = namedtuple('Node', ['left', 'right', 'value'])

def huffman_encode(s):

创建一个优先队列

pq = [(len(v), v) for v in s]

heapq.heapify(pq)

while len(pq) > 1:

freq1, c1 = heapq.heappop(pq)

freq2, c2 = heapq.heappop(pq)

创建一个新的节点,它的左右子节点分别是c1和c2

它的频率是c1和c2的频率之和

它的编码是c1和c2的编码的前缀,再加上一个表示c1或c2的字符

node = Node(c1, c2, (c1[0], c2[0]))

heapq.heappush(pq, (freq1 + freq2, node))

取出最后剩下的节点

return pq[0][1].value

编码函数

def huffman_encode_string(s):

huffman_tree = huffman_encode(s)

def build_huffman_tree(node, prefix):

if isinstance(node, str):

return {node: prefix}

else:

return {build_huffman_tree(node.left, prefix + '0'): build_huffman_tree(node.right, prefix + '1')}

return build_huffman_tree(huffman_tree, '')

测试

s = 'this is a test'

encoded_dict = huffman_encode_string(s)

for c in s:

print(c, encoded_dict[c])

C++实现哈夫曼树编码

cpp

include

include

include

include

using namespace std;

struct Node {

char data;

int freq;

Node left, right;

Node(char data, int freq, Node left = nullptr, Node right = nullptr)

: data(data), freq(freq), left(left), right(right) {}

};

struct cmp {

bool operator()(Node l, Node r) {

return l->freq > r->freq;

}

};

void buildHuffmanTree(vector& nodes, int n) {

priority_queue, cmp> pq;

for (int i = 0; i < n; i++)

pq.push(nodes[i]);

while (pq.size() != 1) {

Node left = pq.top();

pq.pop();

Node right = pq.top();

pq.pop();

Node parent = new Node('\0', left->freq + right->freq);

parent->left = left;

parent->right = right;

pq.push(parent);

}

nodes[0] = pq.top();

}

void printCodes(Node root, string str, map& codes) {

if (root->left == nullptr && root->right == nullptr) {

codes[root->data] = str;

return;

}

printCodes(root->left, str + "0", codes);

printCodes(root->right, str + "1", codes);

}

int main() {

string s = "this is a test";

vector nodes;

for (char c : s)

nodes.push_back(new Node(c, 0));

for (int i = 0; i < s.length(); i++)

nodes[i]->freq = 1;

buildHuffmanTree(nodes, s.length());

map codes;

printCodes(nodes[0], "", codes);

for (auto c : s)

cout << c << ": " << codes[c] << endl;

return 0;

}

这两个示例都实现了哈夫曼树编码。Python示例使用了heapq库来维护优先队列,C++示例使用了C++ STL中的priority_queue。这两个示例都使用了递归来构建哈夫曼树和生成编码。