哈夫曼编码是可变字长编码(VLC)的一种。其思想是赋予高频字符短字码,赋予高频字符长字码。
通过这种编码可以有效的压缩数据,通常是20%~90%。
对于构造贪心算法,我们可以不用算法导论之贪心算法:活动选择问题中提到了所有步骤。
我们可以将其更一般化为:
1、将最优化问题转化为这样的形式:对其作出一次选择后,只剩下一个子问题需要求解。
2、证明作出贪心选择后,原问题总是存在最优解,即贪心算法是安全的。
3、证明作出贪心算法后,剩下的子问题满足性质:其最优解与贪心选择组合即可得到原问题的最优解,这样就得到了最优子结构。
代码试下如下:
为了实现这个题目,我额外写了一个小堆排序的优先队列算法包含:建堆、调整堆、堆排序、选择最小值并维护堆的性质、插入值并维护堆的性质。
#include <stdio.h>
struct Node{
struct Node *left;
struct Node *right;
char value;
float freq;
};
typedef struct Node Node;
int LEFT(int i) {
return (i << 1) + 1; // 括号必须要,否则先做加法运算
}
int RIGHT(int i) {
return (i << 1) + 2;
}
int PAREN