如果向量a包含与向量b相同的元素,我如何有效地检查
How can I efficiently check, if vector a contains same elements than vector b
我寻找一种有效的方法来查看向量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
或比较元素的自定义循环。
如果你对坐标有一些范围限制,使得x
和y
都适合16位(例如[0,65536)
),那么哈希是琐碎的(x << 16 | y
),更好的是它是明确的(具有相同密钥的两个元素将是相同的元素),这为优化提供了更大的空间。
我的建议:
- 对这两个向量进行排序-这需要O(log(N))运算
- 将两个已排序的向量一起迭代并进行比较。如果找到匹配项,请递增两个迭代器。如果它们不匹配,则递增较少的迭代器。这应该需要O(N)运算
- 当其中一个迭代器到达末尾时停止
相关文章:
- C++有效地找到向量中第一个最接近的匹配值?
- 如何有效地操作满足给定谓词的向量中的所有项目?
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 如何有效地实现将向量的数据分配给多个变量?
- 如何在C++中有效地将数组移动到向量
- 如何有效地用第二个值对向量对进行分组
- 如何在 CUDA 中(有效地)将大量向量相互比较
- 如何使用C++有效地合并排序与向量
- 如何有效地规范化向量C++
- 为什么优先级队列是使用堆实现的,而我们可以更有效地使用向量来实现它
- 如何有效地对__m256i向量的字节进行重新排序(将int32_t转换为uint8_t)?
- 如何更有效地从向量或集合中擦除元素?
- 有效地将列/行插入到就地存储在行/列主向量的矩阵中
- 如何有效地传递 std::vector<cv::P oint3f> 的子向量作为参数(不拥有函数)
- 我如何有效地确定两个平行向量的比例因子
- 将一个STL向量有效地分配给另一个STL矢量(WSL问题)
- 如何有效地从文件一行又一行地读取数据(相同类型)到多个向量(vectros的向量)
- 如何有效地用向量填充结构
- 有效地将文件中的模式存储在向量中
- c++向量有效地添加元素