【数据结构】数据结构复习指导

第一章 绪论

重要知识点:

时间复杂度的求解

一个算法的执行时间大致上等于其所有语句执行时间的总和,对于语句的执行时间是指该条语句的执行次数和执行一次所需时间的乘积。所以,可用算法中语句的执行次数来度量一个算法的效率。

我们可以人工计时或插入测量时长的代码来计算一个程序实际上跑了多久。

然而,用实际运行时长来比较两种算法是无意义的,因为它们可能用不同的语言编写,用不同的数据实例,或用了不同的电脑来运行。

◼注意:语句执行一次实际所需的具体时间是与机器的软、硬件环境(机器速度、编译程序质量等)密切相关,与算法设计的好坏无关。

算法时间复杂度的分析
找出运算所需时间和输入规模之间的函数关系。
•输入数据规模的度量模型

通常用输入数据中数字的个数,或输入的集合中元素的个数,n,作为输入的大小。

•运算时间的度量用算法中一个主要的基本运算被执行的次数作为时间复杂度。

度量一个算法的效率应抛开具体机器的软硬件环境(书写程序的语言、编译产生的机器代码质量、机器执行指令的速度属于软硬件环境)。

对于一个特定算法只考虑算法本身的效率,算法自身的执行效率是问题规模的函数。

对同一个问题,选用不同的策略就对应不同的算法,不同的算法对应有各自的问题规模函数,根据这些函数就可以比较(解决同一个问题的)不同算法的优劣。

为什么这样做?
大大简化分析的工作。

◼与实际复杂度之间最多差一个常数因子。这是因为:

(1) 任一语言只提供常数个基本运算。

(2) 不同基本运算所需时间相差一个常数倍。

(3) 通常,一个基本运算所需时间不因数据大小而不同。

◼复杂度好坏取决于输入规模n→时,其增长的快慢。

◼差常数倍因子的两个复杂度函数认为是等阶的。

◼高阶与低阶的两个复杂度在n→时,它们之比一定无界。

◼为了理论上正确和方便,要求算法必须允许有n→的输入规模

三个数量级的时间复杂度
T(n)随n的增大而增大,增长的越慢,其算法的时间复杂度越低。下列三个程序段中分别给出了原操作count++的三个不同数量级的时间复杂度。

(1)count++ ;其时间复杂度为O(1),称之为常量阶时间复杂度。

(2)for (i=1; i<= n; i++) count++; 其时间复杂度为O(n),是线性阶时间复杂度。

(3)for (i=1; i<= n; i++)for (j=1;j<= n; j++) count++; 其时间复杂度为O(n2),平方阶时间复杂度。

求下列算法的时间复杂度。

1.

int prime(int n)

{ for(i=2; i*i<n; i++)

if(n%i==0) return 0;

return 1;

}

答:O(n^{1/2})

2.

long sun( int n )

{ s=0;

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

{ for( p=1, j=1; j<i; j++)

p=p*j ;

s+=p ;

}

return s;

}

答:O(n^{2})

 2 线性表

重要知识点:

1顺序表的插入、删除;

线性表的定义

   线性表(linear list)是一种最简单且最常用的数据结构。一个线性表是n(n>=0)个具有相同类型的数据元素构成的有限序列(a1,a2,...,an)。其中元素的个数n定义为线性表的长度,当n=0时称为空表,空表中没有任何数据元素。

顺序表的定义
顺序表是线性表的顺序存储表示的简称,它指的是,用一组地址连续的存储单元依次存放线性表中的数据元素,即以存储位置的相邻表示位序相继的两个数据元素之间的前驱和后继(线性)的关系(逻辑关系),并以表中第一个元素的存储位置作为线性表的起始地址,称作线性表的基地址。其特点是逻辑上相邻的数据元素,其物理(存储)位置也是相邻的。

插入算法的基本操作是l->elem[k+1]=l->elem[k],即数据元素的后移,它出现在for循环中。与查找算法类似,该操作的执行次数取决于插入元素在线性表中的位序。同样,设Pi为等概率插入时在第i(0≤i≤l->listlength)个位置上插入元素的概率,即Pi=1/(n+1),i=0,1,...,n(长度为n的线性表具有n+1个插入位置)。设Eins为在长度为n的线性表中插入一元素时所需的元素的平均移动次数,则:算法的平均时间复杂度为:O(n)。

删除运算
删除l中的第i个数据元素(DelList(l,i)),使得线性表(a1,..., ai-1, ai, ..., an) 改变为(a1,...,ai-1, ai+1, ...,an)。即:改变了线性表中元素之间的关系,使<ai-1,ai>和<ai,ai+1>改变为<ai-1,ai+1>,同时表长减1。

插入算法类似,Edel为在长度为n的表中删除一元素时所需的元素的平均移动次数,则:其中Pi为等概率情况下删除第i个元素的概率。所以算法的平均时间复杂度为:O(n)

2、链式线性表的插入、删除

  单链表的链式存储结构,简称链表,是用一组任意的存储单元(这组存储单元可以是连续的,也可以是不连续的)存储线性表中的数据元素。

因此,为了表示每个数据元素ai与其直接后继数据元素ai+1之间的逻辑关系,对数据元素ai来说,除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置)。

特点:用一组可能连续,也可能不连续的任意存储单元存放线性表中的数据元素。

元素之间的逻辑联系通过指向直接后继的指针来体现;

指针next本身并不是数据元素的成分。

出于对操作上方便的考虑,在第一个结点之前附加一个“头结点”,令该结点中指针域的指针指向第一个结点,并令头指针指向头结点。单链表的插入运算,需要修改两个指针域,首先遍历单链表,找到插入的位置。然后新建结点域,将插入结点的指针指向插入位置的下一个结点,然后插入位置的结点的指针指向插入结点,就完成了单链表的插入运算。

单链表的删除运算只用修改指针域。首先遍历单链表,找到删除位置,将删除位置的指针指向删除位置的下下个结点,然后释放删除位置的数据域。

 3 栈和队列

重要知识点:

1、栈的创建、入栈和出栈;

后进先出(Last In First Out,LIFO)的线性序列,称为“栈”。栈也是一种线性表,只不过它是操作受限的线性表,只能在一端进出操作。进出的一端称为栈顶(top),另一端称为栈底(base)。栈可以用顺序存储,也可以用链式存储,分别称为顺序栈和链栈。

3.1 堆栈

3.1.1 堆栈的定义及基本运算

堆栈简称为栈,是限定只能在表的一端进行插入和删除操作的线性表。在表中,允许插入和删除的一端称作“栈顶”,另一端称作“栈底”。通常将元素插入栈顶的操称作为“入栈”(进栈或压栈),称删除栈顶元素的操作为“出栈”)表.

2、队列的创建、入队和出队

队列
限定操作的线性表;

队列的定义及运算

•队列简称为队,是限定只能在表的一端作插入运算、在另一端作删除运算的线性表;

•在表中,允许插入的一端称作“队尾”,允许删除的另一端称作“队首”(或“队头”);

•通常将元素插入队尾的操作称作为入队列(或入队),称删除队首元素的操作为出队列(或出队)。

1)以下数据结构中元素之间为线性关系的是( D )。

A 

B 队列

C 线性表

D 以上都是

2)经过以下栈运算后,x 的值是( A )。

InitStack(s);

Push(s,a);

Push(s,b);

Pop(s,x);

GetTop(s,x);

A a

B b

C 1

D 0

3)设一个栈的输入序列是 a,b,c,d, 则借助一个栈所得到的输出序列不可能是( D

A a,b,c,d

B d,c,b,a

C a,c,d,b

D d,a,b,c

4)设循环队列中数组的下标是 0----N-1,已知其队头指针 f 和队中元素个数 n 则队

尾指针 r 为( C )。

A f-n

B (f-n)%N

C (f+n)%N

D (f+n+1)%N

5)五节车厢以编号 12345 的顺序进入铁路调度站(入栈),可以得到的编组顺序

是( C 

A 34512 B 24135

C 35421 D 13524

 4 

重要知识点:串的模式匹配

练习:

设目标串为 s=”abcaabbcaaabababaabca”,模式串为 p=”babab”,

 next[1]=( ) ,

next[2]=( )

next[3]=( ), next[4]=( ),next[5]=( ), nextval[1]=( ), nextval[2]=( ), nextval[3]=( ), nextval[4]=( ), nextval[5]=( ).

答:

 5 数组和广义表

重要知识点:

1、多维数组的存储方式

2、稀疏矩阵(含特殊矩阵)的存储方式

3、广义表的求头尾运算

4、广义表的头尾链接存储和孩子兄弟链接存储的图形表示

练习:

1、已知二维数组 A[5][7] , 其每个元素占 4 个存储单元,且 A[0][0]的存储地址

 1100,试 求出元素 A[3][5]的存储地址(分别讨论以行为序和以列为序存储

时的结论)。

答:

以行为序:1100+3*7+5* 4 = 1204

以列为序:1100+5*5+3*4 = 1212

2、求下列广义表的结果。()

(1) GetHead (p, h, w) 

(2) GetTail  (b, k, p, h) 

(3) GetHead ((a, b), (c, d)) 

(4) GetHead GetTail ( (a, b), (c, d) ) 

答:

1p

(2) (k, p, h)

(3) (a, b)

(4) (c, d)

3、分别用书中图 5.8 和图 5.10 的结构(即列表的头尾链表表示和列表的扩展

线性链表表示), 画出下列广义表的存储结构图。

( ( ( ) ) , a, ( (b, c) , ( ) , d ) , ( ( ( e ) ) ) )

 6  树和二叉树

重要知识点:

1、二叉树的先序、中序和后序遍历

树的基本定义

树型结构是一种非线性结构,它的数据元素之间呈现分支、分层的特点

树(Tree)是由n(n≥0)个结点构成的有限集合T,当n=0时T称为空树;否则,在任一非空树T中:

(1)有且仅有一个特定的结点,它没有前驱结点,称其为根(Root)结点;

(2)剩下的结点可分为m(m≥0)个互不相交的子集T1,T2,...,Tm,其中每个子集本身又是一棵树,并称其为根的子树(Subtree)。

注意:树的定义具有递归性,即“树中还有树”。树的递归定义揭示出了树的固有特性

顺着某一条搜索路径巡访二叉树中的结点,使得每个结点均被访问一次,而且仅被访问一次。

   “访问”的含义可以很广,如:输出结点的数据、判断结构信息等。

“遍历”是任何类型均有的操作,对线性结构而言,只有一条搜索路径(因为每个结点均只有一个后继),故不需要另加讨论。而二叉树是非线性结构,每个结点有两个后继,则存在如何遍历即按什么样的搜索路径遍历的问题。

           对“二叉树”而言,可以有三条搜索路径:1.先上后下的按层次遍历;2.先左(子树)后右(子树)的遍历;3.先右(子树)后左(子树)的遍历。

(1)先序遍历若二叉树为空,则空操作;否则依次执行以下操作;

访问根结点;

先序遍历根结点的左子树;

先序遍历根结点的右子树;

(2) 中序遍历若二叉树为空,则空操作;否则依次执行以下操作:

中序遍历根结点的左子树;

访问根结点;

中序遍历根结点的右子树;

(3) 后序遍历若二叉树为空,则空操作;否则依次执行以下操作:

后序遍历根结点的左子树;

后序遍历根结点右子树;

2、一般树与二叉树的互转

3、已知二叉树的中序遍历次序,然后知道先序或后序遍历次序,要求恢复一棵

二叉树。

4、赫夫曼树的构造和赫夫曼编码的实现

最优树的定义

1树的路径长度定义为:

树中每个结点的路径长度之和。

2结点的路径长度定义为:

从根结点到该结点的路径上分支的数目。

3树的带权路径长度定义为:树中所有叶子结点的带权路径长度之和

在所有含n 个叶子结点、并带相同权值的m 叉树中, 必存在一棵其带权路径长度取最小值的树,称为“最优树”

如何构造最优树(赫夫曼算法) 以二叉树为例:

(1)根据给定的n 个权值

{w1, w2, ..., wn}

构造n 棵二叉树的集合

F= {T1, T2, ... , Tn}其中每棵二叉树中均只含一个带权值为wi 的根结点,其左、右子树为空树;

(2)

在F 中选取其根结点的权值为最小的两棵二叉树,分别作为左、右子树构造一棵新的二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和;

(3)从F中删去这两棵树,同时加入刚生成的新树;

(4)重复(2)和(3)两步,直至F 中只含一棵树为止

 7  

重要知识点:

1、图的邻接矩阵和邻接表的表示方法

图的定义:图Graph是由一个顶点集V 和一个弧(边)集E构成的数据结构,记作Graph = (V, E)。其中,图的顶点为数据结构中的数据元素,弧(边)的集合E是定义在顶点集合V上的一个关系。

图(Graph)——图G是由两个集合,V(Vertex)和E(Edge)组成的,记为G=(V,E)其中:V是顶点的非空有限集E是边的有限集合,边是顶点的无序对或有序对

•有向图——有向图G是由两个集合V和E组成的其中:V是顶点的非空有限集E是有向边(也称弧)的有限集合,弧是顶点的有序对

记为<v,w>,v,w是顶点,v为弧尾,w为弧头

•无向图——无向图G是由两个集合V和E组成的其中:V是顶点的非空有限集E是边的有限集合,边是顶点的无序对

记为(v,w)或(w,v),并且(v,w)=(w,v)

由于“弧”是有方向的,因此称由顶点集和弧集构成的图为有向图。用有序对<v,w>表示从v 到w 的一条弧,并称v 为弧头,w 为弧尾。

图的存储:

例如用邻接表

m                                         

一、图的数组(邻接矩阵)存储表示

二、图的邻接表存储表示

2、图的深度优先搜索和广度优先搜素的工作原理

从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中的每个顶点仅被访问一次的过程。

一、深度优先搜索二、广度优先搜索三、遍历应用举例

与树的遍历类似,我们希望从图中某一顶点出发访遍图中其余顶点,且使每一个顶点仅被访问一次。这一过程就叫做图的遍历(traversing graph)。

图的深度优先遍历的思想是:假设初始状态是图中所有顶点未曾被访问,从图中某个顶点v0出发,访问顶点v0。然后依次从v0的未被访问的邻接点出发深度优先遍历图,直至图中所有和v0有路径相通的顶点都被访问到;若此时图中还有顶点未被访问,则另选图中一个未被访问的顶点作为起始点,重复执行上述过程,直到图中所有的顶点都被访问过。

二、广度优先搜索遍历图

对连通图,从起始点V到其余各顶点必定存在路径。

从图中的某个顶点V0出发,并在访问此顶点之后依次访问V0的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和V0有路径相通的顶点都被访问到。

若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

3、用普里姆(从 v1 出发)和克鲁斯卡尔算法网络的最小生成树的方法和过程

 9  查找

重要知识点:

1、二分查找(折半查找)的的算法思想和编程实现

查找又称检索,就是确定一个已给的数据是否出现在某个数据表中。

在计算机中,查找主要分为静态查找、动态查找和哈希查找。静态查找主要是指静态查询某个“特定的”数据元素是否在查找表中,或检索某个“特定的”数据元素的各种属性;动态查找是指在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已存在的某个数据元素;哈希查找则利用哈希函数,通过计算求取待查元素的存储地址

关键字是数据元素(或记录)中某个数据项的值,用以标识(识别)一个数据元素(或记录)。若此关键字可以识别唯一的一个记录,则称之谓“主关键字”。若此关键字能识别若干记录,则称之谓“次关键字”

对于查找算法,把对关键字的最多比较次数叫做最大查找长度(MaximumSearchLength),简记MSL。把对关键字的平均比较次数叫做平均查找长度(AverageSearchLength),简记ASL。

9.2.2  折半查找
算法思路:每次把要找的给定值K与有序表中的中间位置的关键字值进行比较。

中间位置的数据的序号为mid=(1+n)/2。

若K=r[mid].key,则查找成功,返回该元素下标mid,结束查找;

若K<r[mid].key,在左半部分继续使用折半查找;

若K>r[mid].key,对右半部分继续使用折半查找。

例如key=21的查找过程

折半查找判定过程可用一棵二叉树来描述。

折半查找的过程就是从判定树的根结点开始到该记录结点的查找过程。

可根据二叉树计算平均查找次数。

折半查找的性能分析

•判定树:描述查找过程的二叉树。

•有n个结点的判定树的深度为[log2n]+1

•折半查找法在查找过程中进行的比较次数最多不超过[log2n]+1

2、二叉排序树的构成和查找

9.3.1二叉排序查找表

1.二叉排序树的定义和特点定义:二叉排序树BST(Binarysorttree)是空树或是具有以下性质的二叉树:

1、若左子树非空,则左子树上所有结点的值均小于根结点的值;

2、若右子树非空,则右子树上所有结点的值均大于或等于根结点的值;

3、左子树和右子树又分别是二叉排序树。

二叉排序树的特点是:对二叉排序树进行中序遍历,可得到一个由小到大的有序序列。

对于一般的二叉树,按给定关键字值查找树中结点时,一般从根结点开始,按先根遍历或中根遍历或后根遍历的方法查找树中结点,直到找到该结点为止。

2.二叉排序树的查找算法

3、平衡二叉树的变换方法

4、哈希表的思想;线性冲突解决方法和链式冲突解决方法

 10  排序

重要知识点:

1、直接插入排序的算法思想和编程实现

2、简单选择排序的算法思想和编程实现

3、快速排序的算法思想

4、堆排序的算法思想和编程实现



资料仅供学习使用

如有错误欢迎留言交流

上理考试辅导培训的其他专栏:

光电融合集成电路技术

C语言

单片机原理

模式识别原理

数字电子技术

自动控制原理传感器技术

模拟电子技术

数据结构

 概率论与数理统计

高等数学

传感器技术

智能控制

嵌入式系统

图像处理与机器视觉

热工与工程流体力学

数字信号处理

关注上理考试辅导培训了解更多

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值