从向量向量中搜索int向量的最佳算法

时间:2018-06-15 09:48:21

标签: c++ algorithm vector

我是算法的新手,我试图找出最好的(在内存效率和速度方面)方法,以找出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个向量,并为所有向量的种群向量运行循环。有没有更好的方法呢?

1 个答案:

答案 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,然后发现将变为对数,但插入和删除需要找到每个,找到添加或删除的位置,然后还可能触发调整大小或移动多个元素,表现恶化。

矢量的重点是它们没有排序。

这就是为什么存在其他结构,例如<