[知識點] 2.7 前綴和與差分

前言數組

沒有想到前綴和也被單獨拿出來做爲一節來說,不過也好,還能夠順便講講前面又碰到了一次的多維前綴和以及差分。blog

子目錄列表數學

 

2.7 前綴和與差分效率

一、前綴和方法

前綴和:對於數列 a,其第 1, 2, ..., i 項之和,即 a[1] + a[2] + ... + a[i],稱爲數列 a 第 i 項的前綴和。im

學太高中數學的數列章節就知道,「前綴和」和「前 n 項和 Sn」的概念是等價的。查詢

前綴和有啥用?最簡單的,若是咱們要求數列某一個區間 [l, r] 之和,若是預處理了前綴和 sum,則直接 sum[r] - sum[l - 1] 就獲得了區間和。img

 

二、差分時間

和前綴和相對的一個概念。co

差分:對於數列 a,其第 i 個元素和第 i - 1 個元素的差稱爲數列 a 第 i 項的差分。

令差分數組爲 b,則存在:b[i] = a[i] - a[i - 1]

有意思的是,對差分數組求前綴和就又能夠獲得原數列 a 了。

sumb[i] = b[1] + b[2] + ... b[i] = a[1] + a[2] - a[1] + ... + a[i] - a[i - 1] = a[i]

那麼咱們拿着這個差分數組有什麼用捏?

【例題】給定一個數列 a,進行 m 次操做,每次給定三個值 l, r, p,操做類型以下:

① 1 l r p,表示對 a[l..r] 的每個元素加上 p;

② 2 l r,表示查詢 a[l..r] 的元素和。

確保全部操做 ① 執行完後纔會有操做 ②

最簡單的作法就是對於修改操做逐一加上 p,對於查詢操做能夠用前面的前綴和來求。但注意到題目最後這個限定:全部修改操做會在任意查詢操做以前執行,這樣其實咱們能夠拿差分數組作文章,每次只修改差分數組的兩個端點便可,見下面的圖解舉例:

是否是很神奇呢?修改的方式很簡單,若是修改區間爲 [l, r],則對 b[l] += p, b[r + 1] -=p,具體就不解釋緣由了。 

不過限定條件也體現出了這種方式的不足:差分數組至關於提供了一個臨時的方艙醫院,須要時間搭建,但一旦搭建好了就能很快收容大量病人,而等疫情結束後再拆除;普通醫院是現成的,但牀位不夠效率不高,然而適用於日常的各類疑難雜症,能夠隨時收治(好像也不是很恰當、)。

因此若是遇到修改操做和查詢操做交替出現的狀況,差分數組的便捷則徹底體現不出,須要反反覆覆地在原數組和差分數組之間轉化,那和直接枚舉的效率不相上下。但同時出現兩種操做顯然是更符合現實狀況的,而要解決這種問題,樹狀數組和線段樹(請參見:)都是很棒的方法,它們適用範圍更廣於差分數組,可是搭建起來,尤爲是線段樹,則較爲麻煩。

 

三、多維前綴和

相關文章
相關標籤/搜索