我想使用数组strdup(saisie)
来索引另一个数组rows
的行。最初,x
包含rows
的所有行的索引(并因此排序)。在整个计划中,选择从x
中删除一些索引exclude
。与rows
本身类似,rows
是一个排序数组。
查找exclude
和rows
的设定差异的最佳方法是什么?
我想到了几个不同的选项,但我认为它们的复杂性超过exclude
,其中O(n + m)
是n
的长度,rows
是长度m
。
exclude
此解决方案每次都需要查找new_rows = [r for r in rows if r not in exclude]
因此exclude
复杂度。
O(mn)
这可能需要new_rows = setdiff1d(rows, exclude, assume_unique=True)
,但我不确定。
O(nlogm)
转换为exclude
并运行1.此方法的问题在于它需要额外的内存,但它符合复杂性要求。 答案 0 :(得分:1)
以下是两个O(n + m)选项的概述:
1)heapq.merge
将在线性时间内组合两个排序的序列。当组合序列被排序时,共享索引将彼此相邻。
2)正如您所描述的那样rows
是一个"稀疏范围"我假设rows
的最大值不是太大。因此,您可以分配该大小的数组E
(如果我们不对其进行初始化,则为O(1),即使用np.empty
)。然后使用rows
和exclude
索引到空数组。例如,您撰写E[rows] = 1
E[exclude] = 0
,然后查看E[rows]
并删除E已从rows
更改为1
的{{1}}的所有元素}。
如果两个集合未排序,则选项2也可以使用。