今天學習了線段樹。。
**是敲了不少
可是感覺還沒有真正理解
先不貼題目。。
再消化消化。。
一會兒還有計組實驗。。還有那個傲嬌的老師。。。真是煩。。
餓。。先去吃飯去。。。一天木有吃。。。。。。
以下**:
線段樹模板 ?
//線段樹的節點
//節點包括兩部分資訊,基本域,和資訊域
//基本域:左右邊界ld,rd. 左右孩子:lc,rc
//資訊域:key值,如rmq問題中,資訊域中儲存的是區間最大值
struct
node;
//空樹的建立,內含key值的初始化;
//一般在主函式中首先呼叫 node* root= buildtree(1,n);建立一棵新樹
node *buildtree(
int
a,
int
b)
if
(a==b)
return
p;
//葉子節點
p->lc=buildtree(a,(a+b)/2);
p->rc=buildtree((a+b)/2+1,b);
return
p;
}
void
insert(node *t,
int
a,
int
b,
int
key)
}
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);
// (此處類似於歸併排序中最後的合併操作)
}
int
search(node *t,
int
a,
int
b)
if
(a<=(t->ld+t->rd)/2)
//
if
(b>(t->ld+t->rd)/2)
//根據search(t->rc,a,b)處理res}
return
res;
}
什麼是線段樹:
線段樹是一種用樹狀結構來儲存乙個連續區間的資訊的資料結構
線段樹的作用:
它主要用於處理一段連續區間的插入,查詢,統計,查詢等操作
複雜度:
設區間的長度是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....