【要約】Python 累積和入門 その4 [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
開発者が2Dグリッドの特定領域の合計値を求める際、計算量が爆発する問題について記述する。
- ・対象: $H imes W$ のグリッドに対し $Q$ 回のクエリが発生する場面。
- ・課題: 愚直なループでは、1回のクエリで最大 $H imes W$ 個のマスを走査する。
- ・リスク: $H=1000, W=1000, Q=10^5$ の場合、計算回数は $10^{11}$ 回に達する。
- ・結果: 実行時間制限超過(TLE)を招き、リアルタイム処理が不可能になる。
// Approach
計算量を削減するため、包除原理を用いた二次元累積和と、差分を利用した二次元いもす法を採用する。
- ・累積和の構築: $S[i+1][j+1] = S[i][j+1] + S[i+1][j] - S[i][j] + A[i][j]$ で事前計算する。
- ・領域和の取得: 包除原理を用い、任意の長方形領域を $O(1)$ で算出する。
- ・二次元いもす法: 4箇所の差分を記録し、行・列方向の2段階累積和で領域加算を行う。
- ・実装の工夫: 配列外参照を防ぐため、サイズを $(H+1) imes (W+1)$ とし、0行目と0列目を0で埋める。
// Result
本手法の導入により、大規模なデータセットに対しても極めて高速なクエリ応答が可能となる。
- ・計算量の改善: 愚直な $O(HWQ)$ から、構築 $O(HW)$、クエリ $O(1)$ へ削減。
- ・定量的効果: $10^{11}$ 回の計算を回避し、実用的な時間内での処理を実現する。
- ・適用範囲: ゲームエンジンや画像処理、地理情報システムなどの広範な分野で活用できる。
Senior Engineer Insight
> 実戦投入の観点から、本手法は極めて高いスケーラビリティを持つと評価できる。
- ・計算効率: クエリ $O(1)$ は、高頻度なデータ参照において決定的な差を生む。
- ・運用リスク: 0-indexedと1-indexedの混同は、境界条件のバグを誘発しやすい。
- ・リソース管理: $O(HW)$ の追加メモリが必要なため、メモリ制約とのトレードオフを考慮せよ。