[算法设计与分析入门]贪心算法之哈夫曼编码问题

本文介绍了哈夫曼编码的概念,包括二进制编码、固定长编码、可变长编码和前缀编码,并重点讲解了哈夫曼树的构造过程。通过选取频率最低的结点组合来构建树,确保编码的效率。文章还探讨了贪心算法在哈夫曼编码中的应用,提出了算法的优化子结构和贪心选择性。最后,概述了构建堆和堆操作的算法分析,总时间复杂度为O(nlogn)。

问题概述

1 二进制编码:用二进制字符0-1串来表示
2 固定长编码:每个0-1串的长度是固定的
3 可变长编码:常用短,不常用长
4 前缀编码:没有任何字符的编码是其他字符的前缀

这里需要使用型结构.
使用字符出现的频率和字符来作为结点的内容[字符:频率]

这里给出一个例子:
[a:45],[b:13],[c,12],[d:16],[e:9],[f:5]

我们引入树T的代价
dT(c)d_T(c)dT(c)是符号c在树T的深度,即c的编码长度
f(c)f(c)f(c)是符号c出现的频率,在结点中保存
则T的代价是编码一个文件的所有字符的代码位数
B(T)=∑cf(c)∗dT(c)B(T)=\sum_cf(c)*d_T(c)B(T)=cf(c)dT(c)

[贪心思想]
我们循环地选择两个具有最低频率的两个结点将它们生成一棵子树,将这两个结点的频率和作为新的父节点的频率值.这样不断进行,直到得到一棵完整的树.

我们需要证明两点

待补充

  • 优化前缀树具有优化子结构
  • 优化前缀树具有贪心选择性

[贪心算法伪代码]

//C是字母表,x.y是C中具有最小频率的两个字符.
Huffman(C,F)
	//字符的个数|C|
	n<-|C|;
	//将C建立成堆
	Q<-C;
	For i<-1 To n-1 Do
	//创建结点存储Z
	z<-Allocate-Node();
	//堆操作
	//堆的左边指向x
	x<-left[z]<-Extract-Min(Q);
	//堆的右边指向y
	y<-right[z]<-Extract-Min(Q);
	//父节点的频率等于两个子节点的频率和
	f(z)<-f(x)+f(y)
	//堆操作
	Insert(Q,z);
Return

[算法分析]
算法由两部分组成 构建堆 + 堆操作

  • 构建堆:使用的build-heap实现,算法的时间复杂度为:O(n)O(n)O(n)
  • 堆操作:时间复杂度为O(log⁡n)O(\log n)O(logn),需要循环调用n-1次,所以总时间复杂度为O(nlog⁡n)O(n\log n)O(nlogn)
  • 总的时间复杂度为 T(n)T(n)T(n)=O(n)O(n)O(n)+O(nlog⁡n)O(n\log n)O(nlogn)=O(nlog⁡n)O(n\log n)O(nlogn)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值