1. 问题
2. 解析
构造最优前缀码的贪心算法就是哈夫曼算法(Huffman)
实例:
3. 设计
create_HuffmanTree();
void HfCoding(HfTree HT, HfCode& HC, int n)
{
HC = (HfCode)malloc(n * sizeof(char*));
char* code = (char*)malloc(n * sizeof(char));
int cur = 2 * n - 2,code_len = 0;
for (int i = 0; i < cur + 1; i++)
{
HT[i].weight = 0;
}
while (cur != -1)
{
if (HT[cur].weight == 0)
{
HT[cur].weight = 1;
if (HT[cur].lchild != -1)
{
code[code_len++] = '0';
cur = HT[cur].lchild;
}
else
{
code[code_len] = '\0';
HC[cur] = (char*)malloc((code_len + 1) * sizeof(char));
if (!HC[cur])
{
printf("HC[cur] malloc faild!");
exit(-1);
}
strcpy(HC[cur], code);
}
}
else if (HT[cur].weight == 1)
{
HT[cur].weight = 2;
if (HT[cur].rchild != -1)
{
code[code_len++] = '1';
cur = HT[cur].rchild;
}
}
else
{
HT[cur].weight = 0;
cur = HT[cur].parent;
--code_len;
}
}
free(code);
}
4. 分析
5. 源码
https://github.com/LiChunning/The-Design-and-Analysis-of-Algorithms/blob/main/%E6%9C%80%E4%BC%98%E5%89%8D%E7%BC%80%E7%BC%96%E7%A0%81.cpp