c++ - 事件(开始,完成),1 天的最大事件。c++中的性能问题
问题描述
他们给了我 N 组开始/结束时间 EX:(8:45/12:00)。
在返回 MAX 事件后,一个人可以参与而不会重叠。
(一场在 8:00 结束,一场在 8:00 开始,不重叠)。
我已经为每个事件制作了一个带有开始和结束的基础课程。
之后,我做了一个递归函数来制作“事件链”。
我的解决方案在 N < 100 的情况下完成了它的工作,但是因为 O(n!) [我认为] N>100 我的(非常)旧计算机并没有足够快地给我答案。
class Event{
public:
int hh,mm;
int ehh,emm;
};
int chain(Event* array,int nchain,int index,int N){
int max = nchain;
for(int i = 0;i<N;i++){
if(overlapping(app[index],app[i])){
int tempmax = chain(array,nchain+1,i,N);
if(tempmax > max){
max = tempmax;
}
}
}
return max;
}
bool overlapping(Event a,Event b){
if(a.ehh<b.hh || (a.ehh==b.hh && a.emm<=b.mm) ){
return true;
}
else{
return false;
}
}
解决方案
天真的解决方案可能是 O(2 N ) 但是:
当子集有内部调度冲突时,您似乎有修剪的逻辑,这已经极大地帮助了复杂性。
动态编程可以做得更好。这个问题听起来有很好的支配特性——如果一组 N 事件让你在时间 X 空闲,而另一组给你 N+1 事件并且在时间 X 或之前空闲,前者不需要被进一步考虑。
修剪占主导地位的子集并继续探索最优边界。
另一种观点(导致相同的算法)是考虑到,在包含某个事件 Y 的所有时间表中,在 Y 开始之前做什么的选择和在 Y 结束之后做什么的选择是完全独立的,并且可以分别优化。
我相信,但没有提供证据,您的最终算法将是 O(N 2 )。
推荐阅读
- ruby-on-rails - 如何在 ruby on rails 路由约束中添加百分比
- sql - 如何在不更新数据表的情况下查看程序的执行结果?
- javascript - 无法通过 javascript 设置我的表格的边框
- c# - 将数据集转换为带有嵌套重复 xml 的 xml 字符串,反之亦然
- php - Woocommerce 删除产品标题上的链接并将其替换为链接:外部产品/从属关系> 产品 URL
- php - 在这种情况下如何使用“和”“如果”
- c - 如何通过 makefile 将 lex.yy.c 与 main.c 链接?
- ckeditor5 - 在 downcast 调度程序上更新模型更改视图
- sql - 将逗号添加到单独的电子邮件地址
- c++ - 将 biginteger 二进制字符串 128 位转换为数组 int [4] 时出现问题