資料結構——線段樹
作為一枚蒟蒻,學習是重要的。最近,我接觸了一種新資料結構——線段樹。我一見,只是全身懵逼,[流汗],怎麼這麼藍?
於是,我開始努力學,努力學······(此處省略inf個努力學),決定寫一下部落格。
線段樹是一棵二叉樹,並與分治有著密切關係。
就說說最簡單的乙個例子,1~10的區間線段樹。
這棵線段樹吧1~10這個區間不斷de二分,最終分成乙個乙個數的葉節點,因此來儲存乙個區間。
這裡多次提到了——區間——二字
於是,蒟蒻猜想,傳說中的線段樹和區間有關!
那麼,問題來了
為什麼要用線段樹呢?
用陣列不就行了?
其實我也不知道
but,這是乙個有用的資料結構 大佬們都這麼說
好,不開玩笑了,線段樹是乙個非常強 如xxzh&rye_catcher&tyq······(dalao de 集合)
的資料結構。
它支援區間詢問,單點修改,區間修改作用的資料結構,還可以配合離散化進行大力時間優化,讓演算法複雜度大大降低。
蒟蒻:這樣好
於是,我就開始研究。
線段樹,既然是樹,就要定義陣列去儲存它。建造一棵線段樹其實很簡單,類似於二叉樹,卻強於二叉樹。
直接看**:
1注釋都寫在code裡了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 }
這是乙個遞迴定義的函式,以葉(區間長為一的)節點為遞迴邊界,不斷二分,形成一棵二叉樹。
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 實際應用中,為了...