作业10 相容问题

1.     问题

设S={1,2,…,n}为活动的集合,si和fi分别为活动i的开始和截止时间,i = 1,2…n。求出一个活动序列,使得这个序列中任意两个活动i,j满足 si=<fj或者sj =< fi(即不相容).

2.     解析

主要使用贪心算法来对问题进行解决,主要策略是把活动按照截止时间从小到大排序,然后从前向后挑选,只要与前面选中的活动相容,就可以把活动选入。

贪心算法反例:把活动按照开始时间从小到大排序,然后从前向后挑选,只要与前面选中的活动相容,就可以把活动选入。

正常贪心:

i

1

2

3

4

5

6

7

8

9

10

Si

3

1

3

3

7

3

1

3

6

8

Fi

4

5

5

6

8

8

9

9

10

10

反例贪心:

i

1

2

3

4

5

6

7

8

9

10

Si

1

1

3

3

3

3

3

6

7

8

Fi

5

9

4

5

6

8

9

10

8

10

由表可以看出反例求出的最大值并不正确

3.     设计

对所有活动进行排序

Sep来存储上次选中的活动的结束时间,初始化为0

For I from 0 to 活动的数量

       如果活动i的开始时间 >= sep

              将活动i选出

              将活动i的结束时间设置为sep

4.     分析

算法主要有两部分组成,选活动与排序,选活动就进行了一次遍历,复杂度为n,排序的复杂度为O(nlogn),因此整体复杂度为O(nlogn)

5.     源码

https://github.com/fanchile/Algorithm

原文地址:https://www.cnblogs.com/Fanchile/p/12803512.html