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

时间:2018-11-08 13:41:15

标签: c++ data-structures

我正在尝试比较第一个数组的值,以查看它是否存在于另一个数组中。我有两个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;
}

3 个答案:

答案 0 :(得分:3)

  

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

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

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

答案 1 :(得分:0)

正如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;
}

答案 2 :(得分:0)

如果您不介意使用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;
}