线段树入门之夜空星亮
--------------------------------------------不是能不能辦到的問(wèn)題,既然我已經(jīng)下定決心要成為海賊王了,如果因此而戰(zhàn)死的話,也無(wú)所謂了。
承接上一章節(jié),繼續(xù)探索線段樹(shù)丫!
如何利用線段樹(shù)進(jìn)行區(qū)間統(tǒng)計(jì)?
假設(shè)這13個(gè)數(shù)為1,2,3,4,1,2,3,4,1,2,3,4,1. (A[1]=1,A[2]=2,......A[13]=1)在區(qū)間之后標(biāo)上該區(qū)間的數(shù)字之和:
?
?
如果要計(jì)算[2,12]的和,按照之前的算法:?
[2,12]=[2] + [3,4] + [5,7] + [8,10] + [11,12]?
? 29 ?= 2 + 7 + 6 + 7 + 7?
計(jì)算5個(gè)數(shù)的和就可以算出[2,12]的值。?嘻嘻,下面介紹另一個(gè)問(wèn)題:
如何進(jìn)行點(diǎn)修改?
以上一個(gè)圖為討論的基礎(chǔ):
假設(shè)把A[6]+=7 ,看看哪些區(qū)間需要修改?[6],[5,6],[5,7],[1,7],[1,13]這些區(qū)間全部都需要+7.其余所有區(qū)間都不用動(dòng)。
于是,這顆線段樹(shù)中,點(diǎn)修改最多修改5個(gè)線段樹(shù)元素(每層一個(gè))。
下圖中,修改后的元素用藍(lán)色表示。
?
一身轉(zhuǎn)戰(zhàn)三千里,且去追尋線段樹(shù)的存儲(chǔ)結(jié)構(gòu):
線段樹(shù)是一種二叉樹(shù),當(dāng)然可以像一般的樹(shù)那樣寫成結(jié)構(gòu)體,指針什么的。 但是它的優(yōu)點(diǎn)是, 它也可以用數(shù)組來(lái)實(shí)現(xiàn)樹(shù)形結(jié)構(gòu),可以大大簡(jiǎn)化代碼。 數(shù)組形式適合在編程競(jìng)賽中使用,在已經(jīng)知道線段樹(shù)的最大規(guī)模的情況下,直接開(kāi)足夠空間的數(shù)組,然后在上面建立線段樹(shù)。 簡(jiǎn)單的記法: 足夠的空間 = 數(shù)組大小n的四倍。 實(shí)際上足夠的空間 =? (n向上擴(kuò)充到最近的2的某個(gè)次方)的兩倍。 舉例子:假設(shè)數(shù)組長(zhǎng)度為5,就需要5先擴(kuò)充成8,8*2=16.線段樹(shù)需要16個(gè)元素。如果數(shù)組元素為8,那么也需要16個(gè)元素。所以線段樹(shù)需要的空間是n的兩倍到四倍之間的某個(gè)數(shù),一般就開(kāi)4*n的空間就好,如果空間不夠,可以自己算好最大值來(lái)省點(diǎn)空間。 怎么用數(shù)組來(lái)表示一顆二叉樹(shù)呢?假設(shè)某個(gè)節(jié)點(diǎn)的編號(hào)為v,那么它的左子節(jié)點(diǎn)編號(hào)為2*v,右子節(jié)點(diǎn)編號(hào)為2*v+1。 然后規(guī)定根節(jié)點(diǎn)為1.這樣一顆二叉樹(shù)就構(gòu)造完成了。通常2*v在代碼中寫成 v<<1 。 2*v+1寫成 v<<1|1 。
轉(zhuǎn)載于:https://www.cnblogs.com/dragondragon/p/11241773.html
總結(jié)
以上是生活随笔為你收集整理的线段树入门之夜空星亮的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: el-cascader级联选择器,解决最
- 下一篇: K8S—二进制部署安装(包含UI界面设置