最优前缀编码
1. 问题
2. 解析
1、 将每个字符的使用频率按照升序进行排序。
2、 每次从频率数组中取出频率最小的两个字符作为新节点的左右节点,新节点的值为左右节点的频率之和。
3、 将新节点放入频率数组中,重新按照升序排序。
4、 重复第2、3步骤,直到生成所有频率节点生成一棵二叉树,这棵树就是我们构建的哈夫曼树。
5、 通过哈夫曼树就字符集进行编码,对于所有节点来说,左孩子编码为0,右孩子编码为1。
3. 设计
1.n<-|C|
2.Q<-C //按频率递增构成队列 Q
3.for i<-1 to n-1 do
4. z<-Allocate-Node()
5. z.left<-Q中最小元 //取出Q中最小元作为z的左儿子
6. z.right<-Q中最小元 //取出Q中最小元作为z的右儿子
7. f(z)<-f(x)+f(y)
8. Insert(Q,z)
9. return Q
4. 分析
算法时间复杂度是 O(nlogn)
5. 源码
https://github.com/wubbalubbad/suanfa/tree/main