コーディング面接の文脈でも有効なものとしての認識が広まってきています。登竜門といわれる水色を目指すにあたって多くの方が「勉強した」と報告している代表的なアルゴリズム的手法の一つに累積和があります。今回はそんな累積和をストレスなく機械的に書けるようになることを目標とします。添字の扱い方など、頭がゴッチャになりがちである応用範囲が非常に広いということから、整理する価値の高い手法です。僕自身、累積和を用いる問題に対して、毎回添字の扱いに神経を尖らせながら頑張っていたのですが、一度実装テンプレートを決め込んでしまえば何も考えなくても書けるようになりました。なってからは累積和を実装することにストレスが無くなりました。そんな体験を共有できたらと思います。累積和でできること累積和とは、一言で言えば適切な前処理をしておくことで、配列上の区間の総和を求めるクエリを爆速で処理できるようになる手法です。世の中には「データから所望の範囲に関する合計値を出力させるクエリ」が何度も何度も飛んで来る場面に溢れています。ページまでの間に「アルゴリズム」という単語が何回登場したのかを教えて欲しいといったクエリが大量に飛んで来る場面が挙げられます。配列があって、下図のように「配列中の範囲が指定されて、その範囲にある値の総和を知りたい」というクエリが大量に飛んで来る場面を考えます。程度を想定しています1。ナイーブには範囲の合計を素直に計算すればクエリに答えることができます。a[i];}とすれば合計値を求めることができます。比例する時間がかかってしまいます。計算時間がかかってしまいます。時間かけてようやく終わるかどうかです。通り2の合計値をすべて記憶しておけば、それを毎回答えるだけでよいのでは...という発想でしょう。記憶容量を必要とするので現実的ではないでしょう。前処理計算にも多くの時間を要します3。爆速で答えることができるという筋の良い方法があります。それが累積和手法です。$O(1)$大量のクエリ処理が重要となる場面では、この中では累積和一択でしょう。累積和とは累積和に関するまとめです。累積和とは何か「累積和は何か」については、すごく簡単です。高校数学の「数列と数学的帰納法」といった単元でも出て来るやつです。a_{N-1}$です。配列サイズが大きくなっています。計算できることがわかります。a_{12}$となっています。(開区間)としていました。各種コンテナなどでも採用されている一般的な定義方法になっています。a+7);という感じです。「配列の両端や隙間のうちのどこを表しているか」と考えればわかりやすいです。このような捉え方をしたとき、累積和の考え方は大変明快です。個分の総和)を表しています。総和が求められることが大変明快です。0$というのにぎょっとした方は多いかもしれません。これについて補足してみます。総和を意味するものであって欲しいです。