🔴 Tier A・全新演算法概念

前綴和(Prefix Sum)

M3-02 前綴和(prefix sum)

1什麼是前綴和

假設你有一份「每天募款金額」的紀錄,老師常常問你:「第5天到第20天總共募了多少錢?」如果你每次都乖乖從第5天加到第20天,資料一多、問的次數一多,會算到手軟——而且明明第一次問「第5~20天」跟第二次問「第5~25天」,你其實有一大段(第5~20天)是重複算過的。

前綴和的想法是:先花一次功夫,把「從第1天累加到第i天」的結果,通通事先算好存起來,之後不管問哪一段區間的總和,都可以直接用兩個事先算好的數字相減得到,不用重新掃描那一整段。這是資訊科學裡「用一次額外的準備工作,換取後面每一次查詢都變快」的經典例子——你會發現前面M2-05「模擬與狀態」的部分題目就已經悄悄埋了「要查詢很多次區間總和」的情境,前綴和正是用來解決那類問題的正式工具。

2核心概念,依課程題目的順序拆解

1

建立前綴和陣列——每天結束時的累積總額

你要做的事:給定N天的每日金額,輸出「第1天到第i天為止」的累積總額,對每一個i都輸出一次。這一步其實就是你在M0-04學過的「累加」技巧——差別是這次要把每一步的累加結果都存下來(不是只要最後的總和),因為後面的查詢會需要用到中間任何一步的累積值。

每日金額:

3
5
2
7
4
↓ 累加

前綴和陣列(累積到第 i 天為止):

3
8
10
17
21
🆕 補充圖解:前綴和陣列把每一步的累加結果都存下來,不只存最後結果新增

募款進度累積表(M3-02-01)

2

用前綴和回答「一段區間」的總和查詢

你要做的事:查詢「第L天到第R天」(含頭尾)總共募了多少錢。有了概念1的前綴和陣列後,答案就是:「到第R天為止的累積總額」減掉「到第L-1天為止的累積總額」。
查詢第2天到第4天(L=2, R=4):前綴和[4] − 前綴和[1] = 17 − 3 = 14
3
8
10
17
21
🆕 補充圖解:一次減法就能算出任何一段區間的總和,不用重新掃描新增

區間募款查詢(M3-02-02)

⚠️ 常見誤區(這是這個單元最容易出錯、也是最重要的一個觀念)
一定要減掉「第L-1天」而不是「第L天」——如果你不小心減成「到第L天為止」的累積總額,你會把第L天本身也扣掉,結果少算了一天。自己動手驗證一次:如果L=1(要查第1天開始),前綴和陣列裡沒有「第0天」這個東西,這時候要把它當作0(一天都還沒開始,累積總額當然是0)。很多同學會在這裡卡住,建議自己明確定義清楚:「到第0天為止的累積總額=0」,讓公式在L=1的邊界情況也能套用,不用另外寫特殊判斷。
3

重複套用同一招——一次處理多筆查詢

你要做的事:同一份募款紀錄,這次要一次查詢很多組不同的區間。這一題沒有新概念——前綴和陣列只要建立一次,之後每一組查詢都直接套用概念2的公式,不用每組查詢都重新掃描資料。這正是前綴和最大的優勢所在:準備工作只做一次,後面的查詢不管做幾次都很快。

募款多筆區間查詢(M3-02-03)

4

用前綴和算平均值,判斷是否達標

你要做的事:判斷第L天到第R天(含頭尾)的平均氣溫,是否達到某個門檻。這一題結合了概念2(用前綴和算出區間總和)跟你在M1-03學過的「整數平均」技巧——先用前綴和算出區間總和,再除以天數(R-L+1),拿去跟門檻比較。

區間平均氣溫是否達標(M3-02-04)

5

從區間總和中「扣除」某一天

你要做的事:給定L到R的募款範圍,但其中有一天要扣掉不列入計算,求扣除後的區間總額。做法是:先用概念2算出「L到R的區間總和」,再直接減掉「那一天單獨的金額」(不是用前綴和相減,是直接減掉那一天的原始數值)。

扣除單日的區間總和(M3-02-05)

6

反過來找出「總和剛好等於目標值」的區間

你要做的事:找出一組連續區間(第L天到第R天),使這段區間的點數總和剛好等於目標值。這一題是前面的「反向應用」——前面都是「給你L、R,算總和」,這一題是「給你總和,找出對應的L、R」。做法是:對每一組可能的L、R組合,用概念2的公式快速算出區間總和(因為前綴和已經事先算好,每組只要一次減法,不用重新掃描),去比對是否等於目標值。

找出總和等於目標值的區間(M3-02-06)

3建議練習順序對照表

順序概念題目課程
1建立前綴和陣列募款進度累積表(M3-02-01)M3-02
2區間總和查詢區間募款查詢(M3-02-02)M3-02
3多筆查詢募款多筆區間查詢(M3-02-03)M3-02
4區間平均值判斷區間平均氣溫是否達標(M3-02-04)M3-02
5扣除單日扣除單日的區間總和(M3-02-05)M3-02
6反向找區間找出總和等於目標值的區間(M3-02-06)M3-02
🆕 本頁新增內容說明
以下視覺元素為 Cowork 潤飾時新增,MD 正本中沒有:① 原始資料→前綴和陣列的建立圖解 ② 區間查詢的減法圖解。若確認保留,建議之後補進 MD 正本。