zoukankan      html  css  js  c++  java
  • 笔记-数据结构进阶

    笔记:数据结构

    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.滑动窗口

  • 相关阅读:
    hibernate的dialect大全
    jdbc.properties 链接各类数据库的基本配置以及URL写法
    Springboot中redis的学习练习
    博客开通了
    Java String类的hashCode()函数
    Java String类中CaseInsensitiveComparator.compare()方法的实现
    git pull远程所有分支
    Python的权限修饰符
    Tmux快捷键
    __future__模块
  • 原文地址:https://www.cnblogs.com/LinearODE/p/10152318.html
Copyright © 2011-2022 走看看