繁体   English   中英

在没有线性搜索的情况下,在非常大的数组中找到比给定数字小的数字

[英]finding a smaller number than a given number in a very large array without linear search

我想找到一个小于或等于给定数字的数字的最后一次出现。 由于整数向量非常大,因此O(n)效率不高。

我将向量分为两部分并进行并行搜索。

让我们以一个例子来理解:

vector <int> arr = {1, 8, 7, 1, 2, 9, 5, 7, 4 ,6};

我想找到一个小于或等于2的数字的最后一次出现,因此将数组分为两个部分:

{1, 8, 7, 1, 2} and {9, 5, 7, 4, 6}

并从两个数组的末尾开始搜索。

如我们所见,一个小于或等于2的数字位于位置5(索引4),但是它可能在大于5的任何位置,因此我们仍然必须完全搜索第二个数组,因为我们的目标是找到最大的元素指数。

我想问问是否有stl函数在第二个数组中找到小于2的数字,这样我就没有完全搜索第二个数组。

我可以使用std :: find在第二个数组中找到一个小于2的数字吗?

编辑:小于或等于2的数字位于位置5(索引4),但是它可能在大于5的任何位置,因此我们在第一个数组中的位置5处停止,但继续搜索第二个数组。 假设我们在位置7(索引6)处获得元素1,因为7> 5,所以我们只返回位置7,程序结束。 这使我们不必完全搜索第一个数组。

由于我们从向量开始,因此如果从头到尾进行搜索,则势必会检查每个元素。

但是,如果我们从头到尾进行搜索,则只要满足该谓词,我们就可以停止。 这使得算法的最坏情况为O(N)和最佳情况为O(1)。

#include <vector>
#include <algorithm>
#include <iostream>


int main()
{
    auto arr = std::vector <int>{ 1, 8, 7, 1, 2, 9, 5, 7, 4 ,6 };

    auto less_than_three = [](auto&& x) { return x < 3; };

    auto rpos = std::find_if(rbegin(arr), rend(arr), less_than_three);

    if (rpos == rend(arr))
    {
        std::cout << "not found\n";
    }
    else
    {
        auto pos = prev(rpos.base());
        auto index = distance(begin(arr), pos);
        std::cout << "found at position " << index << "\n";
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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