贪心算法简要:

  • 贪心主要是面向优化问题,采用逐段解决的方式,总是选择当前最优的,从而达到整体最优;
  • 常见使用贪心策略的算法:最小生成树、dij最短路、哈夫曼编码;
  • 如果一个问题用贪心可以解决,那么用贪心的方式比动态规划的方式更加高效,但贪心未必一直有效,如部分背包可以贪心解决,但是0-1背包就不可以;
  • 贪心算法常用来解决很难问题的近似解,如TSP问题,虽然未必是最优解,但是可以得到一个近似解;

 

活动选择问题:给出一系列活动的开始时间和结束时间,求时间顺序允许下的最大活动数目?

贪心策略:每一步选择剩余活动中结束时间最小的活动,并且开始时间大于等于当前活动的结束时间;

 

算法步骤:

  1. 按活动的结束时间进行排序;
  2. 将第一个活动选上;
  3. 在活动数组中进行如下循环:如果开始时间大于等于当前活动的结束时间,选之;

 

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/