[算法导论读书笔记]活动选择问题

原创 2012年03月29日 20:18:35

问题定义:

    活动选择问题就是要选择出一个由相互兼容的问题组成的最大子集合。

活动编号:1    2    3    4    5    6    7        8        9        10        11  

开始时间:1    3    0    5    3    5    6        8        8        2         12 
完成时间:4    5    6    7    8    9   10       11      12     13       14

    对于上面这个例子来说,子集{3, 9, 11}由相互兼容的活动组成,然而他们不是最大的子集,子集{1, 4, 8, 11}更大。事实上{1, 4, 8, 11} 是一个最大的相互兼容的活动子集{2, 4, 9, 11}是另一个最大子集。

算法思想:

    活动的选择采用一种“贪婪的”选择方法,即:每次选择最早结束的活动加入到集合中,为后面的活动剩下的待调度任务留下尽可能多的机会,这就是传说中的贪心算法。

伪代码:


代码示例:

#include <iostream>
#include <vector>
using namespace std;

vector<int> v;
void GreddyActivitySelector(int s[], int f[], int n)
{
	int i, m;
	i = 0;//f[i] is the last time of actiom 
	v.push_back( i + 1);

	for( m = 1; m < n; m++)
	{
		if( s[m] >= f[i])
		{
			v.push_back( m + 1 );
			i = m;
		}
	}	
}
int main(int argc, char* argv[])
{
	int s[] = {1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12};
	int f[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
	GreddyActivitySelector(s, f, sizeof(s)/sizeof(s[0]));
	for(vector<int>::iterator i = v.begin(); i != v.end(); i++)
	{
		cout << "a"<< *i << "\t";
	}
	cout <<"\nv.size() = " << v.size() << endl;
	return 0;
}


算法导论读书笔记之钢条切割问题

给定一段长度为n英寸的钢条和一个价格表 pi (i=1,2, …,n),求切割钢条的方案,使得销售收益rn最大。注意,如果长度为n英寸的钢条价格pn足够大,最优解可能就是完全不需要切割。 若钢条的长度...

字符串匹配问题 ---- 算法导论读书笔记

字符串匹配是一个很常见的问题,可以扩展为模式的识别,解决字符串问题的思想被广泛地应用。介绍四种解决该问题的办法,包括:最朴素的遍历法,Rabin-Karp算法,自动机机匹配,Knuth-Morris-...

算法导论 读书笔记

  • 2015年02月05日 16:13
  • 325KB
  • 下载

《算法导论》读书笔记--顺序量选择

在一个由n个元素组成的集合中,第i个顺序统计量是该集合中第i小的元素。 求数组A[p..r]的第i个顺序量: RADOMIZED_SELECT(A,p,r,i) 1 if p == ...

算法导论系列读书笔记之二

  • 2008年05月24日 23:01
  • 843KB
  • 下载

算法导论系列读书笔记之四

  • 2008年06月17日 02:23
  • 597KB
  • 下载

《算法导论》笔记 第16章 16.1 活动选择问题

【笔记】
  • cyendra
  • cyendra
  • 2014年04月28日 14:28
  • 884

算法导论系列读书笔记之六

  • 2008年07月01日 22:52
  • 518KB
  • 下载

算法导论系列读书笔记之五

  • 2008年06月19日 18:25
  • 254KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[算法导论读书笔记]活动选择问题
举报原因:
原因补充:

(最多只允许输入30个字)