非唯一的c++无序交集算法
Non-unique C++ unsorted intersection algorithm
我一直在试图想出一种方法来编写一个有效的算法来执行两个向量/数组的无序交集,但没有运气。我正在使用一个大型的非唯一数组(通常为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型的向量,并为每个值保留你找到的索引向量。
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 基于ELO的团队匹配算法
- C++选择排序算法中的逻辑错误
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- C++A*算法并不总是在路径中具有目标节点
- 排序算法c++
- 递归无序映射
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 算法问题:查找从堆栈中弹出的所有序列
- 下面是排序算法O(n)吗
- c++找不到具有相同哈希的无序集合元素
- KMP算法和LPS表构造的运行时间
- 正在将无序映射设置为无序映射的值
- 智能指针作为无序映射键,并通过引用进行比较
- 为什么我的排序算法会更改数组值
- 选择排序算法生成无序结果
- c++ 算法:搜索"列表"的子集,无序
- 无序多集的hash/crc算法
- 非唯一的c++无序交集算法
- 无序矩阵搜索算法