数据结构复习指导Word下载.docx
- 文档编号:18323221
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:27
- 大小:35.31KB
数据结构复习指导Word下载.docx
《数据结构复习指导Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构复习指导Word下载.docx(27页珍藏版)》请在冰豆网上搜索。
正确性、可读性、健壮性和效率与低存储量要求
3、
算法效率的度量
算法时间是由控制结构和原操作的决定的。
做法:
选取一种是基本操作的原操作,以该基本操作重复的次数作为算法的时间量度。
时间复杂度:
算法中基本操作重复执行的次数是问题规模n的某个函数f(n),
T(n)=O(f(n))
它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。
语句的频度:
是改语句重复执行的次数。
4、
算法的存储空间需求
空间复杂度:
S(n)=O(f(n))
5、算法分析是对一个算法需要多少计算时间和存储空间作定量的分析。
对算法的评价有两大方面:
一世人对算法的维护的方便性。
二是算法在实现运行时占有的机器资源的多少计算法的运行时间和空间效率。
第二章
线性表
线性结构的特点:
在数据元素的非空有限集中
存在唯一的一个被称做"
第一个"
的数据元素;
最后一个"
除第一个之外,每个元素都只有一个前驱;
除最后一个之外,每个元素都只有一个后继。
线性表的顺序表示和实现
1、线性表的顺序表示:
指的是用一组地址连续的存储单元依次存储线性表的数据元素。
用物理位置来表示逻辑结构。
LOC(ai+1)=LOC(ai)+l
LOC(ai)=LOC(a1)+(i-1)*l
2、顺序表的特点:
随机存取的存储结构。
只要确定了存储线性表的起始位置,线性表中的任一数据元素可随机存取。
3、线性表的动态分配顺序存储结构(用一维数组)
#define
LIST_INIT_SIZE
100
LISTINCREAMENT
10
type
struct{
ElemType
*elem;
int
length;
listsize;
}SqList
顺序线性表的操作
顺序表容易实现访问操作,可随机存取元素。
但插入和删除操作主要是移动元素。
插入操作
算法思想:
在第i个位置上插入一个新元素,将第n
至(i+1)个元素逐一向后移动一个位置。
删除操作:
删除第i个元素,将第(i+1)至第n个元素逐一向前移动一个位置。
线性表的链式存储结构
一、
线性表的链式存储结构的特点:
是用一组任意的存储单元存储线性表的数据元素。
数据元素的映象用一个结点来表示。
结点的一个域表示元素本身,另一个是能指示其后继的指针,用来表示线性表数据元素的逻辑关系。
结点(Node)、数据域、指针域、指针、链、头指针
链式存储结构的特点:
插入、删除操作是不再需要移动大量的元素,但失去了顺序表的可随机存取特点。
链表可分为单链表、循环链表和双向链表。
二、
线性链表:
单链表:
链表中的每一个结点中只包含一个指针域的称为单链表或线性链表。
单链表的存储结构
单链表可由头指针唯一确定,在C语言中,用结构指针来描述。
typedef
struc
LNode{
data;
struct
LNode
*next
}LNode,
*LinkList
单链表的操作:
插入操作:
要在数据元素a和b
之间插入元素x。
决定a和b之间的相邻关系是由a
的指针决定的。
若要实现插入,生成x结点,然后让a
的指针指向x
且x
的指针指向b。
实现三个元a、x和b的逻辑关系。
设p为指向结点a
的指针,s为指向结点x的指针,则修改s、a的指针:
s→next=p→next;
p→next=s;
在单链表数据元素a、b、c三个相邻的元素中删除b,算法思想:
就是要让a
的指针直接指向c,使b从链表中脱离。
即,p→next=p→next→next
第三章
栈和队列
栈
1、堆栈的定义
堆栈是只准在一端进行插入和删除的线性表,称为LIFO表。
允许插入和删除的一端叫栈顶,另一端叫栈底。
栈的抽象数据类型:
ADT
Stack
2、堆栈的基本运算
(1)
入栈
Push(&
S,
e)
往栈S中插入一个元素e;
(2)
出栈
Pop(&
&
栈顶指针下移;
(3)
取栈顶元素
Gettop(&
e),将栈s的栈顶元素赋值给x;
(4)
判栈空
Stackempty(&
S)
若栈空,则结果为true,否则为false;
3、栈的顺序存储结构
顺序栈:
利用一组地址连续的存储单元依次存放自栈底到栈定的数据元素,同时附设指针top指示栈顶元素的在顺序栈中的位置。
SelemType
*base;
*top;
stacksize;
}SqStack;
base:
栈底指针,指向栈底的位置。
base=NULL,栈的结构不存在
top:
栈顶指针,其初值指向栈底,top=base
是栈空的标志。
插入时,top
增1;
删除时,top-1;
top始终在栈顶元素的下一个位置。
队列
1、队列的定义
队列是允许在一端进行插入而在另一端进行删除的线性表。
允许插入的一端称为队尾,允许删除的一端称为队头。
队列也称为先进先出表(FIFO)。
队列的抽象数据类型:
Queue
2、队列的运算
(1)入队
Enqueue(&
Q,
在队列Q中插入元素e。
(2)出队Dequeue(&
若队列Q不空,则删除其队头元素。
(3)取队头元素Gethead(&
若队列Q不空,用e返回队头元素。
(4)判队列是否为空Queueempty(Q)
若队列Q为空,返回true,否则,返回false。
3、队列的链式表示和实现
链队列:
用链表示的队列
QNode{
QelemType
data
;
QNode
}QNode,
*QueuePtr;
QueuePtr
*front
*rear
}
front:
队头指针,指向头结点
rear:
队尾指针,指向尾结点。
空链队列:
队头指针和队尾指针均指向头结点。
4、队列操作在链式存储结构下的实现
入队Enqueue(&
p=(QueuePtr)
malloc(sizeof(node));
/*生成结点*/
p->
data=e;
next=NUllt;
Q.rear->
next=p;
Q.rear=p
(2)出队
Dequeue(&
if
(Q.front==Q.rear)
return
Error;
p=Q.front->
next;
e=p->
Q.front->
next=p->
if(Q.rear==p)
Q.rear=Q.front;
free(p);
第四章
串
串类型的定义
1、串:
是由零个或多个字符组成的有限序列。
S='
a1
a2...an'
(n>
0)
串值:
用单引号括起来的字符序列。
长度:
串中字符的数目。
空串:
长度为零。
子串:
子序列。
位置:
字符在序列中的序号。
相等:
当且仅当两个串的值相等。
空格串:
由一个或多个空格组成的串。
2、串的操作:
以串的整体为操作对象。
串的基本操作:
求串长(strlength)、串联接(concat)、求子串(substring)、查子串的位置(index)、串的替换(replace)、插入子串(strinsert)、删除子串(strdelete)
串的最小操作子集:
串赋值、串比较、求串长、串连接、求子串。
串的表示和实现
1、定长顺序存储表示
⑴
表示:
用一组地址连续的存储单元存储串值的字符序列。
可用定长数组描述。
MAXSTRLEN
255
unsigned
char
Sstring[MAXSTRLEN
+1];
⑵
串操作的实现:
实现串操作的原操作为"
字符序列的复制"
操作的时间复杂度基于复制字符序列的长度。
串连接:
复制、截尾。
求子串:
复制。
2、堆分配存储表示
以一组地址连续的存储单元存放串值字符序列,但它们的存储空间是在程序执行的过程中动态分配而得。
*ch;
}Hstring;
堆分配存储结构有顺序顺序存储结构的特点,处理方便,且操作中对串长没有限制。
第五章
数组和广义表
第六章
树和二叉树
树和二叉树
树的定义和基本术语
树的定义
树是包含n个结点的有限集合(n>
Tree=(D,R)
其中,D是具有相同性质的数据元素的集合,若D中只有一个元素,则R为空集,否则R是D上某个二元关系H的集合,H是如下描述的二元关系:
在D中存在唯一一个称为根的元素r0,它在关系H下无前驱;
除结点r0外,K中每个结点对于关系H来说,都有且只有一个前驱。
(3)结点r0外的任何结点r
R,都存在一个结点序列r0,r1,...,rs,
H(1<
=i<
=s),这样一个结点序列称为根到结点r的路径。
树的例子:
家族,机构等
树的表示方法
树形表示法:
自然界倒长的树(Knuth开初用正长的树表示)
文氏表示法:
用集合表示
凹入表示法:
类似书目
嵌套括号表示法:
广义表表示法
表示的多样性说明了树的应用的广泛性。
树的术语
结点:
数据元素和指向子树的分枝;
终端结点(叶子),分枝结点
子女:
结点的子树的根称为结点的子女,该结点称为子女的双亲;
层次:
根为第一层,根的子女为第二层,以此类推
深度:
树中结点的最大层次称为树的深度(或高度)
度:
结点的分枝数目
树的度:
树中结点的最大度
兄弟:
同一双亲的子女互称兄弟,其父母为兄弟的结点互称堂兄
祖先:
结点的祖先是从根到该结点所经分支上的所有结点
子孙:
以某结点为根的子树中的任一结点都称为该结点的子孙。
有序树:
结点的子树从左到右有顺序,否则,称为无序树
森林:
树的不相交集合,除去根结点后的子树集合就是森林
二叉树的概念及性质
1、二叉树的定义
二叉树的定义
二叉树是一种重要的树型结构,它是n(n>
=0)个结点的有限集,其子树分为互不相交的两个集合,分别称为左子树和右子树,左子树和右子树也是如上定义的二叉树。
二叉树不是树的特例。
抽象数据类型二叉树的定义:
BinaryTree
{数据对象
D:
数据关系
R:
基本操作
P:
⑶
二叉树的5种形态
空(二叉树);
只有根结点;
根结点和左子树;
根结点和右子树;
根结点和左右子树。
二叉树的性质
二叉树的5个性质非常重要,都应会证明。
二叉树的第i层至多有2i-1个结点;
深度为k的二叉树至多有2k-1个结点;
对于任何一棵二叉树T,若其终端结点(叶子)数为n0,度为1的结点数为n1,度为2的结点数n2,则n0=
n2+1。
该性质应扩展到K叉树。
在介绍第四个性质前,先介绍两个概念:
满二叉树:
深度为k结点数为2k-1的二叉树称为满二叉树。
完全二叉树:
若对满二叉树的结点从上到下从左至右进行编号,则深度为k且有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树的编号从1到n一一对应时,称为完全二叉树。
从完全二叉树的定义可见,其叶子结点只能在最下面两层上,且从左到右的排满,即如果一个结点无左子树,该结点肯定就不应有右子树。
(深度k的满二叉树可在最下层从右到左删除0<
=n<
=2k-1-1个结点。
)
具有n个结点的完全二叉树的深度是ë
log2nû
+1;
(5)
对于一棵完全二叉树,从上到下从左至右对结点进行编号,根结点为1,则对任一结点i(1<
=n),有:
若i=1,则结点是二叉树的根,无双亲,否则,其双亲是ë
û
如果2i>
n,则结点i无左子女,否则,其左子女为2i;
如果2i+1>
n,则结点i无右子女,否则,其右子女为2i+1;
二叉树的存储结构
顺序存储结构
MAX_TREE_SIZE
TElemType
SqBiTree[MAX_TREE_SIZE];
SqBiTree
bt;
二叉树按顺序结构存储必须按完全二叉树形式,这样,会浪费空间。
例如,在最坏情况下,n个结点的单枝树,要占用2n-1个元素的存储空间。
二叉链表
lchild
data
rchild
元素结点除包括元素自身的信息外,还包括指向其左右子树的指针。
即结点要包括数据域,左子树指针域和右子树指针域,
可形式定义如下:
BiTNode
{TElemType
*lchild,
*rchild;
}BiTNode
*Bitree;
注意,n个结点的二叉树有n+1个空链域。
遍历二叉树
遍历是树结构的一种常用的、重要的运算,是树的其它运算的基础。
遍历二叉树结构的概念和方法
遍历也称周游,是指按一定的规律,访问二叉树树的结点,使每个结点被访问一次,且只被访问一次。
访问的含义可以是查询某元素、修改某元素、输出某元素的值,以及对元素作某种运算等等。
遍历的过程就是把非线性结构的二叉树中的结点排成一个线性序列的过程。
二叉树的遍历
二叉树遍历方法可分为两大类,一类是"
宽度优先"
法,即从根结点开始,由上到下,从左往右一层一层的遍历;
另一类是"
深度优先法"
,即一棵子树一棵子树的遍历。
从二叉树结构的整体看,二叉树可以分为根结点,左子树和右子树三部分,只要遍历了这三部分,就算遍历了二叉树。
设D表示根结点,L表示左子树,R表示右子树,则DLR的组合共有6种,即DLR,DRL,LDR,LRD,RDL,RLD。
若限定先左后右,则只有DLR,LDR,LRD三种,分别称为先(前)序法(先根次序法),中序法(中根次序法,对称法),后序法(后根次序法)。
三种遍历的递归算法如下:
先序法(DLR)
若二叉树为空,则空操作,否则:
·
访问根结点;
先序遍历左子树;
先序遍历右子树。
中序法(LDR)
中序遍历左子树;
中序遍历右子树。
后序法(LRD)
后序遍历左子树;
后序遍历右子树。
遍历二叉树的应用:
(1)已知二叉树的先序序列和中序序列,可以唯一确定一棵二叉树。
(2)已知二叉树的后序序列和中序序列,可以唯一确定一棵二叉树;
(3)已知二叉树的先序序列和后序序列,不能唯一确定一棵二叉树。
树的存储结构
双亲表示法
以一组连续的存储空间存放树的结点,每个结点中附设一个指针指示其双亲结点在这连续的存储空间中的位置(下标,这种结构属静态链表),可形式表示如下:
typrdef
tnode
{
datatype
parent;
}tree[n]
孩子表示法
用多重链表表示。
有两种方法:
同构:
按最大度的结点设置各结点结构,即一个数据域和d个指针域,这容易造成空间浪费;
异构:
结点有几棵子树设几个指针,这样操作困难。
可将其子女链在一个单链表中。
其形式描述如下:
tagnode
/*
表结点
*/
child;
*next;
}node,
*link;
头结点
{datatype
link
headptr;
}headnode;
headnode
childlink[maxnode];
表头数组
带双亲的孩子链表表示法:
}headnode1;
孩子兄弟表示法
该方法又称二叉树表示法,或二叉链表表示法,即以二叉链表作存储结构,结点的两个链域分别指向该结点的第一个孩子和下一个兄弟,分别命名为fch和nsib。
可形式描述如下:
treenode
*fch,*nsib;
}treenode
*tree;
树的这种表示本质上是二叉树的二叉链表表示。
由于二叉树和树这种存储结构的一致性,从而导致树和二叉树可以相互转换。
森林与二叉树的相互转换
森林转为二叉树
树(树林)转换成二叉树时结果是唯一的。
其转换可以递归的描述如下:
若树(树林)为空,则二叉树为空;
否则,树(树林)中第一棵树的根是二叉树的根,第一棵树除去根结点后的子树林是二叉树的左子树,树林中除去第一棵树后的树林形成二叉树的右子树。
形象的说转换过程可用下面的"
三步曲"
来说明:
三步曲:
连线
切线
旋转
连线:
将兄弟结点连接起来
切线:
保留双亲到第一个子女的连线,将双亲到其它子女的连线切掉。
旋转:
以根为轴,平面向下顺时针方向旋转450。
二叉树转为树林
二叉树转换成树(树林)时结果也是唯一的。
其转换可以递归的描述,若二叉树为空,则树(树林)为空;
否则,二叉树的根是树(树林)中第一棵树的根,二叉树的左子树构成树(树林)中第一棵树除去根结点后的子树林,二叉树的右子树构成树林中除去第一棵树后的树林。
形象的说是上面三步曲的逆。
哈夫曼树最优二叉树(哈夫曼树----带权路径长度最短的树)
哈夫曼树的基本概念
路径
从树中一个结点到另一个结点之间的分支。
(2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 复习 指导