日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

线段树小结

發(fā)布時(shí)間:2024/1/17 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线段树小结 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

線段樹(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ì)

  • 線段樹(shù)為二分構(gòu)造,若根節(jié)點(diǎn)對(duì)應(yīng)區(qū)間為[a,b],則其深度為?log2(b?a+1)(向上取整)。這樣在進(jìn)行更新查詢操作的時(shí)候,操作的復(fù)雜度就可以為log(n)量級(jí)
  • 葉子節(jié)點(diǎn)的數(shù)目和根節(jié)點(diǎn)表示的區(qū)間長(zhǎng)度相同
  • 若葉子節(jié)點(diǎn)的數(shù)目為N,則線段樹(shù)的總節(jié)點(diǎn)數(shù)目為2*N-1。因?yàn)榫€段樹(shù)的節(jié)點(diǎn)要么是0度,要么為2度,根據(jù)二叉樹(shù)的性質(zhì)可知。
  • 若葉子節(jié)點(diǎn)為N,要想用連續(xù)的數(shù)組表示一棵線段樹(shù),則數(shù)組的大小應(yīng)該為4N。?
    ???因?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.
  • 線段樹(shù)上,任何一個(gè)區(qū)間被分解后得到的“終止”節(jié)點(diǎn)的數(shù)目都是log(n)量級(jí)。?
    ?????因?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ī)律

  • 首先要確定是一個(gè)區(qū)間的問(wèn)題,如果不是明顯的區(qū)間,看是否能轉(zhuǎn)化為區(qū)間。例如?poj_3321的解答
  • 要想清楚每個(gè)節(jié)點(diǎn)要存放哪些信息(當(dāng)然,區(qū)間的起始和終止節(jié)點(diǎn),以及左右子節(jié)點(diǎn)指針是必須的)
  • 更新的時(shí)候,看是否能夠lazy更新,即不要一下就更新到葉子節(jié)點(diǎn),這樣會(huì)導(dǎo)致更新效率降低
  • 先建樹(shù),然后插入數(shù)據(jù),再更新/查詢
  • 其他

    ????有幾篇總結(jié)很好的博客,便于查找,列在下面:?
    線段樹(shù)總結(jié)1?
    線段樹(shù)總結(jié)2

    轉(zhuǎn)載于:https://www.cnblogs.com/gtarcoder/p/4786734.html

    總結(jié)

    以上是生活随笔為你收集整理的线段树小结的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。