差分數組(HackerRank Array Manipulation)

差分數組(HackerRank Array Manipulation)

學過樹狀數組之後,比較線段樹,我們想有沒有一種與樹狀數組相關的能夠達到快速進行區間更新的方法,這就是差分數組。差分數組可以只通過修改區間端點值達到區間修改的目的,同時結合樹狀數組,可以達到快速單點查詢的目的。

  • 定義
    對於已知有n個元素的離線數列A,我們可以建立記錄它每項與前一項差值的差分數組F,
    顯然,F[1] = A[1] - 0 = A[1] ; 對於整數i∈[2…n],我們讓F[i] = A[i] - A[i-1] 。
    這樣,得到的數組 F[ ] 就是我們所說的差分數組。

  • 性質
    1.計算數列各項的值:
    觀察 d[2]=f[1]+f[2]=d[1]+d[2]-d[1]=d[2] 可知,由查分數組的定義容易知道,數列第 i 項的值是可以用差分數組的前 i 項的和計算的,即 A[i] = F[1] + F[2] + … + F[i] 。例如: A[2] = A[1] + A[2] - A[1] = F[1] + F[2] 。
    在這個問題上,可以通過樹狀數組維護區間和,達到快速查詢某一項的值的目的。
    2.計算數列A[ ]的前綴和(前 i 項和):
    由下述公式可以直接得到前綴和。
    在這裏插入圖片描述

  • 應用
    1.快速處理區間加減操作:
    通過性質1很容易知道,如果對區間 [L, R] 進行修改時,區間內部元素之間的差值是不受影響的,對應到差分數組上就是區間內的值不變,受到影響的是差分數組中區間兩端的值。例如,區間 [L, R] 內的值同時加上 k 時,區間左端的值與前一位數的差值就會多 k ,區間右端的值的下一位(F[R+1])與區間右端的值的差就會減少 k ,最後結果就是 F[L] += k , F[R+1] -= k 。
    2.區間和:
    求區間和,通過前綴和相減即可。例如求區間 [L, R] 的值的和,則 sum([L, R]) = sumR - sumL-1
    樹狀數組可以看一下另一篇博客:樹狀數組

發佈了9 篇原創文章 · 獲贊 1 · 訪問量 1349
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章