分塊演算法詳解

2021-08-10 05:41:57 字數 2501 閱讀 1666

分塊演算法

———————————————————-

1.思想

如果我們需要對乙個特定的序列進行操作,那麼非常直觀、簡單的方法就是純暴力(不,那叫模擬)。

不過如果暴力能過的話,那就呵呵了。

所以我們要想一些比較高能的資料結構——分塊。

相比線段樹來說,分塊演算法比較難實現,但是只要深入理解,就可以實現了,只不過需要一些資料結構的輔助。

分塊實質來說就是把乙個序列切分,從而實現對查詢、查詢、替換等等操作的高效處理。

———————————————————-

2.輔助結構

我們知道,陣列的單點查詢時間為o(1),而插入為o(n)

鍊錶的單點查詢時間為o(n),而插入為o(1)

而在noip裡,vector總體來說是比陣列快的,所以我們可以用vector來儲存每塊,只不過如果讓插入也這用vector的話,那麼時間就不可理喻了。

插入的話,我們可以使用pair

通常要定義這兩個資料結構,簡單的話那個pair就不用了,這要根據題意定義。

———————————————————-

3.模版

操作:建塊(rebuild)

注意:一開始不必要建塊,但是要在過程中將序列分塊

用途:當當前塊太大時,可以使用此函式將乙個大塊**?1

2

3

4

5

6

7

8

9

10

11

12

13

14

voidrebuild()

intblo2=sqrt(top);

for(inti=1;i<=top;i++)

ve[(i-1)/blo2+1].push_back(st[i]);

m=(top-1)/blo2+1;

}

操作:區間加法(add)

用途:在需要操作區間加法時可以使用?1

2

3

4

5

6

7

8

9

10

voidadd(inta,intb,intc)

操作:插入

注意:自己可以控制塊的大小

用途:插入元素?1

2

3

4

5

6

7

voidinsert(inta,intb)

常用的分塊只有這幾個操作,更多操作可見hzwer

你——悟到了麼?

感謝 的部落格還有黃學長qwqorz

詳解? 分塊 未完

不得不說,分塊真是一種優雅的暴力。畢竟人家就是可以暴力掃 部分統計來做到根號複雜度,還能順手解決區間眾數這種線段樹不好解決的問題 博主的分塊全是跟著黃學長的部落格學的,所以本文不應該叫詳解,頂多是我對分塊的看法 我做分塊九題的心得體會 畢竟學長已經寫得非常好了 在此還是表達一下對黃學長的敬仰和感謝 ...

查詢演算法 分塊演算法

查詢演算法 分塊演算法 查詢演算法主要有三種 線性查詢 二分查詢 分塊查詢 線性查詢效率最慢,可對無序列表進行查詢 二分查詢效率最快,只能針對有序列表進行查詢 分塊查詢的思路 分塊查詢中,每個塊中元素不一定有序的,塊間是有序的。分塊又稱索引順序查詢,這是順序查詢的一種改進方法,用於在分塊有序表中進行...

分塊演算法總結

分塊演算法顧名思義,就是將乙個序列分成若干個部分 塊 來解決 線段樹也可以解決分塊的問題,但這裡只介紹分塊演算法 說是分塊,那麼一共要分幾塊呢?據機房dalao說,分成sqrt n 為每塊長度 這樣一來,假設有n個元素的序列,就有 ceil n sqrt n 塊 核心的資料結構 struct blo...