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

Q1: 区间调度问题

给定 n 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={(starti,endi)1in},找出 S S S 最大的子集 S ′ S' S,使得 S ′ S' S 中的所有区间没有重叠。

解:

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

Q2: 区间着色问题

给定 n 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={(starti,endi)1in},不妨假设这些区间是对教室的预约,问至少需要多少教室才能将 S S S 中的所有区间安排完。

解:

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

Q3:背包问题

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

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

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

Q4:哈夫曼编码

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

Q5:最小化排队总时间

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颹蕭蕭

白嫖?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值