與求sum的線段樹不同
http://blog.csdn.net/ice110956/article/details/12067537
區間最值問題:
有如下無序序列,求任意子區間段的最大值。
接著,我們要用分治的思想來快速地解決上面的問題。在解決問題之前,先介紹一些分治的概念。
二分查找
二分查找是分治思想的典型運用
我們有如下序列:
A1,A2,A3……An.
要查找其中等于b的元素。一種方法就是一個個對比,看看是不是相等,時間復雜度為N。還有就是二分查找。
如上圖,通過不斷地與中間元素對比,縮小搜索區間,最后得到A4==b.時間復雜度為logN.
二叉搜索樹
在二分查找中,我們要求隊列是有序地。那么如果隊列無序又要如何?我們可以仿造二分查找的方式,構造一個二叉搜索樹,如下:
二叉搜索樹左節點比根小,右節點比根大。上圖紅色箭頭代表搜索A4的過程。
線段樹
線段樹也是一種二叉搜索樹,我們回到區間最值的問題,有如下無序序列
現在我們要在上面的序列中,搜索任意指定區間的最大值。
我們先來解決總的最大值的問題
一個基本的方法就是一個個比較,取出最大值,時間復雜度為N。
我們借用二分搜索的分治思想。可以把序列劃分為1-5節點的最大值和6-8的最大值,再取這兩個值的較大值。遞歸地,我們再把1-5繼續劃分至只剩一個元素。這樣的時間復雜度為logN .如下面的過程,即線段數搜索的過程:
上面的過程就是選取區間最大值的方式,總的最大值為9.
接著,我們要處理任意指定子序列的最值問題。
根據上圖我們可以看出,根據中間的結果,可以和容易地尋找1-6個節點的最大值,分治為1-4的最大值7,5-6的最大值8,1-6的最大值就為8.
總結一下上述的思想。
首先,有點像總統選舉,我們要尋找一個國家最適合當總統的人,不需要一個個去比較,只需要每個鄉選一個最好的,再在縣里比較,得出一個縣里最好的,然后市,然后省,最后我們得到了全國最好的。
然后,我們選舉的過程中,得到了鄉,縣的中間結果,這些又可以用來選取任意小范圍的最好人選。如我們要選總管廣東,廣西和南京鼓樓區第二大街的總管,只需要用到不同級別的中間結果匯總即可。
線段樹最終回到分治的思想上來,其應用與如下領域:
區間最值查詢問題
連續區間修改或者單節點更新的動態查詢問題?
多維空間的動態查詢
線段樹的編程實踐:
線段樹的節點結構為:
其中max保存當前線段的最大值。
線段樹最基本要有三個函數:
1.遞歸地建立樹:
2.遞歸地插入:
3.遞歸地查詢:
最后,求解任意區間最值的代碼如下: