算法导论复习——CHP16 贪心算法

定义

        每一步都做出当前看来最优的操作。

问题引入——活动选择问题

         问题描述

        活动选择问题就是对给定的包含n个活动的集合S,在已知每个活动开始时间和结束时间的条件下,从中选出最多可兼容活动的子集合,称为最大兼容活动集合。 不失一般性,设活动已经按照结束时间单调递增排序。

        分析

                这个问题具有最优子结构,可以用动态规划,但用贪心复杂度更低。

                实际上,任何一个可以用贪心解决的问题都可以用动态规划解决。 

                这里的贪心策略为:每次都选择能选择的活动中结束时间最早的活动。

        证明贪心正确性:

                感性上,这样做可以为后面留出最多的时间。

                严格证明,只需证明如下定理:

        考虑任意非空子问题S_k,令a_mS_k中结束时间最早的活动,则a_m必在S_k的某个最大兼容活动子集中。

        证明:

                设A_kS_k的一个最大兼容活动子集,A_k中最早结束的活动为a_j

                若a_j = a_m,则成立。

                若a_j \neq a_m,则设A^{'} = A_k-\{a_m\}\cup \{a_j\},由于A_k中活动兼容,有a_m结束时间比A_k中最早的还早,故A^{'}也是S_k的一个兼容活动子集,又|A_k| =|A^{'}|,故A^{'}也是S_k的一个最大兼容活动子集,故a_mS_k的某个最大兼容活动子集中,也成立。

                证毕。

        实现

                自顶向下

                

                自底向上

                

总结——贪心算法的一般步骤 

        1)确定问题的最优子结构; 

        2)将最优化问题转化为这样的形式:每次对其作出选择后,只剩下一个子问题需要求解;

        3)证明作出贪心选择后,剩余的子问题满足:其最优子解与前面的贪心选择组合即可得到原问题的最优解(具有最优子结构)。 

总结——证明贪心算法正确性

        贪心选择性质最优子结构性是两个关键要素。

        贪心选择性质:可以通过做出局部最优(贪心)选择来构造全局最优解的性质。

        贪心选择性质使得我们进行选择时,只需做出当前看起来最优的选择,而不用考虑子问题的解。

例子——Huffman编码

        Huffman算法

                从 |C| 个叶子结点开始,每次选择频率最低的两个结点合并,将得到的新结点加入集合继续合并,这样执行 |C|-1次 “合并” 后即可构造出一棵编码树——Huffman树。

                (采用以freq为关键字的最小优先队列Q,提取两个最低频率的对象将之合并。) 

                时间复杂度分析

                假设Q使用最小二叉堆实现,则:

                首先,Q的初始化时间复杂度O(n)。

                其次,循环的总代价是O(nlgn):for循环共执行了n-1次,每次从堆中找出当前频率最小的两个结点及把合并得到的新结点插入到堆中均花费O(lgn),所以循环的总代价是O(nlgn)。

                总时间复杂度O(nlgn)。 

                正确性证明

                首先,可以发现,一个最优字符编码方案总对应一棵满 (full) 二叉树, 即每个非叶子结点都有两个孩子结点。

                引理1

                令C为一个字母表,其中每个字符 c∈C 都有一个频率 c.freq。 令 x 和 y 是C中频率最低的两个字符。那么存在C的一个最优前缀码,x和y的码字长度相同,且只有最后一个二进制位不同。

 证:        

                令T是一个最优前缀码所对应的编码树,a和b是T中深度最大的兄弟叶结点。 不失一般性,假设 a.freq ≤ b.freq 且 x.freq ≤ y.freq。

                由于x和y是叶结点中频率最低的两个结点,所以应有 x.freq ≤ a.freq 且y.freq ≤ b.freq。

                若 x.freq = b.freq,则有a.freq = b.freq = x.freq = y.freq,此时引理成立。

                若 x.freq ≠ b.freq,即 x≠ b。则在T中交换 x 和 a,生成一棵 新树T’ ;然后再在T’中交换 b和y,生成另一棵新树T” ,那么在T”中x和y是深度最深的两个兄弟结点

                计算代价差:

                

                同理有B(T')\ge B(T'') 

                因此B(T'')\le B(T),又B(T)为最优编码,故B(T'') = B(T)

                即得证:T” 也是最优解,且 x 和 y 是其中深度最大的两个兄弟结点,x和y的码字长度相同,且只有最后一个二进制位不同。

                引理2

                令C为一个给定的字母表,其中每个字符c∈C都有一 个频率c.freq。x和y是C中频率最低的两个字符。

                令C'为C去掉字符x和y,并加入一个新字符z后得到的字母表, 即C' = C - {x, y}∪{z},z.freq= x.freq + y.freq。 令T'为字母表C'的任意一个最优前缀码对应的编码树。

                则有:可以将T'中叶子结点 z 替换为一个以x和y为孩子的内部结点,得到树T,而T表示字母表C的一个最优前缀码。

                由引理1、2可得Huffman算法的正确性。 

        

                 

                

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

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

相关文章

【C++入门】C++内存管理

目录 前言 C/C内存分布 C内存管理方式 1. new和delete操作内置类型 快速了解与使用 2. new和delete操作自定义类型 3. operator new与operator delete 4. operator new [ ] *5.定位new 6. malloc/free和new/delete的区别 总结 前言 C作为一种面向对象的编程语言&#xff…

AI:110-基于深度学习的药物分子结构生成与预测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

Unity ab包如何加密

「ab包」全称为 AssetBundle ,是Unity提供的一种资源存储压缩包。其中储存了游戏的资源,如图片、模型、纹理、音视频、代码等文件。 由于ab包具有灵活储存、支持热更、包体较小且便于管理等优势,已经成为了市面上主流的游戏资源压缩方式。 …

Jmeter(七) - 从入门到精通 - 建立数据库测试计划实战<MySQL数据库>(详解教程)

1.简介 在实际工作中,我们经常会听到数据库的性能和稳定性等等,这些有时候也需要测试工程师去评估和测试,上一篇文章宏哥主要介绍了jmeter连接和创建数据库测试计划的过程,宏哥在文中通过示例和代码非常详细地介绍给大家,希望对各…

【中小型企业网络实战案例 七】配置限速

相关学习文章: 【中小型企业网络实战案例 一】规划、需求和基本配置 【中小型企业网络实战案例 二】配置网络互连互通【中小型企业网络实战案例 三】配置DHCP动态分配地址 【中小型企业网络实战案例 四】配置OSPF动态路由协议【中小型企业网络实战案例 五】配置可…

51单片机(STC8)-- GPIO输入输出

文章目录 I/O口相关寄存器端口数据寄存器端口模式配置寄存器(PxM0,PxM1)端口上拉电阻控制寄存器(PxPU)关于I/O的注意事项 配置I/O口I/O设置demoI/O端口模式LED控制(I/O输出)按键检测(I/O输入) S…

【模拟量采集1.2】电阻信号采集

【模拟量采集1.2】电阻信号采集 1 怎么测?2 测输入电阻电压即转为测模拟电压值,这里需要考虑选用怎样的辅助电阻?3 实际电路分析3.1 在不考虑 VCC-5V 电压的纹波等情况时(理想化此时输入的 VCC 就是稳定的 5V)3.2 若考…

拖拽式工作流好用吗?有何特点?

大家都知道,随着行业的进步和发展,低代码技术平台也迎来了蓬勃发展期。很多企业喜欢使用低代码实现提质增效的办公效果,拖拽式工作流是其中一个功能,是助力企业实现流程化办公的得力助手。那么,拖拽式工作流好用吗&…

robots.txt

####什么是robots.txt? ​ robots.txt是一个协议,我们可以把它理解为一个网站的"管家",它会告诉搜索引擎哪些页面可以访问,哪些页面不能访问。也可以规定哪些搜索引擎可以访问我们的网站而哪些搜索引擎不能爬取我们网站的信息等等,是网站管理者指定的"君子协议…

FMQL BOOT.bin固化文件生成及固化流程记录

FMQL BOOT.bin固化文件生成及固化流程记录 一、概述 此篇记录上海复旦微JFMQL15T开发板 烧录固化文件BOOT.bin生成及固化操作流程。 以上一篇文章FQML_AXI_GPIO工程构建调试记录 中的工程为基础,做更改。 二、vivado工程配置 2.1新建工程 打开FQML_AXI_GPIO工程…

Unity | Shader基础知识番外(向量数学知识速成)

目录 一、向量定义 二、计算向量 三、向量的加法(连续行走) 四、向量的长度 五、单位向量 六、向量的点积 1 计算 2 作用 七、向量的叉乘 1 承上启下 2 叉乘结论 3 叉乘的计算(这里看不懂就百度叉乘计算) 八、欢迎收…

视频号小店全新赛道,新手如何入驻?

我是电商珠珠 视频号小店为视频号团队所研发。距今为止也才发展了一年时间,在23年下半年掀起了不小的浪花。 我做视频号小店也有一年时间了,在他刚开始三个月的时候,就开始带着团队一起做。到现在也拥有了自己的视频号小店运营团队&#xf…

数模学习day06-主成分分析

主成分分析(Principal Component Analysis,PCA)主成分分析是一种降维算法,它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关,其能反映出原始数据的大部分信息。一般来说当研究的问题涉及到…

P5534 【XR-3】等差数列————C++、C

目录 【XR-3】等差数列题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 解题思路Code运行结果 【XR-3】等差数列 题目描述 小 X 给了你一个等差数列的前两项以及项数,请你求出这个等差数列各项之和。 等差数列&#…

JavaWeb——后端之Mybatis

四、Mybatis 概念: Mybatis是一款持久层(Dao层)框架,用于简化JDBC(Sun操作数据库的规范,较繁琐)的开发 历史: Apache的一个开源项目iBatis,2010年由apache迁移到了goog…

Spring见解

1.Spring概述 1.1.Spring介绍 Spring是轻量级Java EE应用开源框架(官网: http://spring.io/ ),它由Rod Johnson创为了解决企业级编程开发的复杂性而创建 1.2.简化应用开发体现在哪些方面? IOC 解决传统Web开发中硬编…

【MATLAB】EEMD_LSTM神经网络时序预测算法

有意向获取代码,请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 EEMD-LSTM神经网络时序预测算法是一种结合了扩展经验模态分解(EEMD)和长短期记忆神经网络(LSTM)的时间序列预测方法。 EEMD是一种改进的EM…

spring见解2基于注解的IOC配置

3.基于注解的IOC配置 学习基于注解的IOC配置&#xff0c;大家脑海里首先得有一个认知&#xff0c;即注解配置和xml配置要实现的功能都是一样的&#xff0c;都是要降低程序间的耦合。只是配置的形式不一样。 3.1.创建工程 3.1.1.pom.xml <?xml version"1.0" en…

《论文阅读》基于情绪-原因转换图的共情回复生成

《论文阅读》基于情绪-原因转换图的共情回复生成 前言摘要模型架构图构建回复概念预测回复生成前言 今天为大家带来的是《EMPATHETIC RESPONSE GENERATION VIA EMOTION CAUSE TRANSITION GRAPH》 出版: 时间:2023.2.23 类型:共情对话生成 关键词:图网络;共情回复;情绪…
最新文章