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

Q1: 区间调度问题

给定 n n 个区间的集合 S = { ( s t a r t i , e n d i ) 1 i n } S=\{(start_i, end_i)| 1\leq i \leq n\} ,找出 S S 最大的子集 S S' ,使得 S S' 中的所有区间没有重叠。

解:

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

Q2: 区间着色问题

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

解:

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

Q3:背包问题

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

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

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

Q4:哈夫曼编码

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

Q5:最小化排队总时间

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

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

发布了274 篇原创文章 · 获赞 446 · 访问量 42万+

猜你喜欢

转载自blog.csdn.net/itnerd/article/details/103988102