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