鏈接:http://www.geeksforgeeks.org/segment-tree-set-1-sum-of-given-range/。這是引用的文字:段樹2 * 2 ^(ceil(log(n))) - 1的數組的內存如何?
我們以segment arr [0。 。 。 N-1]。每次我們將當前的段分成兩半(如果它還沒有成爲長度爲1的段),然後在兩半上調用相同的過程,並且對於每個這樣的段,我們將和存儲在相應的節點中。除最後一層以外,構建的分段樹的所有級別都將完全填充。此外,樹會成爲一個完整的二叉樹,因爲我們總是在每個級別分割兩部分。由於構造的樹總是具有n個葉子的完整二叉樹,因此將有n-1個內部節點。因此節點的總數將是2n - 1.段樹的高度將爲ceil [log(n)]。由於樹是使用陣列和父母和孩子之間的索引表示關係必須保持,分配用於線段樹內存容量將2 * 2 ^(小區(的log(n))) - 1。
如何是分配的內存(上面段的最後一行)那麼多?如果父代碼和子代碼是正確的,它們在代碼中如何存儲?請在此背後推理。如果這是錯誤的,那麼什麼是正確的價值?
是不是有矛盾?正如在第一次提到的那樣,的節點數是2 *(n-1)。接下來就是說總數沒有。的節點是2 * 2 ceil(Log2(n))-1(我理解後面的解釋)。但是,當n不是2的冪時,我們是不是通過考慮2 * 2 ceil(Log2(n))-1來分配額外的內存。是否正確假設分段樹需要2 * n-1數組大小n,因爲2 * n-1是總數。一個完整的二叉樹節點,這就是分段樹所需要的。是對的嗎?如果不是分配2 * 2 ceil(Log2(n))-1的目的是什麼。 – dauntless 2015-02-15 05:03:49
在最後一行我認爲你有一個錯字。它應該是「所以我們基本上需要2的最小功率(不是n),這是n的更大值」 – shshnk 2016-08-17 14:17:42