构建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个数就是构建出的哈夫曼树的带权路径和
具体实现很简单,代码就不给出了