分桶法(bucketmethod)是把一排物品或者平面分成桶,每個桶分別維護自己內部的資訊,以達到高效計算的目的的方法。
其中,平方分割(sqrtdecomposition)是把排成一排的n個元素每根號n個分在乙個桶內進行維護的方法的統稱。這樣的分割方法可以使對區間的操作的複雜度降至o(根號n)。
和線段樹一樣,根據維護的資料不同,平方分割可以支援很多不同的操作。接下來,和線段樹一樣,我們以rmq為例對平方分割進行詳解。
1. 基於平方分割的rmq
給定乙個數列a1,a2,…,an,目標是在o(根號n)複雜度內實現兩個功能
*給定s,t,求as,as+1,…,at的最小值
*給定t, x,把ai的值變為x。
2.基於平方分割rmq的預處理
令b=floor(根號n),把a中的元素每b分成乙個桶,並且計算出每個桶內的最小值。
3.基於平方分割的rmq的查詢
如下圖所示,查詢
*如果桶完全包含在區間內,則查詢桶的最小值
*如果元素所在的桶不完全被區間包含,則逐個檢查最小值
他們的最小值就是區間的最小值了。
4.基於平方分割的rmq的值的更新
在更新元素的值時,需要更新該元素所在的桶的最小值。這時只要遍歷一遍桶內的元素就可以了。
5.平方分割和線段樹
因此,在平方分割中,對於任意區間,完全包含於其中的桶的數量和剩餘元素的數量都是o(根號n),所以可以在o(根號n)時間內完成各種操作。
在上面的rmq的例題中,線段樹進行各種操作的複雜度是o(logn),比平方分割更快一些。一般地,如果線段樹和平方分割都能實現某個功能,多數情況下線段樹會比平方分割快。但是,因為平方分割在實現上比線段樹簡單,所以如果執行時間限制不是太緊時,也可以考慮使用平方分割。除此之外,也有一些功能是線段樹無法高效維護但是平方分割卻可以做到的。
分桶法和平方分割
分桶法 bucket method 是把一排物品或者平面分成桶,每個桶分別維護自己內部的資訊,以達到高校計算的目的的方法。其中,平方分割 sqrt decomposition 是把排成一排的n個元素每n 1 2 分在乙個桶內進行維護的方法的總稱。這樣的分割方法可以使對區間操作的複雜度降至o n 1 ...
靜態區間第k大(分桶法和平方分割)
poj 2104為例 挑戰程式設計競賽 中介紹的方法。分桶法 把一排物品或者平面分成桶,每個桶分別維護自己內部的資訊,已達到高效計算的目的。設一共有 n個數,每 b個分到乙個桶裡,並對桶內元素進行排序。給定區間,求小於x的數的個數如果b n 那麼這就叫平方分割,查詢過程時間複雜度為o n logn ...
關於分桶法(平方分割)的一些見解
分桶法 給乙個n個元素的陣列a 0.n 分桶法的思想是將這n個元素進行均分,均分成 n組,每組裡有 n個元素,這裡 組 的意思與 桶 等價。這種分法也稱之 平方分割 這樣會帶來哪些處理上的好處呢?其實類似於線段樹,分桶法的思想也是每個桶分別維護各自桶內部的資訊,然後在處理區間問題上帶來快捷。這裡以r...