線段樹開4N空間證明

2021-08-09 09:08:29 字數 2445 閱讀 1103

線段樹採用陣列儲存時,無疑,其儲存空間利用與其左右子樹定義有關

方式一:

方式二:

假設定義區間[1

,5] 的線段樹,很容易看出它們的不同

方式一:

方式二:

由此初步看來,採用第二種方式定義,可能會在其左邊產生較大的空白區域。

實際上也的確如此,

為了方便我們的習慣,考慮第一種方式定義情況

對於某一區間[l, r],當區間元素個數為偶數時,這很好,因為這樣左右子樹分得相同多的葉結點,也即是左右區間長度相等;如果區間為奇數,這意味著其中一邊不得不多拿乙個葉結點,而究竟誰多拿,依靠你判決左右子樹的策略,例如方式一:左邊多,方式二,右邊多。

思考這樣乙個問題其實是有利於我們明白當區間長度逐漸增大時,最後兩層葉結點它們的變動情況。依靠你的判決策略,當當前結點區間長度為奇數時,多拿的一方會將這種方式逐層傳遞,例如這裡,左邊多乙個結點,最終會被傳遞到最下層

好了開始我的問題,假設一開始,給出的區間長度為4,你很容易畫出它們的線段樹圖形(一棵滿二叉樹),區間增加為5時,圖也已經給你了(方式一),如果現在,區間增長為6,你應該也能畫出它們的圖形

如果我再增加呢?增加到7,然後再增加到8呢?(8是一棵滿二叉樹)

仔細想想,線段樹的形狀隨著區間長度增加(陣列元素增加)實際上遵循這樣乙個規律,從一顆滿二叉樹,到另外一課滿二叉樹,每次遞增時,會多出乙個葉結點(減少乙個,增加兩個),好像是,在原來樹的基礎上首先判斷當前結點左右子樹區間長度(即是葉結點個數)是不是一樣的,恩,如果不一樣把這個結點再安排到葉結點少的那棵子樹上,使其左右平衡,如果一樣了,再把就它放到左子樹上(依據左右子樹劃分策略,這裡為方式一)

從另外乙個角度看,好像也是合乎情理的,線段樹的區間均分使得它含有這樣乙個性質,左右兩邊的葉結點個數(區間長度)之差小於等於1。

好了,明白了這些,我們接下來討論為什麼線段樹要開出4n的空間

給你一棵滿二叉樹,其葉結點個數為n,問,有多少個非葉結點?

方法是很簡單多樣的,你可以選擇求和,也可以根據二叉樹的一些性質,這是容易的。 考慮n

0+n1

+n2=

2n2+

n1+1

注意到此時,n0

=n,n

1=0

所以n2=

n−1

總共有n-1個非葉結點

考慮極端情況,方式二,且最後一層只有兩個結點(如上圖方式二的圖那樣)

此時,有n個葉結點,倒數第二層有n-1個結點

因此,除去最後一層的兩個結點外,總共有(n

−1)+

(n−1

−1)=

2n−3

由於是陣列儲存,最後一層有2×

(n−1

)=2n

−2個結點(含空結點)總計結點個數為2n

−3+2

n−2=

4n−5

好了,這就是最終最壞的結果

為什麼這是最壞的情況?對於一棵滿二叉樹(n=

2k),無疑,是最好的,此時儲存空間達到最小,為2n(注意這裡算上了0位置,結點為2n-1),當區間長度增加1時,情況馬上變壞,因為你不得不開出近似4n的空間來儲存它,剩出多個沒有利用的空間了,接下來,你可以鬆口氣了,因為直到填滿下乙個二樹前,這些空間都是足夠的。

而對於方式一來說,在大多數情況下,沒有方式二來的那麼劇烈,一下子增加到4n,恩,先左邊加一點,然後隔一段距離,右邊加一點,然後左邊,然後右邊,每次右邊增加時左邊的儲存就不用管了,因為已經足夠。

因此可以看出,開出4n,最壞情況下,也可以得到滿足

乙個有意思的問題是,什麼情況下方式一達到最壞呢?是不是方式一最壞的情況下空間也是需要達到4n呢?

好像有點複雜(逃~)

不過可以設想的是,應該沒有方式二那樣如此耗費空間才是。

假設陣列元素個數為n,最後一層結點為4,如果你明白了我前面的有關線段樹葉結點變動的說明,你應該能理解它究竟是怎樣一幅圖

好了,除去最後一層結點,總個數為(n

−2)+

(n−2

−1)=

2n−5

最後一層結點個數(含空結點)為(n

−2)×

22+1

=n−1

總個數為2n

−5+n

−1=3

n−6

注:這只是第一次出現最壞的情況,這有可能並不是最壞的情況,可能存在某些中間態。

不過可以看出的是,相較於第二方式,可能儲存上相對較為節省空間

不過,總體來說,從第二種方式來看,線段樹開4n,的確是有必要的

線段樹 4n 開四倍空間的原因

一 為何要使用線段樹?對於某一類問題,我們主要關注的是乙個線段或者區間。對於給定區間,更新區間中乙個元素或者乙個區間的值,查詢乙個區間 i,j 的最大值 最小值,或者區間數字和。線段樹不一定滿二叉樹,也不一定是完全二叉樹,但一定是平衡二叉樹,下面是線段樹元素個數n 2 k的情況,是滿二叉樹。下面是線...

線段樹及空間開4倍

下面我們來講解線段樹 線段樹有許多應用,給出乙個序列,可以在任何乙個區間內找到最大,和最小值。可以求區間和等等等等。那麼應用就不多說了。畢竟能到這裡來的我相信都是為了a題,並且了解線段樹的吧!廢話不多說了。線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中...

奇數魔方陣 4N魔方陣 2(2N 1)魔方陣

奇數魔方陣 說明 將1到n 為奇數 的數字排列在nxn的方陣上,且各行 各列與各對角線的和必須相同,如下所示 解法 填魔術方陣的方法以奇數最為簡單,第乙個數字放在第一行第一列的正 然後向右 左 上填,如果右 左 上已有數字,則向下填,如下圖所示。一般程式語言的陣列索引多由0開始,為了計算方便,我們利...