【问题标题】:best algorithm for searching a vector of ints from vector of vector of ints从整数向量的向量中搜索整数向量的最佳算法
【发布时间】:2018-06-15 09:48:21
【问题描述】:

我是算法的新手,我正在尝试找出最好的方法(就内存效率和速度而言)来确定整数向量(样本向量)是否存在于整数向量的向量中(人口向量)。我会用一个例子来说明这个问题。

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 个向量,并为人口向量的所有向量运行一个循环。有没有更好的方法?

【问题讨论】:

  • 您说“总体向量和样本向量中的向量长度不同”,那么在您的示例中它们的长度相同。如何从 8 维向量中获得 6 个 4 维向量?最好向我们展示您正在使用的代码。
  • 所以,我有从'gmsh'-开源网格划分软件获得的 As (8D) 向量。给定 8 个点,这些面(6 个 4D 向量)是通过以某种已知模式连接这些点而形成的。这就是我从 A 获得 6 个向量的方式。所以基本上我的任务归结为找出 B 是否存在于 A 的 6 个向量中的任何一个中。

标签: c++ algorithm vector


【解决方案1】:

在向量中求是线性的。

== 对于 2 个 vector<int> 的重载使用 std::distance 工作,如 here 所述。

因此只需使用惯用的std::find

//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

哈希函数不起作用,因为它们可能会产生冲突,不能保证查找的有效性,除非您仔细检查相等性。这意味着 2 个或更多 4 个整数的向量,如您的示例所示,可能具有相同的哈希值。因此,您可能会通过哈希找到对应关系,但实际向量不同。 (但是,您可以创建一个散列函数,将 4 个整数向量的子域唯一映射到子域的每个元素的唯一散列中。)无论如何,这需要额外的 unordered_map 增加空间复杂度,以及增加插入的复杂性和删除。

Binary search 当您定义一个有效的比较器并保持向量排序时是可能的,但对于向量是不可行的。为了做到这一点,重载<,然后finds会变成对数,但是插入和删除都需要一个find,才能找到添加或删除的位置,然后还可能触发多个元素的大小调整或移位,性能变差.

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

这就是存在其他结构的原因,例如set

【讨论】:

  • @Atterson 它可以(通常)更有效地填充向量,对它们进行排序,然后对它们执行需要排序列表的操作,而不是一直使用std::set。这就是std::sort 存在的原因。
  • 我同意。无论如何,OP 问题要求一个有效的查找,即 O(N)。排序,O(NLogN),在查找之前,现在只有 O(LogN),对于单个查找来说实际上更糟。由于调整大小和移动开销,保持向量排序是不可行的。
  • 谢谢@Attersson。该方法比我原来的方法(逐个元素比较)运行得更快,并且比散列更可靠。
  • 很好,很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 2016-12-23
  • 2015-07-03
  • 2018-10-13
相关资源
最近更新 更多