非唯一C ++未分类交集算法

时间:2011-12-20 20:45:08

标签: c++ intersection

我一直试图想出一种方法来编写一个有效的算法,在两个矢量/数组上执行未分类的交集,但没有运气。我正在处理一个非常大的非唯一数组(通常为500,000到1,000,000个值),以及一个相对较小(最多可能是5000个值)的唯一数组。

我已经看到了这里提出的各种方法,涉及unordered_sets等技术,但据我了解,如果其中一个数组是非唯一的,则这不起作用。其次,我不希望输出向量包含两个数组共有的数字,而是希望输出向量包含相对于较大数组的那些公共值的索引。因此,如果较大的数组有5个位置等于较小数组中的一个值,我需要这5个索引中的每一个。也许类似于python的in1d函数。

有人有什么想法吗?感谢

3 个答案:

答案 0 :(得分:3)

将唯一的一面放入unordered_set,然后逐个浏览非唯一的一面。如果您在non_unique_side[i]的{​​{1}}找到商品,请在结果中添加unordered_set(unique_side)

假设i被实现为具有unordered_set分摊的插入和查找时间的哈希集,此算​​法会使您O(1)时间复杂,其中O(L+S)是较大列表中的项目,L是较小集合中的项目数。这和你可以做的交叉一样快。

答案 1 :(得分:1)

创建另一个包含大数组中所有索引的向量。然后使用使用一个间接级别的谓词对索引进行排序,并对唯一数组执行相同操作或对其进行排序。然后使用允许一个间接级别的比较来执行正常的有序交集,并将索引从映射向量放入最终结果。

答案 2 :(得分:0)

您可以将大数组从其值映射到int。

例如:unordered_map<int,int>

当您映射较大的数组时,只需增加您找到的每个项目的值

然后你只需要查看较小的值,并为每个值检查它是否存在于地图中。如果存在,则将映射的int中的项目数添加到结果向量中。

所以如果你有5个六,那么map [6] = 5 ..所以只需要在结果值中加上5个6的实例。

编辑:

如果你想要索引,你可以映射到int的向量,并为每个值保留你找到的索引向量。