我是算法的新手,我试图找出最好的(在内存效率和速度方面)方法,以找出int的向量(样本向量)是否存在于向量的向量中(人口矢量)。我将用一个例子说明问题。
A = {1,2,3,4,5,6,7,8},这些是立方体的顶点。 可以由它形成的六个面是{1,2,3,4},{5,6,7,8},{1,2,6,5},{2,3,7,6}, {3,4,8,7} {4,1,8,5}
现在B = {3,4,8,7}。所以我必须找到B是否存在人口向量的多少A个向量? (人口向量由几个As组成。)
我正在使用哈希函数,比较它的B值和A的6个向量,并为所有向量的种群向量运行循环。有没有更好的方法呢?
答案 0 :(得分:1)
在向量中查找是线性的。
2 ==
的{{1}}重载按照std::distance的解释使用here。
因此,只需使用惯用语std::find
即可vector<int>
散列函数不起作用,因为它们可能会产生冲突,不能保证查找的有效性,除非您仔细检查相等性。这意味着2个或更多4个int的向量(如您的示例中)可以具有相同的哈希值。因此,您可以通过哈希找到对应关系,但实际向量不同。 (但是,您可以创建一个散列函数,将4个整数向量的子域明确地映射到子域的每个元素的唯一散列。)无论如何,这需要额外增加//vvint is the vector of vector of ints, vint is the vector of ints to be found
auto it = find (vvint.begin(), vvint.end(), vint);
if (it != vvint.end())
//found
else
//not found
空间复杂度,以及增加复杂性插入和删除。
Binary search是可能的。为了做到这一点,重载unordered_map
,然后发现将变为对数,但插入和删除需要找到每个,找到添加或删除的位置,然后还可能触发调整大小或移动多个元素,表现恶化。
矢量的重点是它们没有排序。
这就是为什么存在其他结构,例如<