問題があり、OK-ishソリューションです。私はそこに良い解決策があることを望んでいます。任意のサブ配列内のすべてのアイテムの合計を見つけるのに最適なアルゴリズムは何ですか?
問題
私は約20万の整数の配列を持っています。 2つの指標、i1とi2が与えられた場合、i1とi2の間のすべての要素の合計を計算する必要があります。配列の各整数は1〜4です。例:
a = [1, 3, 2, 4, 3, 2, 4, 1];
subsection_sum(a, 0, 3); // returns 6: (1 + 3 + 2)
この操作は約20万回実行されるため、かなり高速にする必要があります。 forループの単純なカウンタはO(n)であり、非常に遅い。構築後は配列が決して変更されないので、比較的高価な前処理段階を持つことは問題ありません。
私の最善の解決策これまで
このアルゴリズムは、Oで動作(ログn)時間:
第1のパッドゼロで元の配列の長さが2の累乗になるまで。次に、配列を2つの等しい部分に分割し、それぞれの合計を格納します。その後、配列を四半期に分割し、それぞれの合計を格納します。その後8分。配列がセクション2要素の長さに分割されるまでこれを続けます。上記8素子アレイのために、この2つのステップ取る:
halves = [(a[0] + a[1] + a[2] + a[3]), (a[4] + a[5] + a[6] + a[7])]
quarters = [(a[0] + a[1]), (a[2] + a[3]), (a[4] + a[5]), (a[6] + a[7])]
を次に2つの指標が与えられると、時間(ログn)Oでsubsection_sumを動作することが可能です。たとえば、subsection_sum(a、2,7)==四半期[1] +半分[1]です。
完璧な、私はそのような複雑な解決策を考えて、単純なものを逃したとは信じられません!ありがとう。 –
私と同じ解決策ですが、私にそれを打つ! +1 –