Unit3:贪心算法

news2024/12/29 10:51:21

文章目录

  • 一、介绍
  • 二、分数背包问题
    • 问题描述
    • 分析
    • 时间复杂度
    • 伪代码
    • 案例
    • 彩蛋
  • 三、活动选择问题
    • 问题描述
    • 分析
    • 伪代码
    • 时间复杂度
    • 拓展:加权活动选择
      • 分析
      • 计算
      • 伪代码
      • 时间复杂度
      • 案例
    • 对比动态规划和贪心算法
  • 四、哈夫曼编码
    • 分类
      • 定长编码
    • 目标
      • 变长码
    • 案例
    • 分析
    • 伪代码
    • 时间复杂度
    • 彩蛋-dangling suffix

一、介绍

对于优化问题,贪心算法总是做出当前看起来最好的选择,并将其添加到当前的子解中
最优子结构:剩余的子问题 P ′ P ' P与原问题 P P P具有相同的形式,且 P ′ P ' P的最优解继承自 P P P
与动态规划不同,动态规划列出所有情况的最优解再进行判断,而贪心算法没有判断,它的最优解基于上一个的最优解,因此必须要决定子问题的最优解。
因此这类问题必须验证每一次求解时最优解就是上一个子问题最优解得出的。
记住不是所有问题都有最优贪心解,需要去证明它

二、分数背包问题

问题描述

大体与0-1背包一样,不一样的地方在于0-1背包中商品是一个整体,而分数背包商品可分,因此不存在填不满的情况。

分析

首先计算每件商品单位重量的价值: p i = v i w i p_i= \frac{v_i}{w_i} pi=wivi f o r   i = 1 , 2 , . . . , n for \space i=1,2,...,n for i=1,2,...,n

因为需要价值最大,因此需要按照单价降序排列,让排序后的项目序列为 1 、 2 、 … 、 i 、 … 、 n 1、2、…、i、…、n 12in,对应的每磅值和权重分别是 p i p_i pi w i w_i wi
设k为当前权值限制,每次迭代,都按照上述排列选择最大价值且未被选择的
    if k ≥ w i k \geq w_i kwi,则 x i x_i xi全部都需要被选择,令 k = k − w i k=k-w_i k=kwi,考虑下一个商品
    if k < w i k < w_i k<wi,则 x i = k w i x_i=\frac{k}{w_i} xi=wik需要被选择,算法终止

时间复杂度

排序最快时间复杂度为 O ( n l o g n ) O(nlogn) O(nlogn),而计算价值只需要一层循环直到k为0为止,因此时间复杂度小于 O ( k ) O(k) O(k),因此整体时间复杂度 T ( n ) = O ( n l o g n ) T(n)=O(nlogn) T(n)=O(nlogn)

伪代码

Fraction-Knapsack(n,v,w,k)
for i ← 1 to n do
	r[i] ← v[i]/w[i]
	x[i] ← 0
end

sort the item in decreasing order

j ← 0
while K>0 and j <= n do
	j ← j+1
	if K>w[j] then
		 x[j] ← 1
		 K ← K-w[j]
	end
	else
		x[j] ← k/w[j]
	end
end
return xi

案例

在这里插入图片描述

彩蛋

0-1背包问题没有贪心解,每次都选择最佳的,最后不一定是最优解

三、活动选择问题

问题描述

有很多活动,每个活动在不同的时间开始或结束,目标是为了参加尽可能多的活动 有很多活动,每个活动在不同的时间开始或结束,目标是为了参加尽可能多的活动 有很多活动,每个活动在不同的时间开始或结束,目标是为了参加尽可能多的活动

在这里插入图片描述
活动时间会有重叠,因此所要做的是选择最多数量的不重叠的活动

分析

每次选择一个,怎么选择可以导致据局部最优,每次选择完毕后,我们需要留更多的时间让剩下的活动有更充足空间,这样选择才是最优的,因此我们每次应该选择最早结束的那个。

一旦做出选择,删除所有不兼容的活动(即与所选活动重叠)

对剩余的活动重复算法

伪代码

Greedy-Activity-Selection(A)
Sort activities in increasing order of finishing time
P ← a1
k ← 1
for i ← 2 to n do
	if s[i]>= f[k] then
		p ← p U ai
		k ← i
	end
end
return P

时间复杂度

只有一个循环,之间复杂度是 O ( n ) O(n) O(n),排序时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn),因此总的时间复杂度 T ( n ) = O ( n l o g n ) T(n)=O(nlogn) T(n)=O(nlogn)
在这里插入图片描述

拓展:加权活动选择

每个活动都增加权重,现在的目标找到相互兼容的活动的最大加权子集 每个活动都增加权重,现在的目标找到相互兼容的活动的最大加权子集 每个活动都增加权重,现在的目标找到相互兼容的活动的最大加权子集

分析

再用上述思路就不行了,有可能某个权重特别高,就不能选择个数多的了。
如下图:

在这里插入图片描述
事实上,涉及到加权的都无法用贪心算法去计算,因为无法验证前一个解是否是最优解。加权最优解我们最常用的解决方法就是动态规划。
设计到状态转移,我们应该指定一个顺序,与无加权的动态规划一样按照结束时间排序。

计算

将活动按照结束时间从小到大排序,记为 a 1 , a 2 . . . a j a_1,a_2...a_j a1,a2...aj

定义 O P T ( j ) OPT(j) OPT(j) a 1 , a 2 . . . a j a_1,a_2...a_j a1,a2...aj这些活动的最大加权值。 P ( j ) P(j) P(j)为最大的 i i i,使得 a i a_i ai a j a_j aj时间活动不重叠。

目标:计算 O P T ( n ) OPT(n) OPT(n)的最大值

边界: O P T ( 0 ) = 0 OPT(0)=0 OPT(0)=0

在这里插入图片描述
p ( j ) p(j) p(j)可以很简单利用二分法去计算。
根据上述分析,列出状态方程
O P T ( j ) = { 0 i f   j = 0 m a x ( O P T ( j − 1 ) , w i + O P T ( p ( j ) ) ) i f   x > 0 OPT(j)=\left\{ \begin{array}{ll} 0 & if \space j=0 \\ max ( OPT(j-1), w_i+OPT(p(j)))& if \space x>0 \nonumber \end{array} \right. OPT(j)={0max(OPT(j1),wi+OPT(p(j)))if j=0if x>0

伪代码

sort and get a1,a2,...,an
compute p[1],p[2],...,p[n]
OPT(0) ← 0
for j =1 to n do
	OPT(j) ← max{OPT(j-1),wj+OPT(p[j])}
end
return OPT(n)

时间复杂度

排序 O ( n l o g n ) O(nlogn) O(nlogn),计算 p ( j ) p(j) p(j)采用二分法 O ( n l o g n ) O(nlogn) O(nlogn),循环 O ( n ) O(n) O(n),因此总体时间复杂度 T ( n ) = O ( n l o g n ) T(n)=O(nlogn) T(n)=O(nlogn)

案例

在这里插入图片描述

对比动态规划和贪心算法

贪心算法从不考虑自己的选择,总是关注现在。

动态规划基于之前的决定,记录历史进行改变。

四、哈夫曼编码

将字符串变成二进制编码形式,但是需要这样一个编码,使得每个消息都是唯一可解码的,这样才能具有唯一可破译性。

分类

定长编码

每个码字都有相同的长度。因为是固定长度,所以肯定是唯一可破译的,不可能会有歧义。

目标

为了让转换为二进制串占有内存最小,我们需要让出现频率高的字符转换的码字长度小

变长码

每个码字有不同的长度。

根据字符串每个字符出现的频率采取不同编码长度,这样使用的Bit位比定长编码效率高。但是变长码可能出现歧义,因此要找到唯一可破译的解决方法。

我们定义前缀自由码:如果一个代码没有一个码字是另一个码字的前缀。每个由前缀自由码编码的消息都是唯一可破译的。
由于没有任何码字是其他码字的前缀,我们总是可以在消息中找到第一个码字,剥离它,并继续解码。

案例

在这里插入图片描述
下图可以看出,叶子节点和字符1-1对应(这样就能保持唯一可解码的)在这里插入图片描述从根节点到叶节点的路径上的二进制字符串是与叶节点上的字符相关联的码字。
叶子 a i a_i ai的深度 d ( a i ) d(a_i) d(ai)等于与该叶子相关的码字的长度 L ( c ( a i ) ) L(c(a_i)) L(c(ai))
哈夫曼编码问题等价于最小加权外路径长度问题:以下公式即求最小加权路径长度
∑ i = 1 n f ( a i ) d ( a i ) = ∑ i = 1 n f ( a i ) L ( c ( a i ) ) \sum_{i=1}^{n} f(a_i)d(a_i)=\sum_{i=1}^{n} f(a_i)L(c(a_i)) i=1nf(ai)d(ai)=i=1nf(ai)L(c(ai))
f ( a i ) 为第 a i 个叶子出现频率 f(a_i)为第a_i个叶子出现频率 f(ai)为第ai个叶子出现频率

分析

从字符串 A 中选出两个频率最小的字符 x , y 。 创建一个以这两个字符作为叶子的子树。 将这个子树的根标记为 z 设频率 f ( z ) = f ( x ) + f ( y ) 去除 x , y 加上 z ,形成一个新的字母 a ′ 。 重复这个过程,称为合并,与新的字母 A ′ ,直到一个字母只剩下一个符号。 生成的树是哈夫曼代码。 给定频率分布的最优 ( 最小代价 ) 前缀码。 从字符串A中选出两个频率最小的字符x, y。\\ 创建一个以这两个字符作为叶子的子树。\\ 将这个子树的根标记为z\\ 设频率f(z) = f(x) + f(y)\\ 去除x,y加上z,形成一个新的字母a'。\\ 重复这个过程,称为合并,与新的字母A ',直到一个字母只剩下一个符号。\\ 生成的树是哈夫曼代码。\\ 给定频率分布的最优(最小代价)前缀码。 从字符串A中选出两个频率最小的字符x,y创建一个以这两个字符作为叶子的子树。将这个子树的根标记为z设频率f(z)=f(x)+f(y)去除xy加上z,形成一个新的字母a重复这个过程,称为合并,与新的字母A,直到一个字母只剩下一个符号。生成的树是哈夫曼代码。给定频率分布的最优(最小代价)前缀码。

伪代码

利用优先队列(堆)去维护树,以频率最为关键字。

Huffman(A)
for i ← 1 to n-1 do
	z ← a new code
	z.left ← Extract-Min(Q);
	z.right ← Extract-Min(Q);
	z.freq ← z.left.freq+z.right.freq;
	Insert(Q,z)
end
return Extract-Min(Q);

时间复杂度

每个优先队列操作(最小堆的更新)需要花费 O ( l o g n ) O(logn) O(logn)时间,循环 n 次 n次 n,因此时间复杂度 T ( n ) = O ( n l o g n ) T(n)=O(nlogn) T(n)=O(nlogn)

彩蛋-dangling suffix

唯一可译码的判决算法实现。(即判断一个编码是否是可译码)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1201811.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ArcGIS Pro二次开发】(75):ArcGIS Pro SDK二次开发中的常见问题及解决方法

ArcGIS Pro SDK二次开发路程也近一年时间了&#xff0c;这里总结一下平时遇到的一些问题和解决方法。有些问题没能解决&#xff0c;也记录下来&#xff0c;提醒自己不要忘记。 一、在VS2022中进行调试弹出错误 正常在VS2022中&#xff0c;如果要调试程序的话&#xff0c;直接按…

【工具】QQ音乐本地下载(亲测可用)

目录 0.环境 1.详细步骤 1&#xff09;电脑端打开QQ音乐&#xff0c;登录 2&#xff09;随便搜一首歌&#xff0c;在界面上按【F12】打开开发者工具界面&#xff0c;点击【播放】 3&#xff09;进入播放界面后&#xff0c;点击【网络】&#xff0c;再点击【媒体】 4&…

职场人实用办公技能 | 数据可视化模板

套用模板&#xff0c;不仅报表做得快&#xff0c;数据可视化效果也足够美观&#xff0c;但有些职场人还不太了解从哪些工具上可获得兼具实用性、美观性的BI数据可视化模板&#xff0c;接下来就来介绍一款可提供大量系统化可视化模板的BI工具——奥威BI工具。 奥威BI工具&#…

idea报错java: 程序包com.alibaba.fastjson不存在,明明存在!

经常从线上拉下来代码后编译运行时会报这个错误。刷新maven也没用&#xff0c;重新导入项目也没用 发现解决方法如下&#xff1a; 找到当前报错文件的路径。找到iml文件 删除它&#xff01;然后刷新maven 就好了&#xff01;&#xff01;&#xff01; 记录一下我的解决方法&…

代码随想录算法训练营第四十八天丨 动态规划part11

123.买卖股票的最佳时机III 思路 这道题目相对 121.买卖股票的最佳时机 (opens new window)和 122.买卖股票的最佳时机II (opens new window)难了不少。 关键在于至多买卖两次&#xff0c;这意味着可以买卖一次&#xff0c;可以买卖两次&#xff0c;也可以不买卖。 接来下我…

YOLO V1中关于bounding boxs的部分要点

YOLO的核心原理预览 YOLO将输入的图片resize成448 x 448&#xff0c;并且为 S x S&#xff08;S 7&#xff09;个grid&#xff0c;如果物体的中心落入该grid中&#xff0c;那么该grid就需要负责检测该物体。一次性输出所检测到的目标信息&#xff0c;包括类别和位置。 对于每一…

聚力未来!云起无垠成为光合组织成员单位

近日&#xff0c;云起无垠正式加入海光产业生态合作组织&#xff08;简称“光合组织”&#xff09;。云起无垠将与光合组织联合打造安全、好用、开放的产品与解决方案&#xff0c;满足企业的安全检测需求&#xff0c;帮助企业解决业务系统上线前的安全检测和修复问题。 图1 光合…

2016Outlook邮箱启动提示找不到文件Outlook.pst

2016Outlook邮箱启动提示找不到文件Outlook.pst 故障现象 Outlook邮箱启动提示找不到文件Outlook.pst 故障截图 故障原因 数据文件损坏 解决方案&#xff1a; 1、开始 –>运行–>输入cmd&#xff0c;或win键R–>输入cmd 2、命令行下&#xff0c;使用cd命令切换到…

vue前端项目配置

目录 背景&#xff1a; 0.参考文档 0.1介绍 | Vue CLI (vuejs.org)&#xff08;官方文档&#xff09; 0.2【vue-cli5 bug】npm run build自动编译两次??? - 掘金 (juejin.cn) 0.3vendor.js文本过大 0.4vue性能优化 0.5启动项目一直是生产环境 0.6process.env&#x…

c++分割路径的字符串,得到 目录 文件名 扩展名

简单的做一个c小代码片的记录 c分割了图片的 路径字符串&#xff0c;得到 目录 文件名 扩展名 #include <iostream> using namespace std;int main() {std::string path "E:\\set1_seg\\32.jpg";//index:"\\"在字符串中的位置int index path.find…

GPT Store上线 OpenAI 的「iPhone时刻」这回真来了

OpenAI首届全球开发者大会上&#xff0c;Sam Altman再次给AI行业扔了一系列重磅炸弹。GPT-4 Turbo、GPT Store和定制化的GPT在大会上发布&#xff0c;OpenAI的生态体系初具雏形。 GPT模型刚升级了不到24小时&#xff0c;高能网友就开始用它的定制化功能创造了各种有趣的应用。…

索引下推(ICP)是什么意思?如何理解?

目录 1. 索引下推概述 2. 索引下推举例 3. ICP 的主要作用 1. 索引下推概述 ICP 全称 Index Condition Pushdown&#xff0c;是MySQL5.6之后的一个新特性&#xff0c;它是一种在存储引擎层使用索引过滤数据的一种优化方式。 2. 索引下推举例 下面是数据库的一张 employee…

AI图像生成模型LCMs: 四个步骤就能快速生成高质量图像的新方法

在最新的AI模型和研究领域&#xff0c;一种名为Latent Consistency Models&#xff08;LCMs&#xff09;的新技术正迅速推动文本到图像人工智能的发展。与传统的Latent Diffusion Models(LDMs)相比&#xff0c;LCMs在生成详细且富有创意的图像方面同样出色&#xff0c;但仅需1-…

关系查询处理和查询优化

关系数据库系统的查询处理 4 个阶段 查询分析查询检查【此时的完整性检查是初步的、静态的检查】查询优化【分为代数优化、物理优化】查询执行 关系数据库系统的查询优化 查询优化的优点不仅在于用户不必考虑如何最好地表达查询以获得较高地效率&#xff0c;而且在于系统可…

酷柚易汛ERP - 其他收支明细表操作指南

1、应用场景 其他收支明细表统计一段时期内其他收入单、其他支出单的收支项目、收入/支出及往来单位信息。 2、主要操作 打开【资金】-【其他收支明细表】&#xff1a;

【毕业论文】基于微信小程序的植物分类实践教学系统的设计与实现

基于微信小程序的植物分类实践教学系统的设计与实现https://download.csdn.net/download/No_Name_Cao_Ni_Mei/88519758 基于微信小程序的植物分类实践教学系统的设计与实现 Design and Implementation of Plant Classification Practical Teaching System based on WeChat Mini…

酷柚易汛ERP- 备份与恢复操作指南

1、应用场景 该界面只有管理员才会显示&#xff0c;对已有数据的账套进行备份与恢复。 2、操作指南 2.1 开始备份 对当前系统内的所有数据进行备份&#xff0c;备份成功后当前数据则保存至当前服务器上&#xff0c;同时也会在列表内新增一条当前操作的备份文件记录 2.2 上传…

利用uni-app 开发的iOS app 发布到App Store全流程

1.0.3 20200927 更新官方对应用审核流程的状态。 注&#xff1a;最新审核后续将同步社区另一篇记录 AppStore 审核被拒原因记录及解决措施 &#xff1a;苹果开发上架常见问题 | appuploader使用教程 1.0.2 20200925 新增首次驳回拒绝邮件解决措施。 1.0.1 20200922 首次…

GaussDB SQL基础语法示例-循环语句

目录 一、前言 二、GaussDB数据库总的循环语句 三、GaussDB中常用循环语句&#xff08;语法 示例&#xff09; 1、LOOP循环语句 2、WHILE … LOOP 循环语句 3、FOR … LOOP循环语句&#xff08;integer变量&#xff09; 4、FORALL循环语句&#xff08;批量查询&#xf…

Vue基于html2canvas和jspdf生成pdf文件,解决jspdf中文乱码及自动换行等问题

在做项目时有这么一个需求&#xff0c;需要将当前页面指定区域的内容导出pdf到本地。借助了两个插件分别是html2canvas.js和pdf.js来实现。使用过程中遇到的问题及解决方法 解决一些问题&#xff1a; 导出按A4纸大小排列预留页面边距的问题内容过多自动分页的问题直接使用jsp…