如何有效地比较C ++中的两个向量,其内容无法有意义地排序?

时间:2013-06-06 12:36:19

标签: c++

如何有效地比较C ++中的两个向量,其内容无法有意义地排序?

我阅读了很多帖子,但大多数人都在谈论首先对两个向量进行排序然后进行比较 要素。但在我的情况下,我无法以有意义的方式对向量进行排序 帮助比较。这意味着我将不得不进行O(N ^ 2)操作而不是O(N), 我将不得不比较第一个向量中的每个元素,并尝试找到唯一的匹配 在第二个向量中。所以我必须匹配所有元素,如果可以的话 找到每个匹配的唯一匹配,然后向量相等。

有一种有效而简单的方法吗?我是否必须自己编码?

编辑:通过有意义的排序我的意思是一种对它们进行排序的方法,以便以后可以 比较它们的线性方式。

谢谢

4 个答案:

答案 0 :(得分:9)

如果元素可以以某种有意义的方式散列,则可以通过使用散列映射获得预期的O(n)性能:将列表A中的所有元素插入到散列映射中,并为每个元素在列表B中,检查它是否存在于hashmap中。

在C ++中,我相信unordered_map是标准的hashmap实现(虽然我自己没有使用它)。

答案 1 :(得分:5)

  1. 将向量A的所有元素放入哈希表中,其中元素是键,值是计算元素添加次数的计数器。 [O(n)预期]
  2. 迭代向量B并减少哈希表中每个元素的计数器。 [O(n)预期]
  3. 迭代哈希表并检查每个计数器是否为0. [O(n)expected]
  4. = O(n)预期的运行时间。

答案 2 :(得分:1)

没有理由使用地图,因为没有要关联的值,只有键(元素本身)。在这种情况下,您应该考虑使用setunordered_set。将A中的所有元素放入一个新集合中,然后循环遍历B.对于每个元素,if( set.find(element) == set.end() ) return false;

如果您打算对某个任意值对数组进行排序,您可能需要查看C ++ 11的hash,它返回一个size_t。使用它你可以编写一个比较器,它对两个对象进行哈希处理并对它们进行比较,你可以使用std :: sort对它进行O(n log n)排序。

答案 3 :(得分:0)

如果你真的无法对矢量进行排序,你可以试试这个。 C ++大师请自由指出缺陷,明显无法利用STL和其他库,无法理解以前的答案等等:)必要时提前道歉。

有一个int的向量,0..n,称为C.这些int是向量B中每个元素的索引。对于向量A中的每个元素,根据C中的B索引将其与B中的元素进行比较如果你找到一个匹配从C中删除该索引.C现在缩短一个。对于下一个A,你再次根据C中的索引搜索B,这是一个更短的时间,花费更少的时间。如果你运气好的话会很快。

或者你可以建立一个你已经检查过的B指数向量,这样你就可以在下一次循环时忽略那些B&#39。首先保存完整的C。