從線段樹的可刪減性談樹狀數組

這多是我最後一次更新博客了呢數組

# 前言

好久以前,我初學樹狀數組的時候感受很是的複雜、神奇、晦澀難懂。。。spa

果真仍是我太菜了。後來瞭解到線段樹的可刪減性,這二者就天然而然的聯繫在一塊兒了。blog

 

# 線段樹的可刪減性

很顯然,對於一些區間操做的問題,線段樹有着絕對的優點,基本上只要是區間查詢之類的問題,那線段樹是沒跑了。博客

可是若是咱們要查詢的是前綴和這樣的東西的話,會不會感受線段樹中的一些東西是多餘的呢?io

這麼說可能有些很差理解,畫畫圖就好:im

上圖若是看不清楚,請在新標籤頁中打開。(藍色爲節點標號,紅色是區間端點)查詢

假設咱們查詢到位置 9 的前綴和,那麼答案就等於 2 號節點和 6 號節點的和。margin

這兩個節點有什麼奇怪的性質?img

顯然它們都是左孩子啊,那是否是全部的前綴和都是僅由左孩子節點構成的呢。di

再試一下,就會發現,都是這樣的。如何證實?

從根節點開始,答案有如下兩種狀況。

  • 在左孩子中。
  • 整個左孩子就是答案。
  • 整個左孩子加上右孩子的一部分。

先看第二種狀況。。。那這根本沒有懸念吧,只有左孩子。

那再看第一種狀況,在左孩子中查找答案。那麼答案仍是分紅上面的三種狀況。

關鍵的就是來看第三種狀況,那在右孩子中的答案就變成了 mid 到查詢區間的右端點的和。

若是把左子樹看作一個總體的話,只有變成了上面的差前綴和的問題。也就是說若是在右孩子中存在一部分答案的話,就會已知按照上面的三種狀況劃分下去,直到出現了第二種狀況。

那第一種狀況也是如此,已知分下去,問題要麼直接變成第二種狀況,要麼先變成第三種狀況再變成第二種狀況。

並且觀察咱們的路徑,會發現對答案有貢獻的節點所有都是左端點。也就是說又斷電時能夠省略掉的。

以下圖。

這就是線段樹的可刪減性。

 

# 再說樹狀數組

樹狀數組能解決的不正是前綴和的查詢嗎?那麼咱們再來看上面的圖,刪掉右孩子後,是否是變成了一個樹狀數組呢?

這就是二者之間的關係。

相關文章
相關標籤/搜索