上記溶液、すなわち:
f(a) = [sum([i==j ? zero(eltype(a)) : a[j] for j=1:length(a)]) for i=1:length(a)]
私はそれがjにおける要素なし合計するために、長さaのベクターを構築し、ないので、それは、O(N^2)になると思います結果ベクトルを構築するためにその長さ(a)回。ここ
は
g(a) = let s = sum(a) ; [ s-v for v in a ] end
(O(n)は、N =長さ(A)であるべきである)、ここで、別の溶液(これもO(n))は、配列演算子を使用している私の最初の溶液です。
h(v) = fill(sum(v), length(v)) - v
ここに私のベンチマーク結果は、あるとベクトルzを作成した後:あなたが見ることができるz = rand(1:100000,1000)
として、最速のが私の最初のソリューションは、それが中に以前に与えられたソリューションに比べて約1000倍高速です(明示的な配列内包し、ありますコメントは、O(n^2)の代わりにO(n)であり、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
すべての要素を追加して不要なものを取り除くのはどうですか?すべての要素の合計が使用する要素と同じであるため、これを複数回実行する場合は、合計を1回だけ行うことで計算を節約できます) –
あなたのようにlutionは良いですが、私の本当の問題には当てはまりません。上のコードは、私が達成したいことを理解するためのものです。私はちょうど実際のコードをここに掲載したくありません。 –
数値の問題以外にも(インデックスkの要素を除いたすべての要素の合計)=(すべての要素の合計) - (インデックスkの要素)(例えば、インデックスkの要素が膨大で、限られた精度の浮動小数点で動作します)。 –