筆記 資料結構進階

2022-08-05 14:09:10 字數 2179 閱讀 8396

資料的存放方式,體現了資料結構

資料結構=資料+結構,結構指儲存、操作、關係。

若用set儲存,則需要用insert插入元素,因為set是一顆紅黑樹。

由於set裡面元素單調,可用\(o(\log)\)二分法查詢,

陣列:連續的一段儲存空間

可\(o(1)\)查詢特定編號的元素,

連結串列:鏈式結構

若動態指標實現,則可以做到:

struct node;

node *head;

核心**:

head=new node;

r=head;//r是一個工作指標,也就是“掃描頭”

while(cin>>x)

1.動態分配記憶體空間

2.快速插入一個節點

//在p和q之間插入數值x

node *r=new node;

r->data=x;

r->next=&q;

p.next=r;

若用靜態陣列來描述連結串列,則用\(data_i\)表示第i個元素的data值,用\(next_i\)表示第i個元素的下一個元素值

應用:鏈式前向星

struct nodev[nmax];

struct edgee[mmax];

實現:

void add(int u,int v,int w)

棧:filo

應用:進位制轉換,括號匹配,中綴表示式轉字尾

\(3*8-(6-2)/(3+4)\) ==> \(3,8,*,6,2,-,3,4,+,/,-\)

\(f(t)=-ce^+\intdt}\) ==>

\(t,f=-c,-k,t,*,exp,*,t,f_e,-k,t,*,exp,*,\int,+\)

表示式壓棧規則:

\(op(v)=\beginpop(),\text(v)

單調棧:

\(op(v)=\beginpop(),v

這樣棧裡的元素就是單調的了。

e.g.histogram

給出一個柱狀統計圖,他的每一個專案的寬度是1,高度和具體問題有關,求柱狀圖中最大長方形面積。

即:給定\(\\),求出\(ans=\max\limits_

其中\(h_=\min\limits_\leq}a_\)

int top=0,s[maxn];

int area=0;

for(int i=1;i<=n;i++)

e.g.求最長不下降子序列優化單調棧:\(\text(i,x)=\begin\text(i-1,x),v>s_i\\s_i=v,else\end\)

佇列:fifo

e.g.集合劃分

給定集合\(a=\\)和由01矩陣構成的衝突關係\(r_=\begin0,\text\\1,\text\end\),且\(r_=r_\),\(r_=0,i,j=1,2,...,n\),將\(a\)劃分成\(k\)個互不相交的子集,且對於任意子集\(a_i\)和\(x,y\in\),都有\(r_=0\),求出使得k最小的劃分方案。

分析:申請以下變數:

int r[nmax][nmax];//衝突矩陣

int newr[nmax];//工作陣列

int cq[nmax];//迴圈佇列

int result[nmax];//記錄分組數

int group=1;//記錄總共組數

工作過程:

\((1)\ cq_i\gets\quad newr\gets}\quad result\gets}\)

\((2)\ newr_i\gets}\)

\((3)\ v\gets}\quad cq.\text\)

\(\quad \text(v)=\begin\text(v),\quad r_=1\\newr_i\gets,\quad else\end\)

$(4)\ \mu \ \text\ cq \ \text $

e.g.滑動視窗