Я пытаюсь эффективно удалить вектор элементов x
из диапазона единиц 1:m
, а затем вернуть вектор оставшихся элементов.
Для length(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)
Функция 3 примерно в два раза быстрее, чем функции 1 и 2, однако результат не сортируется, что не является Для меня это нарушает правила, но я бы предпочел, чтобы результат был отсортирован.
Поскольку я удаляю элементы из диапазона единиц, моя интуиция подсказывает мне, что поиск элемента (и удаление) можно выполнить O (1), и, следовательно, должен быть алгоритм, который масштабирует O (len (x)), а не то, что я, кажется, получаю, а это сложность O (m).