資料結構 7 線段樹 區間樹

2021-09-25 01:14:11 字數 1553 閱讀 5089

為什麼要使用線段樹?

實質: 基於區間的統計查詢

乙個節點儲存的是乙個區間相應的和

// 在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 當然你還可以使用動態規劃,定...