天天看點

線段樹空間複雜度問題

空間消耗: 如果假定原數組的長度為n,那麼線段樹的節點數就設為4*n。  原理:假設n=2^h,則 從第0行(i=0)開始,第i行有2^i個節點,一共有h行,是以節點總數為1+2+4+8+...+2^h=2^(h+1)-1=2*2^h - 1     等于2n-1 , 這時候難道線段樹的空間複雜度就是O(2n-1)嗎?  不是的。 這裡我們假設了n=2^h,但是題目中的n可沒說一定是2的幂次,這導緻最後一行有一些節點沒有用到(如上圖最後一行所示),不過這沒有關系,我們可以多開辟一些空間,這不影響

這時我們可以找一個最小且滿足n<=2^h  的h,這時候就可以說線段數的空間複雜度是(2*2^h - 1)了。

但是常用的并不是這個空間複雜度,而是4*n,這是為什麼呢?

因為開辟空間的時候去判斷最大的h為多少略顯麻煩,事實上我們的空間不用這麼精打細算,可不可以找到一個友善得到的“可行”的空間複雜度呢?

可以這樣考慮:當我們找到一個最小且滿足n<=2^h  的h時,即 2^(h-1) <= n <= 2^h , 是以我們得到 2^h <= 2n , 是以接着上面的結論 複雜度(2*2^h - 1)可以拓展成(2*2n - 1) 即(4*n)。