非唯一的c++无序交集算法

Non-unique C++ unsorted intersection algorithm

本文关键字:算法 无序 c++ 唯一      更新时间:2023-10-16

我一直在试图想出一种方法来编写一个有效的算法来执行两个向量/数组的无序交集,但没有运气。我正在使用一个大型的非唯一数组(通常为500,000到1,000,000个值)和一个相对较小的唯一数组(可能最多5000个值)。

我已经看到了这里建议的各种方法,包括unordered_sets等技术,但据我所知,如果其中一个数组是非唯一的,这就不起作用了。其次,我不想让输出向量包含两个数组共有的数字,我想让输出向量包含这些公共值相对于更大数组的下标。如果大数组有5个位置等于小数组中的一个值,我就需要这5个下标中的每一个。可能类似于python的in1d函数。

有人有什么想法吗?由于

将唯一的一面放入unordered_set中,逐个遍历非唯一的一面。如果您在unordered_set(unique_side)中发现non_unique_side[i]项,则将i添加到结果中。

假设unordered_set是作为一个散列集实现的,其平摊插入和查找时间为O(1),则该算法的时间复杂度为O(L+S),其中L是较大列表中的项数,S是较小列表中的项数。这是你在交叉路口能达到的最快速度。

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

可以将大数组的值映射为整型。

例如:unordered_map<int,int>

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

然后您只需要遍历较小的值,并检查每个值是否存在于映射中。如果存在,则将映射的int型对象中的项数加到结果向量上。

所以如果你有5个6,地图[6]= 5..因此,只需在结果值中添加5个6的实例。

编辑:

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