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