繁体   English   中英

如何尽可能有效地比较两个不同长度的数组?

[英]How do I compare two arrays with different lengths as efficiently as possible?

我正在尝试比较第一个数组的值,看它是否存在于另一个数组中。 我有两个for循环,它适用于较小的数组大小,但是当我增加长度时,要花很长时间进行编译。

bool value_check(int arr1[], int arr2[], int nums)
{
    int  value = 0;
    for(int i = 0; i < nums; i++)
    {
        value = arr1[i];
        for(int j = 0; j < nums; j++)
        {
            if (value == arr2[j])
            {
                return true;
            }
        }
    }
return false;
}

如何尽可能有效地比较两个不同长度的数组?

通常要做的是对数组进行排序。 一旦完成,比较就很快了,因为您可以一起浏览两个数组。

可以在O(n log(n))时间内对数组进行排序,然后比较它们仅需O(n)时间,因此总的来说,您会得到O(n log(n))复杂度。

正如Caleb所说,首先对输入进行排序的渐近速度更快。

这是一些使用std::set_intersection并仍然设法返回的东西。

struct Found{};
struct Finder : std::iterator<std::output_iterator_tag, void, void, void, void> // for brevity
{
    Finder* operator->() { return this; }
    Finder& operator*() { return *this; }
    Finder& operator=(int) { throw Found{}; }
    Finder& operator++() { return *this; }
    Finder& operator++(int) { return *this; }
};

bool any_intersection(std::vector<int> lhs, std::vector<int> rhs)
{    
    std::sort(lhs.begin(), lhs.end());
    std::sort(rhs.begin(), rhs.end());
    try { std::set_intersection(lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), Finder{}); }
    catch (Found &) { return true; }
    return false;
}

如果您不介意使用stl,则无序映射可能会更有效。

将第一个数组插入无序映射,然后遍历第二个数组并查找表以查找匹配项。 返回第一场比赛。

这可以在O(n)中完成

bool value_check(int arr1[], int arr2[], int nums)
{
std::unordered_map<int, int> first;

for (int i = 0; i < nums; i++)
{
    if (!first.count(arr1[i]))
        first[arr1[i]] = 1;
    else
        first[arr1[i]]++;
}

for (int i = 0; i < nums; i++)
{
    if (first.count(arr2[i]) > 0)
    { 
        return true;
    }
}
return false;
}

暂无
暂无

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

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