贪心算法简要:
- 贪心主要是面向优化问题,采用逐段解决的方式,总是选择当前最优的,从而达到整体最优;
- 常见使用贪心策略的算法:最小生成树、dij最短路、哈夫曼编码;
- 如果一个问题用贪心可以解决,那么用贪心的方式比动态规划的方式更加高效,但贪心未必一直有效,如部分背包可以贪心解决,但是0-1背包就不可以;
- 贪心算法常用来解决很难问题的近似解,如TSP问题,虽然未必是最优解,但是可以得到一个近似解;
活动选择问题:给出一系列活动的开始时间和结束时间,求时间顺序允许下的最大活动数目?
贪心策略:每一步选择剩余活动中结束时间最小的活动,并且开始时间大于等于当前活动的结束时间;
算法步骤:
- 按活动的结束时间进行排序;
- 将第一个活动选上;
- 在活动数组中进行如下循环:如果开始时间大于等于当前活动的结束时间,选之;
def max_act(s,f):
n=len(f)
i=0
print(i)
for j in range(n):
if s[j]>=f[i]:
print(j)
i=j
if __name__=='__main__':
s = [1, 3, 0, 5, 8, 5]
f = [2, 4, 6, 7, 9, 9]
max_act(s,f)
对于活动未有序的,可以构造一个活动的结构体,按其结束时间来排序,然后求解;
贪心算法难在其证明贪心是有效的,本例中,为什么选择有序的结束时间中最小的结束时间就是得到最优解的,这里可以根据解的等价性来证明。
参考链接:https://www.geeksforgeeks.org/activity-selection-problem-greedy-algo-1/