塊狀鍊錶全紀錄

2021-08-17 17:51:20 字數 2529 閱讀 9960

塊狀鍊錶的簡單介紹

塊狀鍊錶,可以說是一種很犯規的資料結構

支援動態的序列加入刪除,詢問區間和之類的操作

同時擁有陣列和鍊錶的優點:

陣列: 所有資料在記憶體中是緊湊儲存的,優點是定位快:o(1)

鍊錶: 通過指標將不同位置的元素鏈結起來:修改快 o(1)

總的來說重要操作只有幾個:

定位,**,插入,合併

塊狀鍊錶基礎操作

雖然說是鍊錶,但是在實現的時候,我們還是用陣列模擬

塊狀鍊錶的空間比較奇怪,每個塊的大小在sq

rt(n

)2−2

sqrt

(n) sqr

t(n)

2−2s

qrt(

n)

,大多數情況下會偏大

初始化

陣列的空間並不優秀,所以我們要時刻節儉,佇列q中記錄的就是可用的結點編號

因此我們申請結點和刪除結點都需要在佇列q的基礎上進行

void init()

int newnode()

void delnode(int t)

在位置p插入一段資料,第一步就是定位

(預設鍊錶起點就是0,鄰接表遍歷,每乙個結點中下標從0開始

void find(int &pos,int &now)     //從第乙個塊開始搜尋,搜尋位置pos所屬的塊的編號  

定位完成後,我們需要將該塊**

不是特別理解memcpy的用法?

簡單來說,如果我們需要把

a a

陣列從i' role="presentation" style="position: relative;">i

i位置開始的長度le

n len

複製到b b

陣列j' role="presentation" style="position: relative;">j

j位置,則 me

mcpy

(b+j

,a+i

,len

) mem

cpy(

b+j,

a+i,

len)

(親測了一下,發現如果是陣列型別只能全部複製,只有字串可以部分copy,難道是我的姿勢不對?)

void fillnode(int

pos,int n,char data,int nxt)

void divide(int

pos,int p)

每次插入刪除之後,我們都要合併一下小結點

void maintain(int

pos) //當前塊與後乙個塊合併

}

大體上來說就是這些東西

**中有些小細節,只要理解到位就沒什麼問題了

記住塊裡的下標從0開始,牽扯到find和divide中的pos一定要大於0

const

int n=1

<<25;

const

int blocksize=20000;

const

int blocknum=n/blocksize*3;

int n;

char s[n+10];

struct node;

node a[blocknum+10];

queue

q;int newnode()

void delnode(int t)

void find(int &pos,int &now)

void fillnode(int pos,int n,char *data,int nxt)

void divide(int now,int pos)

void maintain(int now)

}void insert(int pos,int n)

if (iint t=newnode();

fillnode(t,n-i,s+i,a[now].nxt);

a[now].nxt=t;

}maintain(now);

}void del(int pos,int n)

maintain(now);

}void get(int pos,int n)

if (imemcpy(s+i,a[t].data,n-i);

s[n]=0;

}void init()

只寫過一道個其他演算法結合的題目:塊狀鍊錶+並查集

塊狀鍊錶終極考驗!!!

thrift開發踩坑全紀錄

使用thrift搭建的系統已經穩定執行了一段時間了,該系統是公司的核心流式系統,高峰時qps在40萬。作為目前最流行的rpc框架,thrift不僅提供了通訊協議,同時提供了網路框架,解脫了程式設計師的生產力。thrift也是阿帕奇hadoop系列的rpc實現工具。本文主要聚焦在搭建c 實現的thri...

塊狀鍊錶模板

塊狀鍊錶 下標從0開始 塊大小和塊數設為比sqrt n 稍大 const int n 2000000 10,block sz 4000 100,block num 4000 10 queue que int head char str n struct block g block num int n...

塊狀鍊錶(STL rope)

塊狀鍊錶 stl rope 首先介紹一下塊狀鍊錶。我們都知道 陣列 具有 o 1 的查詢時間,o n 的刪除,o n 的插入。鍊錶 具有 o n 的查詢時間,o 1 的刪除,o 1 的插入。既然陣列和鍊錶各有優劣,那麼我們為何不將鍊錶和陣列組合起來,一起來均攤時間呢?做法就是維護乙個鍊錶,鍊錶中的每...