首页 > 其他分享 >常用代码模板6——贪心

常用代码模板6——贪心

时间:2022-12-01 00:11:43浏览次数:42  
标签:结点 int 代码 WPL 二叉树 权值 霍夫曼 模板 贪心

贪心

  1. 夹逼定理(若a >= b, b >= a,则a == b)

证明用当前方法得到的结果就等于最优解

区间问题

可以尝试的突破口:排序(按左端点或右端点或双关键字排序)

常用证明方法:

  1. 基本思路:夹逼定理(ans >= cnt,ans <= cnt)
  2. 反证法
  3. 最优解中的区间一定可以换成用贪心策略选出的区间

huffman树

树的带权路径长度

设二叉树具有n个带权叶结点,从根结点到各叶结点的路径长度与相应叶节点权值的乘积之和称为 树的带权路径长度(Weighted Path Length of Tree,WPL)

设\(w_i\)为二叉树第i个叶结点的权值,\(l_i\)为从根结点到第i个叶结点的路径长度,则 WPL 计算公式如下:

\[WPL=\sum_{i=1}^{n}w_il_i \]

结构

对于给定一组具有确定权值的叶结点,可以构造出不同的二叉树,其中,WPL 最小的二叉树 称为 霍夫曼树(Huffman Tree)

对于霍夫曼树来说,其叶结点权值越小,离根越远,叶结点权值越大,离根越近。

霍夫曼算法

霍夫曼算法用于构造一棵霍夫曼树,算法步骤如下:

  1. 初始化:由给定的n个权值构造n棵只有一个根节点的二叉树,得到一个二叉树集合 。
  2. 选取与合并:从二叉树集合F中选取根节点权值 最小的两棵 二叉树分别作为左右子树构造一棵新的二叉树,这棵新二叉树的根节点的权值为其左、右子树根结点的权值和。
  3. 删除与加入:从F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到F中。
  4. 重复 2、3 步,当集合中只剩下一棵二叉树时,这棵二叉树就是霍夫曼树。

对于未建好的霍夫曼树,直接求其 WPL

priority_queue<int, vector<int>, greater<int>> q;
for (int i = 0; i < n; i ++ ) q.push(w[i]);
int ans = 0;
while (q.size() > 1)
{
    int a = q.top(); q.pop();
    int b = q.top(); q.pop();
    ans += a + b;
    q.push(a + b);
}
cout << ans;

证明:WPL最小

  1. 最小的两堆深度最深且可以互为兄弟。
    1. 如果x, y在同一层,将它们的位置变成兄弟不改变结果
    2. 如果y在更高层,有图中算式得交换成兄弟位置一定更好
  2. 接下来的递归解决即可

排序不等式

证明方法:微扰+作差

绝对值不等式

求x,使得|a - x| + |b - x|最小,则令x在[a, b]中,a < b

标签:结点,int,代码,WPL,二叉树,权值,霍夫曼,模板,贪心
From: https://www.cnblogs.com/zhengzirui/p/16940217.html

相关文章

  • 常用代码模板4——数学知识
    常用代码模板4——数学知识数论质数在大于1的整数中,如果只有1和本身这两个约数,就被称为质数或素数所有小于等于1的整数既不是质数也不是合数试除法判定质数时间复......
  • 常用代码模板1——基础算法
    常用代码模板1——基础算法快速排序算法模板voidquick_sort(intq[],intl,intr){if(l>=r)return;inti=l-1,j=r+1,x=q[l+r>>1];......
  • 实验6 模板类和文件I/O
     实验任务3task3_1.cpp1#include<iostream>2#include<vector>3template<typenameT>4voidoutput(constT&obj){5for(auto&item:obj)6std::......
  • C#-简易公式计算器代码实现
    计算器如图所示,仅实现加减乘除及括号功能,公式错误时会有提示。首先建立一个inputList,每点击数据一下,便将内容添加至inputList中,点击后退时则删除List中最后一个元素。......
  • Spring Boot中添加Thymeleaf模板
    SpringBoot中添加Thymeleaf模板前面我们讲解了SpringBoot项目的创建、SpringBoot结构信息,自动配置功能等,那么Springboot创建出来,我们最终是要做web开发的,所以我们这章讲......
  • 案例-文件下载-代码实现。中文文件名问题
    案例-文件下载-代码实现文件下载需求:1.页面显示超链接2.点击超链接后弹出下载提示框3.完成图片文件下载分析:1.超链接......
  • 实验六:模板类和文件
    w实验任务三task3_1.cpp#include<iostream>#include<fstream>#include<array>#defineN5intmain(){usingnamespacestd;array<int,N>x{97,98,99,100,......
  • Spring Boot中添加Thymeleaf模板
    SpringBoot中添加Thymeleaf模板前面我们讲解了SpringBoot项目的创建、SpringBoot结构信息,自动配置功能等,那么Springboot创建出来,我们最终是要做web开发的,所以我们这......
  • python用ARIMA模型预测CO2浓度时间序列实现|附代码数据
    全文下载链接:http://tecdat.cn/?p=20424时间序列为预测未来数据提供了方法。根据先前的值,时间序列可用于预测经济,天气的趋势。时间序列数据的特定属性意味着通常需要专门......
  • day42 6-5 springMVC调度器、ModelAndView、配置thymeleaf模板引擎 & 6-6 thymeleaf语
    springMVC调度器-DispatcherServlet-SpringMVC框架的入口定义DispatcherServlet成为调度器,配置在web.xml文件中,用于拦截匹配的请求。并解析请求url,将请求分发给对应......