線段樹學習

2021-06-16 13:46:14 字數 2096 閱讀 1311

今天學習了線段樹。。

**是敲了不少

可是感覺還沒有真正理解

先不貼題目。。

再消化消化。。

一會兒還有計組實驗。。還有那個傲嬌的老師。。。真是煩。。

餓。。先去吃飯去。。。一天木有吃。。。。。。

以下**:

線段樹模板 ?

//線段樹的節點

//節點包括兩部分資訊,基本域,和資訊域

//基本域:左右邊界ld,rd.  左右孩子:lc,rc

//資訊域:key值,如rmq問題中,資訊域中儲存的是區間最大值

structnode;

//空樹的建立,內含key值的初始化;

//一般在主函式中首先呼叫 node* root= buildtree(1,n);建立一棵新樹

node *buildtree(inta,intb)

if(a==b)returnp;//葉子節點

p->lc=buildtree(a,(a+b)/2);

p->rc=buildtree((a+b)/2+1,b);

returnp;

}

voidinsert(node *t,inta,intb,intkey)

}

if(a<=(t->ld+t->rd)/2)

insert(t->lc,a,b,key);

if(b>(t->ld+t->rd)/2)

insert(t->rc,a,b,key);

//  (此處類似於歸併排序中最後的合併操作)

}

intsearch(node *t,inta,intb)

if(a<=(t->ld+t->rd)/2)

//

if(b>(t->ld+t->rd)/2)

//根據search(t->rc,a,b)處理res}

returnres;

}

什麼是線段樹:

線段樹是一種用樹狀結構來儲存乙個連續區間的資訊的資料結構

線段樹的作用:

它主要用於處理一段連續區間的插入,查詢,統計,查詢等操作

複雜度:

設區間的長度是n,所有的操作的複雜度是logn級別的

線段樹的性質:

1.線段樹是平衡二叉樹,最大深度為logn(n為線段樹所標示的區間的長度)

以上兩條性質保證了線段樹除了建樹外的操作都是log(n)級別的複雜度

學習線段樹

參考文章 從簡單說起,線段樹其實可以理解成一種特殊的二叉樹。但是這種二叉樹較為平衡,和靜態二叉樹一樣,都是提前已經建立好的樹形結構。針對性強,所以效率要高。這裡又想到了一句題外話 動態和靜態的差別。動態結構較為靈活,但是速度較慢 靜態結構沒有節省記憶體,但速度較快。演算法導論中有涉及區間樹的內容,那...

留待學習線段樹

include define lson l m rt 1 define rson m 1 r rt 1 1 const int maxn 55555 int sum maxn 2 void pushup int rt void build int l,int r,int rt int m l r 1...

線段樹學習筆記

線段樹是一種 二叉搜尋樹 與區間樹 相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為o logn 而未優化的 空間複雜度 為2n,因此有時需要離散化讓空間壓縮。以下筆記摘自lcomyn神犇部落格 1....