線段樹入門小結

2021-09-06 15:21:57 字數 1418 閱讀 2203

從劉汝佳的書中得知,「這種資料結構在學術界沒有統一的術語,但線段樹是最常見的叫法。其他叫法包括區間樹(interval tree)、範圍樹(range tree)等,但這些屬於在特定的場合(如計算幾何)中有著特殊的意義」。怎麼叫看讀者的心情,以下統一用線段樹稱呼。

線段樹是一棵二叉樹,它的左右兒子也都是一棵線段樹。(定義)

線段樹也叫區間樹,為什麼叫它區間樹呢?因為線段樹是一種基於區間的資料結構。

線段樹的每個節點代表乙個區間 [l,r],其中儲存的是這個區間的特定值

例如rmq(range minimum/maximum query,範圍最大/最小值)問題,給出n個元素的陣列,查詢任意區間內的元素最大/最小值。

這個問題就是基於區間查詢的,需要用到線段樹,而它節點中儲存的特定值就是所代表區間的最大/最小值。

某個節點代表區間 [l,r],其兩個兒子節點代表區間分別為 [l,mid],[mid+1,r]( mid = (l+r)/2 )。

1、點修改

在[l,r]中修改[ll,rr](ll=rr)的時候有兩種情況。

第一種,[ll,rr]被[l,mid]包含,此時直接在[l,mid]中修改[ll,rr]

第二種,[ll,rr]被[mid+1,r]包含,此時直接在[mid+1,r]中修改[ll,rr](同理)

然後遞迴更新父親。

不用考慮被截斷(因為只是乙個點)。

2、區間修改

在[l,r]中修改[ll,rr](ll

第一種,[ll,rr]被[l,mid]包含,此時直接在[l,mid]中修改[ll,rr]

第二種,[ll,rr]被[mid+1,r]包含,此時直接在[mid+1,r]中修改[ll,rr](同理)

第三種,較複雜的一種,[ll,rr]被mid從中截斷,此時在[l,mid]中修改[ll,mid],在[mid+1,r]中修改[mid+1,rr],然後將兩個查詢得到的結果進行update,遞迴更新父親。

這樣便處理完了修改。

rmq問題,儲存值,優化dp。

兩者在複雜度上同級, 但是樹狀陣列的常數明顯優於線段樹, 其程式設計複雜度也遠小於線段樹.

樹狀陣列的作用被線段樹完全涵蓋, 凡是可以使用樹狀陣列解決的問題, 使用線段樹一定可以解決, 但是線段樹能夠解決的問題樹狀陣列未必能夠解決.

樹狀陣列的突出特點是其程式設計的極端簡潔性, 使用lowbit技術可以在很短的幾步操作中完成樹狀陣列的核心操作,與之相關的便是其**效率遠高於線段樹。

另外,當問題推廣到高維情形時高維樹狀陣列有高維線段樹所無法企及的常數優勢。

freecode : www.cnblogs.com/yym2013

線段樹的入門小結

首先我們應該需要明白線段樹可以解決的問題,如 求解陣列區間之和,更新區間等 如果使用暴力的方法會超時,這樣就引入了線段樹這一資料結構線段樹的本質是一顆平衡二叉樹 線段樹的基本性質如下 父親的區間是 a,b c a b 2 左兒子的區間是 a,c 右兒子的區間是 c 1,b 線段樹需要的空間為陣列大小...

線段樹小結

按照牛的部落格寫了幾道題,刷了一周效果不錯 1.複習鞏固了以前的知識 2.還有改正了一些寫線段樹毛病 3.改正了在弱資料的影響下的錯誤方法ac的題目 4.還學到了線段樹新的型別題 總體效果不錯,總結一下 poj 2892 最直觀的是平衡樹,用樹狀陣列的findk的功能更酷一些,線段樹找第k小也可以,...

線段樹小結

實際上還是稱為區間樹更好理解一些。樹 是一棵樹,而且是一棵二叉樹。線段 樹上的每個節點對應於乙個線段 還是叫 區間 更容易理解,區間的起點和終點通常為整數 同一層的節點所代表的區間,相互不會重疊。同一層節點所代表的區間,加起來是個連續的區間。葉子節點的區間是單位長度,不能再分了。線段樹的深度不超過l...