繁体   English   中英

即使在对数组执行了 upper_bound 之后,也超出了时间限制

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM