【问题标题】:Time limit exceeded even after doing an upper_bound on the array即使在对数组执行了 upper_bound 之后,也超出了时间限制
【发布时间】:2020-08-26 15:11:01
【问题描述】:

使用的语言:C++14。

我得到了 2 个排序数组 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 个指针来完成,但是我想知道为什么我的解决方案失败了。我是新来的,所以请帮帮我。

【问题讨论】:

  • 甚至小于线性时间:如果 A 和 B 已排序,则只能查看 B 的最后一个元素。对于 A 中的每个较小的元素,B 中的这个元素将更大。您可以在 A 上运行二进制搜索:假设 B 中的最后一个元素是 x。找到 A 中小于 x 的最高元素的索引(使用二分查找)。
  • 对不起@Roim,造成混乱。请参阅更新的问题。我只想在我在 B 中找到的元素之前搜索。希望现在它清除了。

标签: c++ sorting stl binary-search


【解决方案1】:

首先确保你的upper_bound中的第一个迭代器是

其次,对于你的问题:

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

log(n) : 对于上限

这会导致较大数组的时间限制。

【讨论】:

  • 好的,谢谢。现在明白了。为这么一件小事花了很多时间。还是谢谢。
  • 没问题的哥们。
  • 除非迭代器不是随机访问增加,否则 j 是单个操作
猜你喜欢
  • 1970-01-01
  • 2021-11-23
  • 2021-07-12
  • 1970-01-01
  • 2020-03-01
  • 2018-02-17
  • 2012-03-17
  • 2022-01-27
  • 1970-01-01
相关资源
最近更新 更多