首页 > 其他分享 >合并果子

合并果子

时间:2024-05-09 12:22:58浏览次数:20  
标签:个点 果子 合并 决策 权值 huffman 我们

借助这一道题目来严谨证明一下Huffman树的构造方法的正确性

对任意一颗\(k\)叉huffman树,他都可以等价于一个类似于合并果子的过程,即每次取出最多\(k\)个点进行合并,然后\(k\)个点的权值和就是新的点的权值,然后把这个新的点加入决策集合,最终操作的只剩下一个点。不难证明,huffman树所求的带权路径和就是合并过程中产生的每个点的点权和(包括最开始的点)

蓝书上的关于最后一次不足\(k\)个的论点给了我们一个启发:在huffman树中(没有添加权值为\(0\)的节点),除了倒数第二层(注意最后一层全部都是叶子)可能存在不满\(k\)叉的节点,从第一层到倒数第三层的所有节点的叉数都是满的;而倒数第二层也不会存在两个点或以上不满\(k\)叉,否则的话我们将这些点按顺序排好权值和显然不变,如下

而根据我们前面的等价,上述表述就是说明我们除了可能在第一次取的时候不取满\(k\)个点,剩下的合并的时候都是一次性从决策集合里面拿\(k\)个点出来的

我们再来考察取的过程。对于任意一种合并的方案,我们显然是每次合并决策集合中最小的若干个点是最优的(用决策包容性证明,相当于越早合并被记录的次数就越多)。那么就可以构造出来一种方案了:根据我们上面的等价过程,我们只有在第一次的时候取不满\(k\)个点,剩下的时候全部都从决策集合里面拿\(k\)个点就好了。为了程序的一致性,我们在最开始的时候加入若干个零点就可以不用判断边界条件了

标签:个点,果子,合并,决策,权值,huffman,我们
From: https://www.cnblogs.com/dingxingdi/p/18181864

相关文章

  • 线段树合并[学习笔记]
    线段树合并壹.什么是线段树合并?简单来说就是合并两棵线段树对于当前要合并的节点\(x,y\)如果一方为空返回另一方否则分别合并左右子树intmerge(intx,inty){if(!x||!y)returnx+y;cnt(x)+=cnt(y);//...ls(x)=merge(ls(x),ls(y));rs(x)......
  • 23. 合并 K 个升序链表
    23.合并K个升序链表https://leetcode.cn/problems/merge-k-sorted-lists/?envType=study-plan-v2&envId=top-interview-150 思路K个升序链表,依据显然的规则:当前最小的值,肯定出自于K个升序链表的K个表头中,对这K个表头使用最小堆(priority_queue)进行管理,pop出的堆顶值,就......
  • CF-600-E-启发式合并
    600-E题目大意给定一颗\(n\)个节点的树,根为\(1\)。树上的每个节点\(i\)都有一个颜色\(c_i\)。如果一个颜色在以\(x\)为根的子树中出现次数最多,那么称该颜色为主要颜色,显然,一颗树中可以有多个主要颜色。求出对于每个节点为根时,其子树中所有主要颜色的编号和。Solution启发式......
  • pd.merge函数合并DataFrame 保留原index
    C=pd.merge(A,B),merge之后C的行数并不会变。但是A的index丢失了,因为merge之后index是重排的。解决办法:方法1:#可以先把A的index保存一下,A、B中含有"col"列A_index=A.indexC=pd.merge(A,B,on="col",how="left")C.index=A_index方法2:#A、B中含有"col"列,set_index设置C......
  • vscode 新建、合并分支
    vscode1.88.1(2024-04-10)gitea-1.20-gogit-windows-4.0-amd64Windows11--- 序章本文演示自己用的VisualStudiocode1.88.1中:新建分支合并分支两个操作。 说明,本文仅展示了在自己的开发环境,单人操作。团队多人操作时,应该还有下拉、解决冲突、提交等需要处......
  • php合并时间区间
    需要写一段合并时间区间的代码,写个demo记录下<?php$arr=[["2024-04-1611:25:46","2024-04-1612:19:21"],["2024-04-1603:14:06","2024-04-1610:13:21"],["2024-04-1613:14:59","2024-04-1615:44:46"],......
  • 2024-05-01:用go语言,给定两个长度为偶数n的整数数组nums1和nums2, 分别移除它们各自的一
    2024-05-01:用go语言,给定两个长度为偶数n的整数数组nums1和nums2,分别移除它们各自的一半元素,将剩下的元素合并成集合s。找出集合s中可能包含的最多元素数量。输入:nums1=[1,2,3,4,5,6],nums2=[2,3,2,3,2,3]。输出:5。答案2024-05-01:chatgpt题目来自leetcode3002。大体......
  • 数据结构--线段树合并
    线段树合并前置知识权值线段树,动态开点线段树简单说明一下,权值线段树就是以值域开的一棵线段树,而动态开点就是因为值域过大导致线段树开不下,于是开一棵残疾的线段树。线段树合并模板例:给定两个数列\(a,b\),求\(\suma_i+b_i\)当然我只是为了引出模板。代码(\(x\)表......
  • ETL中双流合并和多流合并的区别
    一、ETL工具ETLCloud数据集成平台集实时数据集成和离线数据集成以及API发布为一体的数据集成平台。与其他开源数据集成工具相比,采用轻量化架构、具有更快的部署速度、更快的数据传输速度、更低的运维成本,同时支持多租户的团队协作能力,能够满足企业各种复杂的数据处理需求。含有丰......
  • python多个txt合并
    txt数据是这样: 内容: #!usr/bin/envpython#-*-coding:utf-8-*-"""@author:Suyue@file:lianxi.py@time:2024/04/28@desc:"""#-*-coding:utf-8-*-#os模块中包含很多操作文件和目录的函数importos#适用于位置任意的情况,不要求同一目录下meragefile......