私には問題があり、OKっぽい解決策があります。私はそこにもっと良い解決策があることを望んでいます。
問題
約200,000個の整数の配列があります。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(log n)時間で機能します。
最初に、元の配列の長さが2の累乗になるまで、元の配列にゼロを埋め込みます。次に、配列を2つの等しい部分に分割し、それぞれの合計を格納します。次に、配列を4分の1に分割し、それぞれの合計を格納します。それから8分の1。配列が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つのインデックスが与えられると、O(log n)時間でsubsection_sumを計算できるようになります。たとえば、subsection_sum(a、2、7)== Quarters [1] +halves[1]です。