最优前缀码

1. 问题

在这里插入图片描述

2. 解析

构造最优前缀码的贪心算法就是哈夫曼算法。

构建哈夫曼树的过程:
1.按照贪心算法每次找权值最小(即值最小)的两个数,构成孩子结点,并将这两个数据排除出这一堆数据之外。
2.由于哈弗曼树的数据全在叶子结点,所以把上述权值最小的两个数据构成父结点,然后再将父结点的权值放回上述数据,返回第一步,重复上述过程,直到所有的数据都变成哈夫曼树的叶子结点。

实例:{5, 5, 10, 10, 10, 15, 20, 25}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
引理1:C是字符集,∀c∈C,f©为频率,x,y∈C,f(x),f(y)频率最小,那么存在最优二元前缀码使得x,y码字等长且仅在最后以为不同。
在这里插入图片描述
引理2:设T是二元前缀码的二叉树,∀x,y∈T,x,y是树叶兄弟,z是x,y的父亲,令T’=T-{x,y},且令z的频率f(z)=f(x)+f(y),T’是对应二元前缀码C’=(C-{x,y})∪{z}的二叉树,那么B(T)=B(T’)+f(x)+f(y)

3. 设计

在这里插入图片描述

4. 分析

O(nlogn)频率排序;for 循环 O(n),插入操作 O(logn)
算法时间复杂度是 O(nlogn)

5. 源码

https://github.com/Wang-2333/-/blob/master/最优前缀码.cpp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值