資料結構------線段樹1:概述與建樹
阿新 • • 發佈:2018-11-03
資料結構——線段樹
作為一枚蒟蒻,學習是重要的。最近,我接觸了一種新資料結構——線段樹。我一見,只是全身懵逼,[流汗],怎麼這麼藍?
於是,我開始努力學,努力學······(此處省略INF個努力學),決定寫一下部落格。
線段樹是一棵二叉樹,並與分治有著密切關係。
就說說最簡單的一個例子,1~10的區間線段樹。
這棵線段樹吧1~10這個區間不斷de二分,最終分成一個一個數的葉節點,因此來儲存一個區間。
這裡多次提到了—— 區間 ——二字
於是,蒟蒻猜想,傳說中的線段樹和區間有關!
那麼,問題來了
為什麼要用線段樹呢?
用陣列不就行了?
其實我也不知道
BUT,這是一個有用的資料結構 大佬們都這麼說
好,不開玩笑了,線段樹是一個非常強 如xxzh&Rye_Catcher&TYQ······(dalao de 集合)
的資料結構。
它支援區間詢問,單點修改,區間修改作用的資料結構,還可以配合離散化進行大力時間優化,讓演算法複雜度大大降低。
蒟蒻:這樣好
於是,我就開始研究。
線段樹,既然是樹,就要定義陣列去儲存它。建造一棵線段樹其實很簡單,類似於二叉樹,卻強於二叉樹。
直接看程式碼:
1 void build(int k,int l,int r) //k:當前節點編號 l,r為k所代表的區間 2 { 3 if(l==r) //區間只有一個節點,即葉節點,建樹後return 4 { 5 mi[k]=v; //mi為儲存陣列,v是點權 6 return; 7 } 8 int mid=(l+r)/2; //構造中間數 9 //遞迴定義左子樹和右子樹,由二叉樹的性質可得左子樹編號為2*k,右子樹編號為2*k+1 10 build(k*2,l,mid); 11 build(k*2+1,mid+1,r); 12 mi[k]=min(mi[k*2],mi[k*2+1]);//更新線段樹 13 }
註釋都寫在code裡了
好了,今天的分享就到這裡,歡迎dalao前來拍磚。