如果向量a包含与向量b相同的元素,我如何有效地检查

How can I efficiently check, if vector a contains same elements than vector b

本文关键字:向量 有效地 检查 元素 包含 如果      更新时间:2023-10-16

我寻找一种有效的方法来查看向量A是否包含与向量B相同的元素。两个向量都有不同的大小,每个元素都是另一个包含两个元素(x和y坐标)的向量。我需要向量A中相等元素的位置。目前我正在使用for循环,但向量b最多可以有8000个元素,我的程序目前非常慢。我读过关于算法库的文章,但我找不到对我有帮助的东西,或者我不理解它

std::vector<std::vector<int>> VecA; 
std::vector<std::vector<int>> VecB; //size of VecB >> VecA
for( int i = 0; i < VecA; i++)
{
   for( int z = 0; z < VecB; z++)
   {
     if (VecA.at(i) == VecB.at(z))
     {
       Do Something with VecA.at(i)
     }
   }
}

谢谢你的帮助。

一些建议:

  • 不要对一对值使用std::vector<int>,请使用std::pair<int,int>或自定义结构
  • 如果您想快速检查一个集合是否包含来自另一个集合的元素,但包含不同的数据结构(例如std::unordered_set<Coordinate>),请不要使用std::vector

有了std::unordered_set<Coordinate>,一切都会更有效率。假设:

struct Coordinate {
  int x;
  int y;
}

现在提供一个自定义std::hash<Coordinate>专门化,它从Coordinate对象创建一个size_t,并使用std::set_intersection或比较元素的自定义循环。

如果你对坐标有一些范围限制,使得xy都适合16位(例如[0,65536)),那么哈希是琐碎的(x << 16 | y),更好的是它是明确的(具有相同密钥的两个元素将是相同的元素),这为优化提供了更大的空间。

我的建议:

  1. 对这两个向量进行排序-这需要O(log(N))运算
  2. 将两个已排序的向量一起迭代并进行比较。如果找到匹配项,请递增两个迭代器。如果它们不匹配,则递增较少的迭代器。这应该需要O(N)运算
  3. 当其中一个迭代器到达末尾时停止