线段树小结
線段樹(shù)基本概念
????線段樹(shù)/區(qū)間樹(shù)是一種非常常用的對(duì)區(qū)間數(shù)據(jù)進(jìn)行操作的數(shù)據(jù)結(jié)構(gòu)。?
????線段樹(shù)是一棵二叉樹(shù)(但不一定是完全二叉樹(shù)!),它的每個(gè)節(jié)點(diǎn)均代表一個(gè)區(qū)間,且父節(jié)點(diǎn)代表的區(qū)間為左右子節(jié)點(diǎn)代表的區(qū)間之和。特別的,根節(jié)點(diǎn)代表的區(qū)間為所有節(jié)點(diǎn)代表區(qū)間之和,各個(gè)葉節(jié)點(diǎn)代表區(qū)間為單個(gè)點(diǎn)(即長(zhǎng)度為1的區(qū)間)。
線段樹(shù)結(jié)構(gòu)
????樹(shù)中的每一個(gè)結(jié)點(diǎn)表示了一個(gè)區(qū)間[a,b]。 a,b通常是整數(shù)。每一個(gè)葉子節(jié)點(diǎn)表示了一個(gè)單位區(qū)間(長(zhǎng)度為1)。對(duì)于每一個(gè)非葉結(jié)點(diǎn)所表示的結(jié)點(diǎn)[a,b],其左兒子表示的區(qū)間為[a,(a+b)/2],右兒子表示的區(qū)間為[(a+b)/2+1,b](除法去尾取整)。?
????如下圖為區(qū)間[1, 9]的線段樹(shù):?
線段樹(shù)和區(qū)間
????要用線段樹(shù)解決區(qū)間問(wèn)題,首先需要將區(qū)間對(duì)應(yīng)到線段樹(shù)的節(jié)點(diǎn)上。這就需要進(jìn)行在線段樹(shù)上進(jìn)行區(qū)間分解。?
(1)如果有某個(gè)節(jié)點(diǎn)代表的區(qū)間完全屬于待分解區(qū)間,則該節(jié)點(diǎn)為“終止”節(jié)點(diǎn),不再繼續(xù)向下分解;?
(2)所有“終止”節(jié)點(diǎn)所代表的區(qū)間都不重疊,且加在一起就恰好等于整個(gè)待分解區(qū)間;?
(3)區(qū)間分解時(shí),每層最多2個(gè)“終止”節(jié)點(diǎn),所以“終止”節(jié)點(diǎn)的總數(shù)也是 log(n)量級(jí)的
線段樹(shù)性質(zhì)
???因?yàn)?#xff0c;根據(jù)性質(zhì)3,線段樹(shù)總節(jié)點(diǎn)數(shù)目為2*N-1,又由于線段樹(shù)不是完全二叉樹(shù),因此其最低的葉子一層并不是緊靠最左邊,這樣在其倒數(shù)第二層上的索引號(hào)接近2N的位置,按照2*index+1和2*index+2的方式來(lái)訪問(wèn)其左右子節(jié)點(diǎn),這就導(dǎo)致整個(gè)數(shù)組的大小要約為 4*N.
?????因?yàn)槊恳粚幼疃嘤袃蓚€(gè)“終止”節(jié)點(diǎn),共log(n)層,這樣在線段樹(shù)上進(jìn)行更新葉子節(jié)點(diǎn)和進(jìn)行區(qū)間分解的時(shí)間復(fù)雜度都是O(logn).
線段樹(shù)操作的基本類型
(1)單點(diǎn)更新?
????每次對(duì)區(qū)間內(nèi)的一個(gè)點(diǎn)進(jìn)行更新,更新操作需要遞歸到葉節(jié)點(diǎn)進(jìn)行操作。在向下遞歸的過(guò)程中,沿途經(jīng)過(guò)的所有節(jié)點(diǎn)都要進(jìn)行修改。?
(2)成段更新?
????簡(jiǎn)單的說(shuō)明:成段更新需要用到延遲標(biāo)記(或者說(shuō)懶惰標(biāo)記),簡(jiǎn)單來(lái)說(shuō)就是每次更新的時(shí)候 不要更新到底,用延遲標(biāo)記使得更新延遲到下次需要更新or詢問(wèn)到的時(shí)候。 延遲標(biāo)記的意思是:這個(gè)區(qū)間的左右兒子都需要被更新,但是當(dāng)前區(qū)間已經(jīng)更新了。?
(3)區(qū)間合并?
????區(qū)間合并是在線段樹(shù)查詢的時(shí)候,對(duì)當(dāng)前區(qū)間的左右兒子進(jìn)行合并。?
(4)掃描線
線段樹(shù)解題的一般規(guī)律
其他
????有幾篇總結(jié)很好的博客,便于查找,列在下面:?
線段樹(shù)總結(jié)1?
線段樹(shù)總結(jié)2
轉(zhuǎn)載于:https://www.cnblogs.com/gtarcoder/p/4786734.html
總結(jié)
- 上一篇: [设计模式] Javascript 之
- 下一篇: RabbitMQ和Kafka