笔记-数据结构进阶

笔记:数据结构

1.语言+算法+数据结构=信息奥赛

数据的存放方式,体现了数据结构
数据结构=数据+结构,结构指储存、操作、关系。

2.线性结构

2.1集合的表示

若用set储存,则需要用insert插入元素,因为set是一颗红黑树。
由于set里面元素单调,可用(O(log{n}))二分法查找,

数组:连续的一段储存空间

(O(1))查询特定编号的元素,

链表:链式结构

若动态指针实现,则可以做到:

struct node{
	int data;
    node *next;
};
node *head;

核心代码:

head=new node;
r=head;//r是一个工作指针,也就是“扫描头”
while(cin>>x){
	p=new node;
    p->data=x;
    p->next=NULL;
    r->next=p;
    r=p;
}

应用:图的链接表储存法

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 node{
	int data;
}V[nmax];
struct edge{
	int to,w,next;
}E[mmax];

实现:

void add(int u,int v,int w)
{
	E[++cnt].next=head[u];
    E[cnt].to=v;
    E[cnt].w=w;
    head[u]=cnt;
}

栈:FILO

应用:进制转换,括号匹配,中缀表达式转后缀

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

(f(t)=-ce^{-kt}+int{f_e(t)e^{-kt}dt}) ==>

(t,f=-c,-k,t,*,exp,*,t,f_e,-k,t,*,exp,*,int{dt},+)

表达式压栈规则:
(op(v)=egin{cases}pop(), ext{pri}(v)< ext{pri}(s.head())\push(v),elseend{cases})

单调栈:
(op(v)=egin{cases}pop(),v<s.head()\push(v),elseend{cases})

这样栈里的元素就是单调的了。

e.g.Histogram

例题图

给出一个柱状统计图,他的每一个项目的宽度是1,高度和具体问题有关,求柱状图中最大长方形面积。

即:给定({a_i}),求出(ans=maxlimits_{1leq{j}<ileq{n}}{{(j-i+1)*h_{i,j}}})

其中(h_{i,j}=minlimits_{ileq{mu}leq{j}}a_{mu})

int top=0,s[maxn];
int Area=0;
for(int i=1;i<=n;i++)
{
	while(top&&h[s[top]]>=h[i])
    	--top;
    L[i]=(top==0?1:s[top]+1);
    s[++top]=i;
}

e.g.求最长不下降子序列

优化单调栈:( ext{insert}(i,x)=egin{cases} ext{insert}(i-1,x),v>s_i\s_i=v,elseend{cases})

队列:FIFO

e.g.集合划分

给定集合(A={a_n})和由01矩阵构成的冲突关系(R_{ij}=egin{cases}0, ext{i,j无冲突关系}\1, ext{i,j有冲突关系}end{cases}),且(R_{ij}=R_{ji}),(R_{ii}=0,i,j=1,2,...,n),将(A)划分成(k)个互不相交的子集,且对于任意子集(A_i)(x,yin{A_i}),都有(R_{xy}=0),求出使得k最小的划分方案。

分析:申请以下变量:

int R[nmax][nmax];//冲突矩阵
int newr[nmax];//工作数组
int cq[nmax];//循环队列
int result[nmax];//记录分组数
int group=1;//记录总共组数

工作过程:

((1) cq_igets{A_i}quad newrgets{{0}}quad resultgets{{0}})

((2) newr_igets{R_{mu,i}})

((3) vgets{cq. ext{head()}}quad cq. ext{pop()})

(quad ext{op}(v)=egin{cases} ext{push}(v),quad R_{mu,v}=1\newr_igets{R_v,i},quad elseend{cases})

$(4) mu ext{from 1 to n do (1) to (3) until} cq ext{is empty} $

e.g.滑动窗口

原文地址:https://www.cnblogs.com/LinearODE/p/10152318.html