[英]Time limit exceeded even after doing an upper_bound on the array
使用的语言:C++14。
我得到了 2 个排序的 arrays A 和 B。现在,对于 A 中的每个元素,如果可能的话,我必须在 B 中找到一个更大的元素,并注意一旦我在 B 中为 A 中的特定元素找到了一个元素,我可以仅在 B 中的该索引之前搜索。我正在做这样的事情:
int j=0;
for(i=0;i < A.size();i++)
{
int index = upper_bound(B.begin()+j,B.end(),A[i]) - B.begin();
if(index>=B.size()){
break;
}
else{
cout<<"For A[]"<<A[i]<<" element "<<B[index]<<" is greater "<<"\n";
j = index + 1;
}
}
即使我正在使用upper_bound进行二进制搜索,程序仍然给出了大数组的时间限制(比如大小为1000000)。
我无法弄清楚原因?
PS:我知道这可以在线性时间内使用 2 个指针来完成,但是我想知道为什么我的解决方案失败了。 我是新来的,所以请帮帮我。
首先确保你的upper_bound中的第一个迭代器是<=第二个迭代器,因为对于某些数字,数组B中的最后一个元素可能大于它,所以现在如果你做j = index + 1,它将是等于 B.end(),现在搜索任何更大的元素总是会返回一些大于 B 长度的 integer,这是不可能的。
其次,对于你的问题:
int index = upper_bound(B.begin()+j,B.end(),A[i]) - B.begin();
这条线首先将第一个迭代器移动了'j' 步,而不是在恒定时间内移动,然后应用 upper_bound 将导致时间复杂度为o(n*n*log(n))
n:用于迭代 A
n:用于移动“j”步,在最坏的情况下可以是 n
日志(n):对于上限
这导致更大的 arrays 的时间限制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.