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

2021-09-19 22:21:19 字數 1224 閱讀 7618

資料結構——線段樹

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

於是,我開始努力學,努力學······(此處省略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所代表的區間28

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:拍磚ing

資料結構之 線段樹 1

線段樹是acm中比較常見的資料結構,它的每一點都代表了一條線段 a,b 長度為1的為元線段,所有葉子結點的長度均為1。長度範圍為 1,l 的一顆線段樹的深度為log l 1 1。線段樹基本的應用時查詢某段的和,最大最小值,成段更新,保證每次操作的複雜度為log n 關於線段樹的文章有很多,大家可以參...

初步認識線段樹(1)線段樹用途 建樹

當你遇到了這樣的題目時 現在請求你維護乙個數列,要求提供以下兩種操作 1 查詢操作。語法 q l 功能 查詢當前數列中末尾l個數中的最大的數,並輸出這個數的值。限制 l不超過當前數列的長度。l 0 2 插入操作。語法 a n 功能 將n加上t,其中t是最近一次查詢操作的答案 如果還未執行過查詢操作,...

高階資料結構(1) 線段樹與樹狀陣列

鑑於去年西安賽區被吐槽為線段樹專題賽區,就先更一發線段樹2333333 線段樹 segment tree 本質上來講是一棵二叉搜尋樹。它與區間樹類似,它的每乙個結點都是一段區間。線段樹的功能是快速查詢某個結點在若干線段中出現的次數,時間複雜度為o logn 單純空間複雜度為o 2n 實際應用中,為了...