我想要高效地从单元范围 1:m
中删除一个元素向量x
,然后返回其余元素的向量。
针对 x
的长度比 m
小得多的情况。
以下是我想到的不同方法,
using Distributions
function func1(m, x)
for i in 1:1000
collect(setdiff(1:m, x))
end
end
function func2(m, x)
for i in 1:1000
filter(n -> !(n in x), 1:m)
end
end
function func3(m, x)
dict = Dict(zip(1:m, 1:m))
for i in 1:1000
d = copy(dict)
for n in x
delete!(d, n)
end
collect(keys(d))
end
end
m = 10000
x = sample(1:m, 100)
@time func1(m, x)
@time func2(m, x)
@time func3(m, x)
第三个函数的运行速度大约是第一个和第二个函数的两倍,但结果并没有排序,这对我来说不是致命问题,但如果结果能排序我会更喜欢。
因为我正在从一个单位范围内删除元素,我的直觉告诉我查找(和删除)元素可以实现O(1),因此应该有一个算法可以按比例扩展O(len(x)), 而我似乎得到的是O(m)复杂度。