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

时间:2015-12-02 22:08:39

标签: c++ vector

我寻找一种有效的方法来查看向量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)
     }
   }

}

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

一些建议:

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

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

struct Coordinate {
  int x;
  int y;
}

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

如果你对坐标有一些范围限制,那么xy都适合16位(例如[0,65536)),那么散列是微不足道的(x << 16 | y),而且它更明确的是它具有明确性(具有相同键的两个元素将是相同的元素),这为优化提供了更多空间。

答案 1 :(得分:0)

我的建议:

  1. 对两个向量进行排序 - 采用O(log(N))操作。
  2. 将两个已排序的向量一起迭代并进行比较。如果找到匹配项,则递增两个迭代器。如果它们不匹配,则递增较小的迭代器。这应该采取O(N)操作。
  3. 当其中一个迭代器到达终点时停止。