如何有效地比较C ++中的两个向量,其内容无法有意义地排序?
我阅读了很多帖子,但大多数人都在谈论首先对两个向量进行排序然后进行比较 要素。但在我的情况下,我无法以有意义的方式对向量进行排序 帮助比较。这意味着我将不得不进行O(N ^ 2)操作而不是O(N), 我将不得不比较第一个向量中的每个元素,并尝试找到唯一的匹配 在第二个向量中。所以我必须匹配所有元素,如果可以的话 找到每个匹配的唯一匹配,然后向量相等。
有一种有效而简单的方法吗?我是否必须自己编码?
编辑:通过有意义的排序我的意思是一种对它们进行排序的方法,以便以后可以 比较它们的线性方式。
谢谢
答案 0 :(得分:9)
如果元素可以以某种有意义的方式散列,则可以通过使用散列映射获得预期的O(n)
性能:将列表A中的所有元素插入到散列映射中,并为每个元素在列表B中,检查它是否存在于hashmap中。
在C ++中,我相信unordered_map
是标准的hashmap实现(虽然我自己没有使用它)。
答案 1 :(得分:5)
A
的所有元素放入哈希表中,其中元素是键,值是计算元素添加次数的计数器。 [O(n)预期] B
并减少哈希表中每个元素的计数器。 [O(n)预期] = O(n)预期的运行时间。
答案 2 :(得分:1)
没有理由使用地图,因为没有要关联的值,只有键(元素本身)。在这种情况下,您应该考虑使用set
或unordered_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。