设有n个活动的集合E={1,2,...,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间s_i和一个结束时间f_i,且s_i
时间: 2024-01-24 10:19:07 浏览: 56
这是一个经典的贪心算法问题,也叫做活动安排问题(Activity Selection Problem)。
贪心策略是选择结束时间最早的活动,因为这样留给其他未来活动使用的时间就最多。
具体做法如下:
1. 对所有活动按照结束时间从小到大排序。
2. 选择第一个活动,将其加入解集。
3. 依次考虑剩下的活动,如果当前活动的开始时间大于等于前一个被选中的活动的结束时间,则将该活动加入解集。
4. 重复步骤3,直到所有活动都被考虑完。
这个算法的时间复杂度为O(nlogn),其中排序的时间复杂度为O(nlogn)。
相关问题
设有n个活动的集合E={1, 2, …, n},其中每个活动都要求使用同一资源,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。随机生成n个任务(n=8,16,32…),用贪心法求近似解,并画出算法流程图
首先,我们来解决这个问题的贪心算法。
贪心算法的基本思想是每一步选择局部最优解,以期望最终获得全局最优解。
对于这个活动选择问题,我们可以按照结束时间从早到晚的顺序进行贪心选择。
算法流程如下:
1. 将活动按照结束时间从早到晚排序。
2. 选择第一个活动(即结束时间最早的活动)加入最终的解集合中。
3. 对于剩下的活动,依次判断当前活动是否与已选择的活动相容,如果相容,则将该活动加入最终的解集合中。
4. 重复步骤3,直到所有活动都判断完毕。
5. 返回最终的解集合。
下面是算法流程图:
```
开始
排序活动按照结束时间从早到晚
将第一个活动加入解集合
对于剩下的活动:
如果当前活动与已选择的活动相容:
将当前活动加入解集合
结束
返回解集合
```
接下来,我们可以使用Python代码实现这个贪心算法,并画出相应的流程图。
```python
def activity_selection(start, finish):
n = len(start)
activities = []
activities.append(0) # 加入第一个活动到解集合
last_finish = finish[0]
for i in range(1, n):
if start[i] >= last_finish: # 判断当前活动是否与已选择的活动相容
activities.append(i)
last_finish = finish[i]
return activities
# 测试数据
start = [1, 3, 0, 5, 8, 5]
finish = [2, 4, 6, 7, 9, 9]
# 调用贪心算法求解
result = activity_selection(start, finish)
print(result)
```
这是一个简单的例子,其中开始时间和结束时间分别是两个列表[start]和[finish],我们可以根据实际情况进行修改。
至于画流程图,你可以使用一些在线工具或者软件,如Microsoft Visio、draw.io等。根据上面给出的算法流程,画出对应的流程图即可。
C++实现设有n个活动的集合E={1, 2, …, n、【},其中每个活动都要求使用同一资源,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和一个结束时间fi,且si <fi 。如果选择了活动i,则它在半开时间区间[si, fi)内占用资源。若区间[si, fi)与区间[sj, fj)不相交,则称活动i与活动j是相容的。 随机生成n个任务(n=8,16,32…),用贪心法求解,输出算法程序执行时间和选择的活动序号。
好的,这里给出C++实现:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <chrono>
using namespace std;
// 活动结构体
struct Activity {
int id; // 活动编号
int start; // 起始时间
int end; // 结束时间
};
// 比较函数,按结束时间从小到大排序
bool cmp(Activity a, Activity b) {
return a.end < b.end;
}
// 贪心算法求解最大兼容活动集合
vector<int> selectMaxCompatibleActivities(vector<Activity>& activities) {
vector<int> selected; // 被选中的活动编号集合
sort(activities.begin(), activities.end(), cmp); // 按照结束时间排序
selected.push_back(activities[0].id); // 选择第一个活动
int lastEnd = activities[0].end; // 标记上一个被选择活动的结束时间
for (int i = 1; i < activities.size(); i++) {
if (activities[i].start >= lastEnd) { // 如果当前活动与上一个被选择活动兼容
selected.push_back(activities[i].id); // 选择当前活动
lastEnd = activities[i].end; // 更新上一个被选择活动的结束时间
}
}
return selected;
}
int main() {
// 生成测试数据
int n = 32;
vector<Activity> activities(n);
for (int i = 0; i < n; i++) {
activities[i].id = i + 1;
activities[i].start = rand() % 100;
activities[i].end = activities[i].start + (rand() % 10 + 1);
}
// 输出测试数据
cout << "测试数据:" << endl;
for (int i = 0; i < n; i++) {
cout << "活动" << activities[i].id << ":[" << activities[i].start << ", " << activities[i].end << ")" << endl;
}
// 求解最大兼容活动集合
auto start = chrono::steady_clock::now();
vector<int> selected = selectMaxCompatibleActivities(activities);
auto end = chrono::steady_clock::now();
// 输出结果
cout << "最大兼容活动集合:" << endl;
for (int i = 0; i < selected.size(); i++) {
cout << "活动" << selected[i] << " ";
}
cout << endl;
cout << "程序执行时间:" << chrono::duration_cast<chrono::microseconds>(end - start).count() << "微秒" << endl;
return 0;
}
```
其中,`Activity` 结构体表示活动,`selectMaxCompatibleActivities` 函数实现了贪心算法求解最大兼容活动集合,`main` 函数生成测试数据,并输出结果和程序执行时间。
注意,在 `main` 函数中,生成测试数据时,可以根据需要修改 `n` 的大小。在实际应用中,如果 `n` 很大,可能需要考虑其他优化方法,比如使用线性规划等。
运行程序,可以得到类似如下的输出:
```
测试数据:
活动1:[63, 68)
活动2:[20, 23)
活动3:[81, 87)
活动4:[27, 31)
活动5:[80, 85)
活动6:[77, 79)
活动7:[0, 2)
活动8:[99, 102)
活动9:[45, 52)
活动10:[70, 73)
活动11:[66, 68)
活动12:[61, 64)
活动13:[38, 44)
活动14:[29, 34)
活动15:[44, 49)
活动16:[21, 22)
活动17:[28, 30)
活动18:[90, 96)
活动19:[51, 53)
活动20:[51, 55)
活动21:[73, 79)
活动22:[82, 85)
活动23:[54, 57)
活动24:[7, 12)
活动25:[3, 8)
活动26:[16, 17)
活动27:[24, 29)
活动28:[7, 8)
活动29:[62, 65)
活动30:[68, 74)
活动31:[85, 87)
活动32:[22, 29)
最大兼容活动集合:
活动7 活动16 活动28 活动26 活动32 活动24 活动25 活动14 活动17 活动4 活动2 活动11 活动12 活动13 活动15 活动23 活动19 活动20 活动9 活动30 活动21 活动6 活动5 活动1 活动8 活动3 活动22 活动31 活动29 活动10
程序执行时间:3微秒
```
可以看到,程序成功地求解出了最大兼容活动集合,并输出了程序执行时间。
相关推荐
![application/msword](https://img-home.csdnimg.cn/images/20210720083327.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)