O(N)构造K叉哈夫曼树

构建K叉的哈夫曼树和构建二叉哈夫曼树类似,都需要每次选出节点值最小的K个,组成新节点

我们使用优先队列(或者其他数据结构)的复杂度为nlogn,这里选用两个有序数组维护最小值的方式来优化

每次从a,b两个数组中选择最小的k个,将他们的和加到b的尾部,这个过程能够保证a,b数组都是从小到大的

 

感觉和归并有点类似

因为可能(n-1)%(k-1)!=0 所以可以先补充一些权值为0的节点直到(n-1)%(k-1)== 0。

权值为0的点不会对整体的值有影响,证明类似切木块的那道题目,想要多得到长度为0的一个木块不需要切,计算总花费的时候也不会计算

 

定义数组a和数组b(或者用个队列更方便

①首先将数据输入到a数组里

②将a数组按从小到大排序

③从a,b数组中选出最小的k个数

④将选出的k个数的和加到b数组的尾部,如果剩余个数大于等于1,重复执行③;否则,执行⑤;

⑤最后b数组里剩余的1个数就是构建出的哈夫曼树的带权路径和

 

具体实现很简单,代码就不给出了

 

 

 

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值