Unit3:贪心算法

文章目录

  • 一、介绍
  • 二、分数背包问题
    • 问题描述
    • 分析
    • 时间复杂度
    • 伪代码
    • 案例
    • 彩蛋
  • 三、活动选择问题
    • 问题描述
    • 分析
    • 伪代码
    • 时间复杂度
    • 拓展:加权活动选择
      • 分析
      • 计算
      • 伪代码
      • 时间复杂度
      • 案例
    • 对比动态规划和贪心算法
  • 四、哈夫曼编码
    • 分类
      • 定长编码
    • 目标
      • 变长码
    • 案例
    • 分析
    • 伪代码
    • 时间复杂度
    • 彩蛋-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.mfbz.cn/a/138147.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

halcon获取轮廓属性的时候报错:Contour attribute not defined(HALCON错误代码:3261)

报错截图&#xff1a; 在使用以下算子&#xff0c;获取xld的distance属性时&#xff0c;或者其他属性时报错。 get_contour_attrib_xld (ObjectSelected, distance, Attrib) 如果是属性报错。这里需要在调用获取轮廓属性之前先获得轮廓之间的距离。 使用以下算子&#xff1a;…

设置专属链接的这些作用你知道吗?

专属链接作为一种个性化的链接&#xff0c;用于为特定的客户或群体提供定制化的体验或服务。对于企业来说&#xff0c;每个渠道或者每个客户都能拥有一个专属链接是无比便利的事情。企业可以将这个链接嵌入到各种宣传物料中&#xff0c;让客户通过输入链接即可进入与客服的交流…

壁灯外贸出口的UL1598检测标准解析

壁灯是安装在室内墙壁上的辅助照明装饰灯具&#xff0c;一般多配用乳白色的玻璃灯罩。灯泡功率多在15-40瓦左右&#xff0c;光线淡雅和谐&#xff0c;可把环境点缀得优雅、富丽&#xff0c;尤以新婚居室特别适合。壁灯的种类和样式较多&#xff0c;一般常见的吸顶灯、变色壁灯、…

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-超级终端

红队专题 招募六边形战士队员[16]超级终端(1) 招募六边形战士队员 一起学习 代码审计、安全开发、web攻防、逆向等。。。 私信联系 [16]超级终端(1) 服务端 — 本地打开cmd — 接收命令 — 执行 — 发送回显 客户端 — 远端发送命令 — 接收回显 发送开启cmd命令 --- 接受…

vue-组件注册及使用

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容-组件注册及使用 目录 1、组件的注册及使用 2、组件常用属性 2.1、directive 2.2、computed 2.…

GoLong的学习之路,进阶,语法之并发(并发错误处理)补充并发三部曲

这篇文章主要讲的是如何去处理并发的错误。 在Go语言中十分便捷地开启goroutine去并发地执行任务&#xff0c;但是如何有效的处理并发过程中的错误则是一个很棘手的问题。 文章目录 recovererrgroup recover 哦对&#xff0c;似乎没写错误处理的文章。后面补上。 首先&…

低功耗蓝牙技术 > GAP和GATT介绍

GAP&#xff08;Generic Access Profile&#xff09;和GATT&#xff08;Generic Attribute Profile&#xff09;简介 在蓝牙技术的发展中&#xff0c;GAP和GATT两个协议扮演着关键的角色&#xff0c;为BLE&#xff08;低功耗蓝牙&#xff09;设备之间的通信提供了规范和框架。…

IPSec案例部署

项目拓扑与项目求 项目需求 某企业网络使用ospf作为IGP协议实现内部网络的互联互通&#xff0c;区域规划和IP规划如图所示&#xff0c;现在要求实现如下需求&#xff1a; 公司总部和分支之间互访&#xff0c;使用IPSec VPN传递流量&#xff0c;并且对其加密&#xff0c;公司内…

IntellJ IDEA利用spring initializr创建springboot项目

maven仓库修改镜像源 idea会默认从.m2目录下读取maven配置信息&#xff0c;若没有setting.xml则从maven安装目录拷贝一个setting.xml到这里 在xml中添加阿里云镜像源 <mirrors><mirror> <id>nexus-aliyun</id> <name>nexus-aliyu…

鸿蒙原生应用开发-DevEco Studio中HarmonyOS与OpenHarmony项目的切换

一、找到该目录 二、修改操作系统类型 三、分别进行开发&#xff0c;一些常规的应用功能实现后&#xff0c;相互切换后都可以正常运行的。前期OpenHarmony项目如果连接开发板比较困难的化&#xff0c;开发完成后&#xff0c;切换成为HarmonyOS后就可以比较详细地看看效果了。

FNPLicensingService.exe 总提示要联网

目录预览 一、问题描述二、原因分析三、解决方案&#xff1a;四、参考链接 一、问题描述 FNPLicensingService.exe 总提示要联网 找到路径如下&#xff1a; C:\Program Files (x86)\Common Files\Macrovision Shared\FlexNet Publisher然而从文件目录来看&#xff0c;并没有…

智能电网线路阻抗模拟负载的工作原理

智能电网线路阻抗模拟负载是一种用于测试和评估电网线路性能的技术&#xff0c;它的工作原理是通过模拟负载来模拟实际负载对电网的影响&#xff0c;以便评估电网的稳定性和可靠性&#xff0c;智能电网线路阻抗模拟负载通常由电子设备和控制系统组成。电子设备主要包括电阻、电…

OLED透明屏在智慧零售场景的应用

OLED透明屏在智慧零售场景中的应用主要包括以下几个方面&#xff1a; 商品展示&#xff1a;OLED透明屏可以作为商品展示窗口&#xff0c;使得产品可以在玻璃的透明表面上直接呈现展示&#xff0c;同时显示相关的文字和视频广告信息。这种宣传模式可以更加吸引顾客注意力&#…

高性能图表库LightningChart JS v5.0 - 轻松实现图表自定义布局

LightningChart JS是Web上性能最高的图表库具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用&#xff0c;从而实现高刷新率和流畅的动画。 点击获取LightningChart JS v5.0正式版下载 LightningChart JS …

瑞吉外卖Day03

小张推荐:瑞吉外卖Day02 1.启用/禁用员工账号 1.1 思路分析 1.2Controller层 PutMapping()public R<String> update(RequestBody Employee employee, HttpServletRequest request) {log.info(employee.toString());Long emp (Long) request.getSession().getAttribu…

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

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

未来之光:十八数藏的文化数字化新篇章

在时代的浪潮中&#xff0c;十八数藏显现出文化数字化的新时代光芒。这一数字化的新篇章不仅仅是对传统文化的延续&#xff0c;更是一场对未来的引领。通过数字化&#xff0c;十八数藏打开了文化传承的崭新大门&#xff0c;为传统工艺注入了新的生命力。 数字技术为十八数藏带来…

培养财务团队协作,冲破市场经济逆境

在过去&#xff0c;企业财务发展道路上往往只有分析师&#xff0c;财务分析也十分简单&#xff0c;只需要业务上挖掘部分有用数据或做一些简单的“数学题”。这些内容都是由财务分析师来完成的。但随着科技发展、大数据时代的到来&#xff0c;越来越多的企业发现还有许多其他未…

2019年五一杯数学建模A题让标枪飞解题全过程文档及程序

2020年五一杯数学建模 A题 让标枪飞 原题再现 标枪的投掷是一项历史悠久的田径比赛项目。标枪投掷距离的远近受到运动员水平&#xff08;出手速度、出手角、初始攻角、出手高度、出手时标枪的初始俯仰角速度等&#xff09;&#xff0c;标枪的技术参数&#xff08;标枪的长度、…

Electronica Samtec展台连接器Demo回顾 | 224Gbps PAM4:令人瞠目的速率

【摘要/前言】 最近&#xff0c;我们正在为大家带来2023慕尼黑上海电子展虎家展台Demo演示回顾系列。 今天虎家工程师团队再次为大家带来系列第一期&#xff1a; 我们邀请到了合作伙伴Keysight&#xff0c;与我们一同带来了Samtec NovaRay高密度、高性能阵列连接器以及Keysig…
最新文章