我正在对数组的元素求和并将其存储到字典中。键对应于数组中元素的总和,不包括带 index == key 的元素。我试图将其作为一个班轮。这只是我的代码的简化示例,用于理解我想要做的事情。
代码:
a = [1, 2, 3, 4]
b = [1, 2, 3, 4]
result = [k => sum(b) for k=a]
我尝试使用 deleteat!
sum(deleteat!(b, k))
有时会出现 Bounds错误,所以我想提出更好的想法,但到目前为止没有结果。
感谢。
答案 0 :(得分:2)
上述解决方案,即:
f(a) = [sum([i==j ? zero(eltype(a)) : a[j] for j=1:length(a)]) for i=1:length(a)]
我认为这将是O(n ^ 2),因为它构造了一个长度为a的向量,以便在没有j的元素的情况下求和,并且用这个长度(a)来构造结果向量。
这是我的第一个解决方案(应该是O(n),n =长度(a))
g(a) = let s = sum(a) ; [ s-v for v in a ] end
这是另一种解决方案(也是O(n)),使用数组运算符。
h(v) = fill(sum(v), length(v)) - v
以下是我的基准测试结果,在创建了一个矢量z后:z = rand(1:100000,1000)
正如您所看到的,最快的是我的第一个解决方案,具有明确的数组理解(它比解决方案快约1000倍)先前在评论中给出,因为它是O(n)而不是O(n ^ 2),并且n == 1000。
julia> @benchmark f(z)
================ Benchmark Results ========================
Time per evaluation: 2.59 ms [1.86 ms, 3.32 ms]
Proportion of time in GC: 19.08% [3.56%, 34.59%]
Memory allocated: 7.79 mb
Number of allocations: 3003 allocations
Number of samples: 100
Number of evaluations: 100
Time spent benchmarking: 0.34 s
julia> @benchmark g(z)
================ Benchmark Results ========================
Time per evaluation: 1.77 μs [1.74 μs, 1.79 μs]
Proportion of time in GC: 8.65% [7.34%, 9.95%]
Memory allocated: 7.97 kb
Number of allocations: 3 allocations
Number of samples: 8201
Number of evaluations: 4959001
R² of OLS model: 0.952
Time spent benchmarking: 8.88 s
julia> @benchmark h(z)
================ Benchmark Results ========================
Time per evaluation: 2.98 μs [2.94 μs, 3.03 μs]
Proportion of time in GC: 10.54% [9.05%, 12.02%]
Memory allocated: 15.92 kb
Number of allocations: 5 allocations
Number of samples: 7601
Number of evaluations: 2799801
R² of OLS model: 0.951
Time spent benchmarking: 8.41 s