關於線段樹合併的複雜度證明

因爲感覺網上的都怪怪的,所以自己yy了一下。。

假設樹上點數是O(n)O(n),每個點上有一些權值。每個點的權值個數之和是O(m)O(m),線段樹是對權值建的。

考慮一個線段樹上的區間[l,r][l,r]
在合併的時候,只有當兩個線段樹在這個區間內都有點,這個區間纔會貢獻 1 的複雜度。
而考慮這個區間內的權值在原樹上的分佈,假設原樹上共有kk個點含有這個區間內的權值,容易發現最多有k1k-1次合併在兩棵線段樹會同時存在這個區間內的權值。(因爲是樹形合併)。那麼這個區間總共會貢獻O(k)O(k)的複雜度。

然後考慮在線段樹中同一層的所有區間,它們對複雜度的貢獻是
O()O(\sum_{某個區間} 樹上包含這個區間內的權值的點數)
O()=O(m)\le O(\sum_{某個權值}樹上包含這個權值的點數)=O(m)

而線段樹總共有logm\log m層,所以複雜度是小於O(mlogm)O(m\log m)的。

而在一般的問題中,每個點通常只包含一個權值並且互不相同(m=nm=n),所以O()=O()=O(n)O(\sum_{某個區間}樹上包含這個區間內的權值的點數)=O(\sum_{某個區間}區間大小)=O(n),於是複雜度爲O(nlogn)O(n\log n)

由此也可以見得,如果每個點都有O(n)O(n)個權值,那麼複雜度將會是O(n2+n22+n24+n2n)=O(n2)O(n^2+\frac {n^2}2+\frac {n^2}4+\frac {n^2}n)=O(n^2)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章