考研系列之三-数据结构杂集

1.线性表顺序表倒置算法:

int len=strlen(l);

int i=0;

while(i<len/2){

int tmp=l[i];

l[i]=l[len-i-1];

l[len-i-1]=tmp;

}

2.画二叉排序树

每次与子树根节点比较,从而向下左右选择移动,左小右大。

中序遍历可得到有序序列。

3.线索二叉树

1)  扩展结点结构,增加两个标志域,以记录左右孩子域记录的为孩子还是前驱后继。标志域为0,表示指示孩子;为1,表示指示前驱后继。另外,增设一头结点,其数据域不存储数据,左孩子域指向二叉树根结点,右孩子域指向遍历的最后一个结点,故而LTag为0,RTag为1。而二叉树在某种遍历下的第一个结点的前驱以及最后一个结点的后继都指向该头结点。

2)  找前驱后继(以中序为例)

Node InPreNode(Node p){

Node pre=p->lchird;

if(p->LTag!=1)

while(pre->RTag!=1)        pre=pre->rchild;

return pre;

}

Node InPostNode(Node p){

Node post=p->rchird;

if(p->RTag!=1)

while(post->LTag!=1)       post=post->lchild;

return post;

}

4.平衡二叉树→对二叉排序树进行调整

每个结点的左右子树深度差不超过1。(左减右)

5.大小顶堆(以小顶堆为例)

1)所有双亲的值均不大于左右孩子

2)筛选算法:

Void f1(type *a, int k, int n){ //a[k]为双亲结点

int i=k, j=i*2, x=a[i], status=false;

while(j<n&&status==false){

if(j<n&&a[j]>a[j+1])          j++;

if(x<=a[j])  status=true;

else  { a[i]=a[j]; i=j; j*=2;}

}

a[i]=x;

}

3)建堆:按层次遍历顺序的逆序,倒着对每个双亲对应子树进行筛选。

Void f2(type *a){

for(int i=n/2;i>=1;i--)         f1(a,i,n);

}

4)堆排序:每次取走堆顶元素,然后用最后一个元素(按层次遍历顺序)代替堆顶元素,进而筛选。依次循环。

Void f3(type *a,int n){

int I,m=n;

f2(a);

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

s[i]=a[1];

a[1]=a[m--];

f1(a,1,m);

}

}

6.求树的深度

int depth(node t){

if(t==NULL) return 0;

if(t->lchild==NULL&&t->rchild==NULL) return 1;

int dl=depth(t->lchild);

int dr=depth(t->rchild);

return 1+max(dl,dr);

}

7.深度为k的二叉树至多有2^k -1个结点,至少为2^(k-1)个结点。

8.最短路径:有权图 Dijkstra

Void Dijkstra(){

Dis[start_node]=0;

For(int k=1; k<=node_num;k++){

Int x,m=INF;

For(int i=1;i<=node_num;i++)  if(!b[i]&&dis[i]<m)  m=dis[x=i];

B[x]=1;

For(int i=node_first[x];i!=-1;i=node_next[i]){

If(!b[node_end[i]]&&dis[node_end[i]]>dis[x]+node_value[i]){

Dis[node_end[i]]=dis[x]+node_value[i];

Node_fa[node_end[i]]=x;

}

}

}

Cout<<dis[final_node]<<endl;

}

Void Road(){

For(int i=final_node;i!=start_node;i=node_fa[i])

road[road_len++]=I;

}

9.最小生成树

1)  Prim 复杂度为O(n*n) 适合边稠密的图

Int Prim(){

Int ans=0;

For(int i=1;i<=node_num;i++)          choose[i]=0,distance[i]=INF;

Distance[1]=0;

For(int i=1;i<=node_num;i++){

Int x=-1;

For(int j=1;j<=node_num;j++)

If(!choose[j])

If(x==-1)  x=j;

Else if(distance[j]<distance[x])   x=j;

Choose[x]=1;

Ans+distance[x];

For(int j=1;j<=node_num;j++)

If(!choose[j]&&a[x][j]!=INF){

Distance[j]=min(distance[j],a[x][j]);

}

}

Return ans;

}

2)Kruskal 复杂度为O(eloge) e为边的数目 适合边稀疏的图

Inline int cmp(cons tint &a,cons tint &b) { return node_w[a]<node_w[b];}

Inline int find(int x){ return p[x]==x?x:p[x]=find(p[x]); }

Int Kruskal(){

Int ans=0;

For(int i=1;i<=node_num;i++)           p[i]=i;

For(int i=1;i<=edge_num;i++)           r[i]=i;

Sort(&r[1],&r[edge_num+1],cmp);

For(int i=1;i<=edge_num;i++){

Int e=r[i];

Int x=find(node_u[e],y=find(node_v[e]);

If(x!=y)               ans+=node_w[e],p[x]=y;

}

Return ans;

}

10.哈希表对应平均查找长度(ASL)

11.排序算法的时空复杂度

时间: 2024-10-24 15:15:56

考研系列之三-数据结构杂集的相关文章

[考研系列之数据结构]线性表之队列

基本概念 队列的定义 队列是一种只能在表的一头插入,另一头删除的线性表,简而言之具有FIFO的特性 组成 队头 队尾 扩展 双端队列 只能在两端进行删除插入操作的线性表 实现 链队列 顺序队列 循环队列 循环队列 循环队列是将顺序队列臆造成一个环,如图 循环队列有以下参数 front 指向队头的指针 rear 指向队尾的指针 SIZE 循环最大队列长度 对于循环队列,初始状态的时候 front=rear=0; 每次insert的时候 Insert((front++)%SIZE); 那么,当循环队

[考研系列之数据结构]线性表之栈

?基本概念 栈的定义 限定仅在表尾进行插入或删除的线性表 组成 栈顶 栈底 基本操作 入栈(PUSH) 往栈中插入一个元素 弹栈(POP) 从栈顶删除一个元素 栈的表示 顺序栈 链栈 对于顺序栈,有两个指针base和top base指向栈底 top指向栈顶 对于栈的一些基本情况: 栈不存在时候 base=NULL 栈为空时  top=base 栈的长度 top-base 链栈略过. 栈的应用 1 数制转换 数制转换我们使用一种称之为"辗转相除法"的算法.此算法的基本原理基于: N=(N

[考研系列之数据结构]线性表之字符串

基本概念 串(字符串)  由0个或多个字符组成的有限序列,例如s="hello world" 串名  上例中的s 子串  某串任意连续字符组成的子序列,称为此字符串的子串 空串  0个字符的串,s="" 空格串  由一个或多个字符组成的串 模式匹配算法 作用 定位某子串T在字符串S中的位置 主串 S 模式串  T 针对模式匹配算法从简到难我们需要了解两种算法: [1] 朴素的模式匹配算法 [2] KMP匹配算法 朴素的模式匹配算法: 所谓朴素就是简单,这是一种简单的

[考研系列之数据结构]线性表概述

1.脑图 2.表示方法 按照数据结构概述所说,线性表有两种表示方法分别是顺序表示和链式表示,链表就是链式表示的典型. 我们知道链式表示是分配了n块内存空间,可以认为彼此不连续,所以不能用偏移量去定位每个元素. 下面就先说最简单的单向链表: 如果每个数据元素能有一个指针指向下一个元素的话,那么只需要知道第一个数据元素就能一个一个的遍历整个链表了,这就是单向链表. 对于每个链表元素我们称之为节点,每个节点都有两个域:数据域&指针域 数据域就是数据元素所在的区域,而指针域则是存储指向另一个节点的指针的

[考研系列之数据结构]线性表之链表

1.链表分类 通过线性表概述,我们知道了链表这样一种数据结构,它又分成三类,分别是 单向链表 循环链表 双向链表 单向链表 单向链表的指针域只有一个指向下一个节点的指针,需要注意几点: 1.头指针--指向第一个节点 2.最后一个结点的指针指向NULL 3.头结点--在链表的第一个结点之前附设一个结点,它的数据域为空 所以,我们看到:  单向链表为空的<=>链表有且只有一个头结点<=>头结点的指针指向NULL 循环链表 循环链表和单向链表最大的不同就是:最后一个结点的指针不再指向NU

[考研系列之数据结构]数据结构概述

1.脑图 2.数据结构 2.1 抽象数据类型 表示法: (D,S,P) D:数据对象 S:D上的关系集 P:对D的基本操作集 ADT格式 ADT 抽象数据类型名{ 数据对象:<数据对象定义> 数据关系:<数据对象的定义> 基本操作:<基本操作的定义> }ADT 抽象数据类型名 基本操作的格式: 基本操作名(参数表) 初始条件:<初始条件描述> 操作结构:<操作结果描述> 2.2 分类 2.2.1 按值的不同特性 原子类型的值是不能分解的,如C中基

完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三

手把手叫你玩转网络编程系列之三    完毕port(Completion Port)具体解释                                                              ----- By PiggyXP(小猪) 前 言 本系列里完毕port的代码在两年前就已经写好了,可是因为许久没有写东西了,不知该怎样提笔,所以这篇文档总是在酝酿之中--酝酿了两年之后,最终决定開始动笔了,但愿还不算晚-.. 这篇文档我很具体而且图文并茂的介绍了关于网络编程模型中完毕

R语言数据分析系列之三

R语言数据分析系列之三 -- by comaple.zhang 上次讲了vector这次讲matrix,array,dataframe,ts 数据结构 matrix 矩阵 R语言中矩阵可以理解为是由两个及两个以上的向量组成. 矩阵创建 从向量创建 > x <- sample(1:100,16) > x [1] 14 43 89  3 96 58 61 75 33 66 24 54 45 15  6 44   > m <- matrix(x)   > m         

SCCM 2012 R2实战系列之三:独立主站点部署

3.1 SCCM 2012 R2主站点的安装 SCCM 2012 R2跟以前的SCCM 2007不同的是多了一个管理中心站点的角色, 管理中心站点主要负责SCCM管理控制和报表查看. 主站点跟以往的SCCM 2007主站点功能一样,具备软件分发.系统部署等主要功能,一个管理中心站点下可以有多个主站点,主站点的关系可以是并列的. 在SCCM服务器中放入SCCM2012的安装光盘,以域管理员身份登录.如下图所示,在安装光盘的smssetup\bin\X64目录下找到extadsch.exe,双击运行