初識 塊狀陣列

2021-08-14 08:27:46 字數 1210 閱讀 7578

問題

給出乙個長串,然後給出n個操作,操作有兩種,在某個位置插入乙個字元,或者查詢第x個位置上的字元是什麼

對於這個問題,我們有兩種解決方案。

1:陣列

查詢 o(1) 但是插入最壞可以達到 o(len)

2:鍊錶

插入 o(1) 但是查詢最壞也可以達到o(len)

所以如何優化這個問題。

這裡介紹一種資料結構——塊狀陣列

何為塊狀陣列?

普通的陣列,每個節點都是連續的。

而塊狀陣列是把乙個大塊分為若干個小塊,然後連線起來,因此得名塊狀陣列。

陣列塊數*每個塊的最大長度》=總的元素+操作個數,即分塊以後,每個塊都有個增大的空間(讓其大於操作個數即可)

分塊,就是優美的暴力~

如何查詢與插入?

sum[i]為第一塊到第i塊字元的總個數。

再插入時我們可以利用二分快速尋找位置所對應的塊號。

而在查詢時,也是利用二分來查詢塊號輸出。

在最壞情況下=sqrt(str)+n;

在平均情況下=sqrt(str+n);

block_num,塊數:

準確講,=(str+n)/block_len

結合平均情況來講,block_num=block_len=sqrt(str+n)、

**沒用結構體封裝,因為我不喜歡。

初級塊狀陣列,**較短,僅支援插入與查詢操作。

題目鏈結

#include #include #include #include #include #define il inline

using namespace std;

const int maxm=2100;

int block_len,block_num,n;//塊長以及塊數

int sum[maxm];//從1塊到當前塊的總字元個數

char str[1100000];

struct nodeblock[maxm];

il void get_sum()//統計

il void push_in(int id,char s)//初始插入

il void init()

get_sum();

}il char ask(int id,int pos)

int main()

else

}return 0;

}

Poj 2887 Big String 塊狀陣列

塊狀陣列裸題.把鍊錶和陣列的特性結合起來.各個塊互不影響 包括長度 定位的時候看在哪一塊就可以了.各種複雜度都是 n.include include include define maxn 1000010 define maxm 1001 using namespace std int n,m,k,...

Poj 2887 Big String 塊狀陣列

塊狀陣列裸題.把鍊錶和陣列的特性結合起來.各個塊互不影響 包括長度 定位的時候看在哪一塊就可以了.各種複雜度都是 n.include include include define maxn 1000010 define maxm 1001 using namespace std int n,m,k,...

筆記 分塊與塊狀陣列

textsf 對於一系列資料,通過適當的劃分,預處理一部分資訊並儲存下來,用空間換取時間,達到時空平衡。核心思想還是暴力。把乙個整體劃分為若干個小塊,對整塊整體處理,零散塊單獨處理。即 大段維護,區域性樸素 事實上,分塊更接近於 樸素 效率往往比不上線段樹和樹狀陣列,但是他更通用,更容易實現。對我這...