python 数据结构与算法——贪心算法

Q1: 区间调度问题

给定 nn 个区间的集合 S={(starti,endi)1in}S=\{(start_i, end_i)| 1\leq i \leq n\},找出 SS 最大的子集 SS',使得 SS' 中的所有区间没有重叠。

解:

  • 按每个区间的右端从小到大排序
  • 选择右端最小(最先结束)的那个区间加入集合SS'
  • 按排序结果依次遍历,如果当前区间的左端大于上一个被选区间的右端,则将当前区间加入SS',否则跳到下一个

Q2: 区间着色问题

给定 nn 个区间的集合 S={(starti,endi)1in}S=\{(start_i, end_i)| 1\leq i \leq n\},不妨假设这些区间是对教室的预约,问至少需要多少教室才能将 SS 中的所有区间安排完。

解:

  • 将所有区间的左端从小到大排序
  • 给最早的预约开一个教室
  • 如果下一个预约和所有教室已经安排的区间重叠,就开一个新教室,否则把这个预约安排在没有区间重叠的任意教室即可。

Q3:背包问题

你想把 n 件物品放入你的背包,它们分别重 s1, s2, …, sn,它们的价值分别为 v1, v2, …, vn, 当你只能背起重量为 C 的总量时,如何最大化背包内的价值?你可以假装是个小偷。

解:
先求出每件物品的价值密度,然后依次装入剩下物品中价值密度最大的那个。

需要注意,贪心法不是背包问题的最优解!

Q4:哈夫曼编码

huffman 编码问题的解决方法可以视为 贪心法,每次优先合并频数最小的两个根节点,最终使得频数大的叶子节点的深度小(编码短),频数小的叶子深度大(编码长)

Q5:最小化排队总时间

有 n 个人在排队看病,医生给每个人处理的时间不同,按什么顺序可以使所有人的排队的总时间最短?每个人排队的时间等于前面所有人看病时间的总和。

这和哈夫曼编码问题类似,只有先处理耗时短的才能使总时间最小,因为除此之外任意调换两个人的顺序都会是总时间变长。

发布了273 篇原创文章 · 获赞 445 · 访问量 42万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 终极编程指南 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览