為什麼要使用線段樹?
實質: 基於區間的統計查詢
乙個節點儲存的是乙個區間相應的和
// 在treeindex的位置建立表示區間[l...r]的線段樹
private
void
buildsegmenttree
(int treeindex,
int l,
int r)
int lefttreeindex =
leftchild
(treeindex)
;int righttreeindex =
rightchild
(treeindex)
;// int mid = (l + r) / 2;
int mid = l +
(r - l)/2
;// 兩個區間
buildsegmenttree
(lefttreeindex, l, mid)
;buildsegmenttree
(righttreeindex, mid +
1, r)
;// 具體操作合併的值和業務相關
tree[treeindex]
= merger.
merge
(tree[lefttreeindex]
, tree[righttreeindex]);
}public
intgetsize()
public e get
(int index)
// 返回完全二叉樹的陣列表示中,乙個索引所表示的元素的左孩子節點的索引
private
intleftchild
(int index)
// 返回完全二叉樹的陣列表示中,乙個索引所表示的元素的右孩子節點的索引
private
intrightchild
(int index)
// 返回區間[queryl, queryr]的值
public e query
(int queryl,
int queryr)
// 在以treeindex為根的線段樹中[l...r]的範圍裡,搜尋區間[queryl...queryr]的值
private e query
(int treeindex,
int l,
int r,
int queryl,
int queryr)
}
資料結構 線段樹
啦啦啦啦啦啦線段樹是個好東西 好吧並沒有什麼好的 但貌似還是很好啊 線段樹就是一棵樹!顧名思義 又是這個詞 就是求關於一段的某些什麼什麼東西。比如區間最大值啊什麼的。引用百科知識 線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。對於線段樹中...
資料結構 線段樹
一 目標 1.如何快速的查詢出下列陣列arr 2,5 的和 2。以及更新arr 4 為6。用普通的方法查詢的複雜度為o n 更新的複雜度為o 1 這時候我們可以用線段樹來快速完成這些操作,複雜度為logn。二 內容 如何建立,查詢,更新線段樹。public class qurqpd int tree...
資料結構 線段樹
線段樹是一顆平衡的二叉搜尋樹,他以空間換區時間,讓線性查詢加速log級別的查詢,用到的演算法主要是二分搜尋和遞迴。例如 有陣列data 我有乙個需求,我需要頻繁的查詢區間i j的sum和。這裡先給出兩個解決方案 如果使用最普通的演算法遍歷,那麼查詢和更新的複雜度為o n 當然你還可以使用動態規劃,定...