一、為何要使用線段樹?
對於某一類問題,我們主要關注的是乙個線段或者區間。對於給定區間,更新區間中乙個元素或者乙個區間的值,查詢乙個區間[i,j]的最大值、最小值,或者區間數字和。
線段樹不一定滿二叉樹,也不一定是完全二叉樹,但一定是平衡二叉樹,下面是線段樹元素個數n=2^k的情況,是滿二叉樹。
下面是線段樹元素個數n!=2^k的情況,不是滿二叉樹,如下:
由於線段樹是平衡二叉樹,那麼可以使用陣列來表示:*把線段樹想像成滿二叉樹(即使是上面這種情況,也想象成滿二叉樹)*。
滿二叉樹有下面的性質,想象成滿二叉樹後,我們可以利用這些性質。對於高度為h層的滿二叉樹有2h-1個元素,第h層有2(h-1)個元素,h從0~h-1,最後一層的結點數大致相當於前面所有層結點之和,大致相當於整體的一半。
如果區間元素個數n=2^k,則構成的線段樹為滿二叉樹,否則則不是,為了使用滿二叉樹的性質,可以把線段樹構造成滿二叉樹,對於最後一層不存在的葉子結點也要構造出來,思考用多大的陣列儲存?
(1)區間元素個數n=2k,則滿二叉樹的最後一層全部是有效元素,而不是靠新增虛值才構成滿二叉樹。由滿二叉樹的性質可知,第k層有2k個元素(k從0開始計算),則共有k+1層,總的元素2(k+1)-1個。為了使用的更放心,多給乙個空間,也就是2(k+1)-1+1個元素,即2^(k+1)=2n個元素。如下圖的紅框中的部分。
(2)區間元素個數n!=2k時,假設只多出乙個元素,即n=2k+1,就需要多一層來儲存,而且最後一層除了剩餘的乙個真實元素,其它都是虛值。原來需要k+1層,現在需要k+2層,新增的一層可以儲存2^(k+1)個元素,即2n,加上之前層的2n,共4n。
所以不考慮新增元素,使用4n的靜態空間就可以對付所有情況。
線段樹開4N空間證明
線段樹採用陣列儲存時,無疑,其儲存空間利用與其左右子樹定義有關 方式一 方式二 假設定義區間 1 5 的線段樹,很容易看出它們的不同 方式一 方式二 由此初步看來,採用第二種方式定義,可能會在其左邊產生較大的空白區域。實際上也的確如此,為了方便我們的習慣,考慮第一種方式定義情況 對於某一區間 l,r...
線段樹及空間開4倍
下面我們來講解線段樹 線段樹有許多應用,給出乙個序列,可以在任何乙個區間內找到最大,和最小值。可以求區間和等等等等。那麼應用就不多說了。畢竟能到這裡來的我相信都是為了a題,並且了解線段樹的吧!廢話不多說了。線段樹是一種二叉搜尋樹,與區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中...
奇數魔方陣 4N魔方陣 2(2N 1)魔方陣
奇數魔方陣 說明 將1到n 為奇數 的數字排列在nxn的方陣上,且各行 各列與各對角線的和必須相同,如下所示 解法 填魔術方陣的方法以奇數最為簡單,第乙個數字放在第一行第一列的正 然後向右 左 上填,如果右 左 上已有數字,則向下填,如下圖所示。一般程式語言的陣列索引多由0開始,為了計算方便,我們利...