14天阅读挑战赛


系列笔记链接

《趣学算法(第2版)》读书笔记 Part 1 :如何高效学习算法

《趣学算法(第2版)》读书笔记 Part 2 :算法入门

《趣学算法(第2版)》读书笔记 Part 3 :贪心算法基础(理论)

《趣学算法(第2版)》读书笔记 Part 4 :贪心算法基础(操作)


贪心算法基础(操作)

对应图书2.2章节内容。

通过本节的学习,掌握最简单的贪心算法求解问题方法。


文章目录

  • 系列笔记链接
  • 贪心算法基础(操作)
    • 最优装载问题
    • 问题分析
    • 算法设计
    • 伪代码解析
    • 算法复杂度分析
    • 补充
  • 大佬营友们的笔记

最优装载问题

在北美洲东南部,有一片神秘的海域,那里碧海蓝天、阳光明媚,这正是传说中海盗最活跃的加勒比海(Caribbean Sea)。
有一天,海盗们截获了一艘装满各种各样古董的货船,每一件古董都价值连城,一旦打碎就失去了它的价值。虽然海盗船足够大,但载重量为 CCC ,每件古董的重量为 wiw_iwi​ ,海盗们该如何把尽可能多数量的宝贝装上海盗船呢?

古董重量清单如下表所示,海盗船的载重量W为30,在不打碎古董且不超出载重量的情况下,怎样才能装入最多的古董呢?

古董重量清单:

重量W[i] 4 10 7 11 3 5 14 2

问题分析

问题要求装载古董的数量尽可能多,而船的载货量是固定的,在载重量有限的情况下,优先把重量小的古董装进去,装的古董最多。
因此,采用重量最小者先装的贪心策略,从局部最优达到全局最优,从而得到最优装载问题的最优解。


算法设计

  1. 把n个古董的重量从小到大(非递减)排序。
    当载重量为定值 CCC 时, wiw_iwi​ 越小时,可装载的古董数量 nnn 越大。只要依次选择最小重量古董,直到不能再装为止。
  2. 按照贪心策略装入古董,直到不能装时达到最优。
    把 nnn 个古董按重量从从小到大(非递减)排序,然后根据贪心策略尽可能多地选出前 iii 个古董,直到不能继续装为止,此时达到最优。

贪心策略是重量最小的古董先装,每次从余下的古董中选择一个重量最小的古董。
如果采用顺序查找法寻找最小值,则 nnn 个元素最多需要比较 nnn 次。
第1次选择时有 nnn 个古董,需要比较 nnn 次;
第2次选择时有 n−1n-1n−1 个古董,需要比较 n−1n-1n−1 次;
…;
第 nnn 次选择时,需要比较 111 次;
总共需要比较 n(n+1)/2n(n+1)/2n(n+1)/2 次,时间复杂度为 O(n2)O(n2)O(n2) 。如果采用快速排序法寻找最小值,也就是先从小到大排序,再按顺序选择,则时间复杂度为 O(nlogn)O(nlogn)O(nlogn) ,相比顺序查找法更优。
在序列没有变化(静态)的情况下,如果需要多次从序列中选择最小值或最大值,那么可以采用先排序的办法,这样效果更好。

  • 对这批古董按重量进行非递减排序,排序后的古董重量清单见下表:
重量W[i] 2 3 4 5 7 10 11 14
  • 按照贪心策略,每次选择重量最小的古董装入海盗船(tmp代表已装入的古董重量,ans代表已装入的古董数量):

    ①选择排序后的第 111 个古董,装入重量tmp=2,没有超出载重量,ans=1
    ②选择排序后的第 222 个古董,装入重量tmp=2+3=5,没有超出载重量,ans=2
    ③选择排序后的第 333 个古董,装入重量tmp=5+4=9,没有超出载重量,ans=3
    ④选择排序后的第 444 个古董,装入重量tmp=9+5=14,没有超出载重量,ans=4
    ⑤选择排序后的第 555 个古董,装入重量tmp=14+7=21,没有超出载重量,ans=5
    ⑥选择排序后的第 666 个古董,装入重量tmp=21+10=31,超出载重量,算法结束。

    由此可以看出,能够装入海盗船的古董最多为ans=5个。


伪代码解析

  1. 选择合适的数据结构
    根据前面的算法设计描述,确定用一维数组存储古董的重量:double w[N];//一维数组存储古董的重量

  2. 利用C++标准库中的排序函数sort,对古董的重量进行从小到大(非递减)排序。

使用sort排序函数需要引入头文件algorithm,语法如下:

#include<algorithm>`

sort 函数的语法描述如下:

sort(begin, end) //参数begin和end用于指定范围,它们分别表示排序数组的首地址和尾地址//sort函数默认执行升序排序

调用 sort 函数,对古董的重量从小到大进行排序:

sort(w, w+n);
  1. 按照贪心策略找出最优解。

伪代码描述如下:

sort(w,w+n); //按古董重量升序排序
double tmp=0.0;
int ans=0; //tmp为已装载到船上的古董重量,ans为已装载的古董个数
for(int i=0;i<n;i++)
{tmp+=w[i];if(tmp<=c)ans++;elsebreak;
}

算法复杂度分析

时间复杂度
首先需要按古董重量排序,调用 sort 函数,其平均时间复杂度为 O(nlogn)O(nlogn)O(nlogn) ,输入和贪心策略求解的两个 for 语句时间复杂度均为 O(n)O(n)O(n) ,因此时间复杂度为 O(n+nlogn)O(n + nlogn)O(n+nlogn) 。

空间复杂度
程序中变量 tmpans 等占用了一些辅助空间,这些辅助空间都是常数阶的,因此空间复杂度为 O(1)O(1)O(1) 。


补充

代码参考

C语言实现

C++语言、python语言实现


大佬营友们的笔记

  1. Mr Robot http://t.csdn.cn/VsSDR
  2. 破晓之翼 http://t.csdn.cn/cPJfr
  3. Lq@@ https://blog.csdn.net/flq18210105507/article/details/127507051?spm=1001.2014.3001.5501
  4. 梦幻精灵_cq http://t.csdn.cn/uLfrx
  5. 随风飘絮 http://t.csdn.cn/88Xl7
  6. 小冷coding http://t.csdn.cn/ex8QJ
  7. Kevin_Opt http://t.csdn.cn/X0Uyy
  8. -北天- http://t.csdn.cn/lumsR
  9. 梦幻精灵_cq http://t.csdn.cn/kNdvS
  10. 随风飘絮 http://t.csdn.cn/7Zty6
  11. Kevin_Opt http://t.csdn.cn/Chkgx

《趣学算法(第2版)》读书笔记 Part 4 :贪心算法基础(操作)相关推荐

  1. C++ Primer 第三版 读书笔记

    1.如果一个变量是在全局定义的,系统会保证给它提供初始化值0.如果变量是局部定义的,或是通过new表达式动态分配的,则系统不会向它提供初始值0 2.一般定义指针最好写成:" string * ...

  2. Linux设备驱动程序 第三版 读书笔记(一)

    Linux设备驱动程序 第三版 读书笔记(一) Bob Zhang 2017.08.25 编写基本的Hello World模块 #include <linux/init.h> #inclu ...

  3. Think in Java第四版 读书笔记10 第16章 数组

    Think in Java第四版 读书笔记10 第16章 数组 数组和容器很像 但他们有一些差别 16.1 数组为什么特殊 数组与容器的区别主要在效率和存储类型 效率:数组是简单的线性序列 使得数组的 ...

  4. Think in Java第四版 读书笔记9第15章 泛型

    Think in Java第四版 读书笔记9第15章 泛型 泛型:适用于很多很多的类型 与其他语言相比 Java的泛型可能有许多局限 但是它还是有很多优点的. 本章介绍java泛型的局限和优势以及ja ...

  5. Java 核心技术卷 II(第 8 版) – 读书笔记 – 第 1 章(下)

    22.一旦获得了一个 Charset,就可以在 Java 的 Unicode 和指定的编码格式之间进行转化,下面以 GBK 和 Unicode 之间做为例子. 从 Unicode 到 GBK: imp ...

  6. 《增强现实:原理、算法与应用》读书笔记(5)运动恢复结构(上)初始化、相机位姿估计、集束调整

    <增强现实:原理.算法与应用>读书笔记(5)运动恢复结构(上)初始化.相机位姿估计.集束调整 运动恢复结构(SfM)是一种从运动的相机拍摄的图像或视频序列中自动地恢复出相机运动轨迹以及场景 ...

  7. 《增强现实:原理、算法与应用》读书笔记(1)基础矩阵、本质矩阵与单应性矩阵

    <增强现实:原理.算法与应用>读书笔记(1) 入坑增强现实,学长让我先把这本书看懂,看了一小半,确实有很多对数学要求挺高的地方,所以打算写个读书笔记,分享一些体会. 第三章:实景的三维结构 ...

  8. 《增强现实:原理、算法与应用》读书笔记(7)稠密深度估计

    <增强现实:原理.算法与应用>读书笔记(7)稠密深度估计 增强现实技术除了要恢复相机参数和场景的稀疏结构,有时候为了更好地处理遮挡关系和合成阴影,还需要恢复出场景的稠密三维结构.因此,稠密 ...

  9. 计算机网络技术读书报告 谢希仁,计算机网络(谢希仁版)读书笔记+

    第 1 章概述--计算机网络(谢希仁版)读书笔记 计算机网络在信息时代的作用: 21 世纪的一些重要特征就是数字化.网络化和信息化,它是一个以网络为核心的信息时代.网络现已成为信息社会的命脉和发展知识 ...

  10. 《增强现实:原理、算法与应用》读书笔记(10)视觉惯性SLAM

    <增强现实:原理.算法与应用>读书笔记(10)视觉惯性SLAM 单目视觉SLAM系统存在一定的局限性,它非常依赖相机的成像质量,在图像质量不佳的时候则难以正常工作.即使图像质量很好,缺乏尺 ...

最新文章

  1. python文本分析的开源工具_重磅开源:TN文本分析语言
  2. 微信公众号(考试系统)出现额外的弹框,导致页面关闭,且不保存记录
  3. 微信小程序入门三:轮播图
  4. 边做边学:《 Inter Planetary File System》简介
  5. sqlalchemy连接mysql数据库_史上超详细的flask_sqlalchemy连接mysql数据库
  6. 详解jdbcTemplate和namedParameterJdbcTemplate
  7. Zephyr下使用TFLite进行语音识别
  8. [ HNOI 2015 ] 亚瑟王
  9. div居中和table居中,jQuery获取下拉列表值
  10. SPSS问卷数据处理步骤
  11. 详解JavaScript的五种继承方式
  12. Android视频列表自动播放功能
  13. TVM: End-to-End Optimization Stack for Deep Learning
  14. 中标麒麟学习笔记0:安装极点五笔输入法
  15. 2021淘宝天猫双11预售抢购什么时候开始及淘宝天猫双十一预售活动入口?
  16. 利用python做微信聊天记录词云分析——记录美好回忆
  17. 云计算开发(二) 分布式计算与分布式系统
  18. android音乐播放器开发 SweetMusicPlayer 加载歌曲列表
  19. RTKLIB中利用Kalman滤波进行伪距单点定位
  20. 寄存器建立时间与保持时间分析

热门文章

  1. HTTP/2:如何提升网络速度?
  2. c语言中getenv的作用,C语言putenv()函数和getenv()函数的使用详解
  3. Reac组件通讯二(兄弟组件传值)
  4. QPixmap设置尺寸
  5. for 循环的三种遍历方式
  6. 网页视频小窗口置顶播放
  7. GitHub 的女装大佬迅速蹿红,太变态了!这是要弯的节奏啊!
  8. android[butterKnife(黄油刀)史诗详细使用方法]
  9. android 强制横屏
  10. 第八十讲:实现气泡短信样式