1. 程式人生 > >資料結構------線段樹1:概述與建樹

資料結構------線段樹1:概述與建樹

資料結構——線段樹

 

作為一枚蒟蒻,學習是重要的。最近,我接觸了一種新資料結構——線段樹。我一見,只是全身懵逼,[流汗],怎麼這麼藍?

於是,我開始努力學,努力學······(此處省略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前來拍磚。