数据结构知识点全面总结精华版Word下载.docx
《数据结构知识点全面总结精华版Word下载.docx》由会员分享,可在线阅读,更多相关《数据结构知识点全面总结精华版Word下载.docx(26页珍藏版)》请在冰豆网上搜索。
③表长加1。
注意:
事先应判断:
插入位置i是否合法表是否已满
应当符合条件:
1≤i≤n+1或i=[1,n+1]
核心语句:
for(j=n;
j>
=i;
j--)
a[j+1]=a[j];
a[i]=x;
n++;
插入时的平均移动次数为:
n(n+1)/2÷
(n+1)=n/2≈O(n)
3)删除——删除线性表的第i个位置上的元素
①将第i+1至第n位的元素向前移动一个位置;
②表长减1。
事先需要判断,删除位置i是否合法
1≤i≤n或i=[1,n]
for(j=i+1;
j<
=n;
j++)
a[j-1]=a[j];
n--;
顺序表删除一元素的时间效率为:
T(n)=(n-1)/2≈O(n)
顺序表插入、删除算法的平均空间复杂度为O
(1)
单链表:
(1)
用单链表结构来存放26个英文字母组成的线性表(a,b,c,…,z),请写出C语言程序。
#include<
>
typedefstructnode{
chardata;
structnode*next;
}node;
node*p,*q,*head;
d1,c2..d2],
则行优先存储时的地址公式为:
二维数组列优先存储的通式为:
◆稀疏矩阵(含特殊矩阵)的存储及运算。
稀疏矩阵:
矩阵中非零元素的个数较少(一般小于5%)
◆线性表的逻辑结构,指线性表的数据元素间存在着线性关系。
在顺序存储结构中,元素存储的先后位置反映出这种线性关系,而在链式存储结构中,是靠指针来反映这种关系的。
◆顺序存储结构用一维数组表示,给定下标,可以存取相应元素,属于随机存取的存储结构。
◆链表操作中应注意不要使链意外“断开”。
因此,若在某结点前插入一个元素,或删除某元素,必须知道该元素的前驱结点的指针。
◆掌握通过画出结点图来进行链表(单链表、循环链表等)的生成、插入、删除、遍历等操作。
◆数组(主要是二维)在以行序/列序为主的存储中的地址计算方法。
◆稀疏矩阵的三元组表存储结构。
◆稀疏矩阵的十字链表存储方法。
补充重点:
1.每个存储结点都包含两部分:
数据域和指针域(链域)
2.在单链表中,除了首元结点外,任一结点的存储位置由其直接前驱结点的链域的值指示。
3.在链表中设置头结点有什么好处
头结点即在链表的首元结点之前附设的一个结点,该结点的数据域可以为空,也可存放表长度等附加信息,其作用是为了对链表进行操作时,可以对空表、非空表的情况以及对首元结点进行统一处理,编程更方便。
4.如何表示空表
(1)无头结点时,当头指针的值为空时表示空表;
(2)有头结点时,当头结点的指针域为空时表示空表。
5.链表的数据元素有两个域,不再是简单数据类型,编程时该如何表示
因每个结点至少有两个分量,且数据类型通常不一致,所以要采用结构数据类型。
(x)——计算变量x的长度(字节数);
malloc(m)—开辟m字节长度的地址空间,并返回这段空间的首地址;
free(p)——释放指针p所指变量的存储空间,即彻底删除一个变量。
7.链表的运算效率分析:
(1)查找
因线性链表只能顺序存取,即在查找时要从头指针找起,查找的时间复杂度为O(n)。
(2)插入和删除
因线性链表不需要移动元素,只要修改指针,一般情况下时间复杂度为O
(1)。
但是,如果要在单链表中进行前插或删除操作,因为要从头查找前驱结点,所耗时间复杂度将是O(n)。
例:
在n个结点的单链表中要删除已知结点*P,需找到它的前驱结点的地址,其时间复杂度为O(n)
8.顺序存储和链式存储的区别和优缺点
顺序存储时,逻辑上相邻的数据元素,其物理存放地址也相邻。
顺序存储的优点是存储密度大,存储空间利用率高;
缺点是插入或删除元素时不方便。
链式存储时,相邻数据元素可随意存放,但所占存储空间分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针。
链式存储的优点是插入或删除元素时很方便,使用灵活。
缺点是存储密度小,存储空间利用率低。
◆顺序表适宜于做查找这样的静态操作;
◆链表宜于做插入、删除这样的动态操作。
◆若线性表的长度变化不大,且其主要操作是查找,则采用顺序表;
◆若线性表的长度变化较大,且其主要操作是插入、删除操作,则采用链表。
9.判断:
“数组的处理比其它复杂的结构要简单”,对吗
答:
对的。
因为——
①数组中各元素具有统一的类型;
②数组元素的下标一般具有固定的上界和下界,即数组一旦被定义,它的维数和维界就不再改变。
③数组的基本操作比较简单,除了结构的初始化和销毁之外,只有存取元素和修改元素值的操作。
10.三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的行下标、列下标和元素值。
11.写出右图所示稀疏矩阵的压缩存储形式。
解:
介绍3种存储形式。
法1:
用线性表表示:
((1,2,12),(1,3,9),(3,1,-3),(3,5,14),
(4,3,24),(5,2,18),(6,1,15),(6,4,-7))
法2:
用十字链表表示
用途:
方便稀疏矩阵的加减运算
方法:
每个非0元素占用5个域
法3:
用三元组矩阵表示:
稀疏矩阵压缩存储的缺点:
将失去随机存取功能
代码:
1.用数组V来存放26个英文字母组成的线性表(a,b,c,…,z),写出在顺序结构上生成和显示该表的C语言程序。
charV[30];
voidbuild()
base=(QElemType*)malloc(sizeof(QElemType)
*QUEUE_MAXSIZE;
base=(QElemType*)malloc(sizeof(QElemType)
*QUEUE_MAXSIZE);
rear+1)%QUEUE_MAXSIZE;
[]=e;
什么要设计队列它有什么独特用途
①离散事件的模拟(模拟事件发生的先后顺序,例如CPU芯片中的指令译码队列);
②操作系统中的作业调度(一个CPU执行多个作业);
③简化程序设计。
3.什么叫“假溢出”如何解决
在顺序队中,当尾指针已经到了数组的上界,不能再有入队操作,但其实数组中还有空位置,这就叫“假溢出”。
解决假溢出的途径———采用循环队列。
4.在一个循环队列中,若约定队首指针指向队首元素的前一个位置。
那么,从循环队列中删除一个元素时,其操作是先移动队首位置,后取出元素。
5.线性表、栈、队的异同点:
相同点:
逻辑结构相同,都是线性的;
都可以用顺序存储或链表存储;
栈和队列是两种特殊的线性表,即受限的线性表(只是对插入、删除运算加以限制)。
不同点:
①运算规则不同:
线性表为随机存取;
而栈是只允许在一端进行插入和删除运算,因而是后进先出表LIFO;
队列是只允许在一端进行插入、另一端进行删除运算,因而是先进先出表FIFO。
②用途不同,线性表比较通用;
堆栈用于函数调用、递归和简化设计等;
队列用于离散事件模拟、OS作业调度和简化设计等。
第四章串
内容提要
:
◆串是数据元素为字符的线性表,串的定义及操作。
串即字符串,是由零个或多个字符组成的有限序列,是数据元素为单个字符的特殊线性表。
串比较:
intstrcmp(char*s1,char*s2);
求串长:
intstrlen(char*s);
串连接:
charstrcat(char*to,char*from)
子串T定位:
charstrchr(char*s,char*c);
◆串的存储结构,因串是数据元素为字符的线性表,所以存在“结点大小”的问题。
模式匹配算法
。
串有三种机内表示方法:
算法目的:
确定主串中所含子串第一次出现的位置(定位)
定位问题称为串的模式匹配,典型函数为Index(S,T,pos)
BF算法的实现—即编写Index(S,T,pos)函数
BF算法设计思想:
将主串S的第pos个字符和模式T的第1个字符比较,
若相等,继续逐个比较后续字符;
若不等,从主串S的下一字符(pos+1)起,重新与T第一个字符比较。
直到主串S的一个连续子串字符序列与模式T相等。
返回值为S中与T匹配的子序列第一个字符的序号,即匹配成功。
否则,匹配失败,返回值0。
IntIndex_BP(SStringS,SStringT,intpos)
{串和空白串有无区别
有区别。
空串(NullString)是指长度为零的串;
而空白串(BlankString),是指包含一个或多个空白字符‘’(空格键)的字符串.
2.“空串是任意串的子串;
任意串S都是S本身的子串,除S本身外,S的其他子串称为S的真子串。
”
第6章树和二叉树
◆树是复杂的非线性数据结构,树,二叉树的递归定义,基本概念,术语。
树:
由一个或多个(n≥0)结点组成的有限集合T,有且仅有一个结点称为根(root),当n>
1时,其余的结点分为m(m≥0)个互不相交的有限集合T1,T2,…,Tm。
每个集合本身又是棵树,被称作这个根的子树。
二叉树:
是n(n≥0)个结点的有限集合,由一个根结点以及两棵互不相交的、分别称为左子树和右子树的二叉树组成。
术语:
P88
◆二叉树的性质,存储结构。
性质1:
在二叉树的第i层上至多有2i-1个结点(i>
0)。
性质2:
深度为k的二叉树至多有2k-1个结点(k>
性质3:
对于任何一棵二叉树,若2度的结点数有n2个,则叶子数(n0)必定为n2+1
性质4:
具有n个结点的完全二叉树的深度必为
性质5:
对完全二叉树,若从上至下、从左至右编号,则编号为i的结点,其左孩子编号必为2i,其右孩子编号为2i+1;
其双亲的编号必为i/2(i=1时为根,除外)。
二叉树的存储结构:
一、顺序存储结构
按二叉树的结点“自上而下、从左至右”编号,用一组连续的存储单元存储。
若是完全/满二叉树则可以做到唯一复原。
不是完全二叉树:
一律转为完全二叉树!
方法很简单,将各层空缺处统统补上“虚结点”,其内容为空。
缺点:
①浪费空间;
②插入、删除不便
二、链式存储结构
用二叉链表即可方便表示。
一般从根结点开始存储。
优点:
①不浪费空间;
②插入、删除方便
◆二叉树的遍历。
指按照某种次序访问二叉树的所有结点,并且每个结点仅访问一次,得到一个线性序列。
遍历规则———
二叉树由根、左子树、右子树构成,定义为D、L、R
若限定先左后右,则有三种实现方案:
DLRLDRLRD
先序遍历中序遍历后序遍历
◆树的存储结构,树、森林的遍历及和二叉树的相互转换。
回顾2:
二叉树怎样还原为树
要点:
逆操作,把所有右孩子变为兄弟!
讨论1:
森林如何转为二叉树
法一:
①各森林先各自转为二叉树;
②依次连到前一个二叉树的右子树上。
法二:
森林直接变兄弟,再转为二叉树
讨论2:
二叉树如何还原为森林
把最右边的子树变为森林,其余右子树变为兄弟
树和森林的存储方式:
树有三种常用存储方式:
①双亲表示法②孩子表示法③孩子—兄弟表示法
问:
树→二叉树的“连线—抹线—旋转”如何由计算机自动实现
用“左孩子右兄弟”表示法来存储即可。
存储的过程就是树转换为二叉树的过程!
树、森林的遍历:
①先根遍历:
访问根结点;
依次先根遍历根结点的每棵子树。
②后根遍历:
依次后根遍历根结点的每棵子树;
访问根结点。
讨论:
树若采用“先转换,后遍历”方式,结果是否一样
1.树的先根遍历与二叉树的先序遍历相同;
2.树的后根遍历相当于二叉树的中序遍历;
3.树没有中序遍历,因为子树无左右之分。
①先序遍历
若森林为空,返回;
访问森林中第一棵树的根结点;
先根遍历第一棵树的根结点的子树森林;
先根遍历除去第一棵树之后剩余的树构成的森林。
②中序遍历
中根遍历森林中第一棵树的根结点的子树森林;
访问第一棵树的根结点;
中根遍历除去第一棵树之后剩余的树构成的森林。
◆二叉树的应用:
哈夫曼树和哈夫曼编码。
Huffman树:
最优二叉树(带权路径长度最短的树)
Huffman编码:
不等长编码。
树的带权路径长度:
(树中所有叶子结点的带权路径长度之和)
构造Huffman树的基本思想:
权值大的结点用短路径,权值小的结点用长路径。
构造Huffman树的步骤(即Huffman算法):
(1)由给定的n个权值{w1,w2,…,wn}构成n棵二叉树的集合F={T1,T2,…,Tn}(即森林),其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均空。
(2)在F中选取两棵根结点权值最小的树做为左右子树构造一棵新的二叉树,且让新二叉树根结点的权值等于其左右子树的根结点权值之和。
(3)在F中删去这两棵树,同时将新得到的二叉树加入F中。
(4)重复
(2)和(3),直到F只含一棵树为止。
这棵树便是Huffman树。
具体操作步骤:
(本章内容是本课程的重点)
◆二叉树性质及证明方法,并能把这种方法推广到K叉树。
◆二叉树遍历,遍历是基础,由此导出许多实用的算法,如求二叉树的高度、各结点的层次数、度为0、1、2的结点数。
◆由二叉树遍历的前序和中序序列或后序和中序序列可以唯一构造一棵二叉树。
由前序和后序序列不能唯一确定一棵二叉树。
◆完全二叉树的性质。
◆树、森林和二叉树间的相互转换。
◆哈夫曼树的定义、构造及求哈夫曼编码。
补充:
1.满二叉树和完全二叉树有什么区别
满二叉树是叶子一个也不少的树,而完全二叉树虽然前k-1层是满的,但最底层却允许在右边缺少连续若干个结点。
满二叉树是完全二叉树的一个特例。
2.Huffman树有什么用
最小冗余编码、信息高效传输
第7章图
◆图的定义,概念、术语及基本操作。
图:
记为G=(V,E)
其中:
V是G的顶点集合,是有穷非空集;
E是G的边集合,是有穷集。
术语:
见课件
◆图的存储结构。
1.邻接矩阵(数组)表示法
①建立一个顶点表和一个邻接矩阵
②设图A=(V,E)有n个顶点,则图的邻接矩阵是一个二维数组[n][n]。
注:
在有向图的邻接矩阵中,
第i行含义:
以结点vi为尾的弧(即出度边);
第i列含义:
以结点vi为头的弧(即入度边)。
邻接矩阵法优点:
容易实现图的操作,如:
求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点等等。
邻接矩阵法缺点:
n个顶点需要n*n个单元存储边(弧);
空间效率为O(n2)。
2.邻接表(链式)表示法
①对每个顶点vi建立一个单链表,把与vi有关联的边的信息(即度或出度边)链接起来,表中每个结点都设为3个域:
②每个单链表还应当附设一个头结点(设为2个域),存vi信息;
③每个单链表的头结点另外用顺序存储结构存储。
邻接表的优点:
空间效率高;
容易寻找顶点的邻接点;
邻接表的缺点:
判断两顶点间是否有边或弧,需搜索两结点对应的单链表,没有邻接矩阵方便。
◆图的遍历。
遍历定义:
从已给的连通图中某一顶点出发,沿着一些边,访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。
图常用的遍历:
一、深度优先搜索;
二、广度优先搜索
深度优先搜索(遍历)步骤:
①访问起始点v;
②若v的第1个邻接点没访问过,深度遍历此邻接点;
③若当前邻接点已访问过,再找v的第2个邻接点重新遍历。
基本思想:
——仿树的先序遍历过程。
广度优先搜索(遍历)步骤:
①在访问了起始点v之后,依次访问v的邻接点;
②然后再依次(顺序)访问这些点(下一层)中未被访问过的邻接点;
③直到所有顶点都被访问过为止。
◆图的应用(最小生成树,最短路经)
最小生成树(MST)的性质如下:
若U集是V的一个非空子集,若(u0,v0)是一条最小权值的边,其中u0U,v0V-U;
则:
(u0,v0)必在最小生成树上。
求MST最常用的是以下两种:
Kruskal(克鲁斯卡尔)算法、Prim(普里姆)算法
Kruskal算法特点:
将边归并,适于求稀疏网的最小生成树。
Prime算法特点:
将顶点归并,与边数无关,适于稠密网。
在带权有向图中A点(源点)到达B点(终点)的多条路径中,寻找一条各边权值之和最小的路径,即最短路径。
两种常见的最短路径问题:
一、单源最短路径—用Dijkstra(迪杰斯特拉)算法
二、所有顶点间的最短路径—用Floyd(弗洛伊德)算法
一、单源最短路径(Dijkstra算法)一顶点到其余各顶点(v0→j)
目的:
设一有向图G=(V,E),已知各边的权值,以某指定点v0为源点,求从v0到图的其余各点的最短路径。
限定各边上的权值大于或等于0。
2、所有顶点之间的最短路径
可以通过调用n次Dijkstra算法来完成,还有更简单的一个算法:
Floyd算法(自学)。
图是应用最广泛的一种数据结构,本章也是这门课程的重点。
◆基本概念中,连通分量,生成树,邻接点是重点。
①连通图:
在无向图中,若从顶点v1到顶点v2有路径,则称顶点v1与v2是连通的。
如果图中任意一对顶点都是连通的,则称此图是连通图。
非连通图的极大连通子图叫做连通分量。
②生成树:
是一个极小连通子图,它含有图中全部n个顶点,但只有n-1条边。
③邻接点:
若(u,v)是E(G)中的一条边,则称u与v互为邻接顶点。
◆图是复杂的数据结构,也有顺序和链式两种存储结构:
数组表示法(重点是邻接距阵)和邻接表。
这两种存储结构对有向图和无向图均适用
◆图的遍历是图的各种算法的基础,应熟练掌握图的深度、广度优先遍历。
◆连通图的最小生成树不是唯一的,但最小生成树边上的权值之和是唯一的。
应熟练掌握prim和kruscal算法,特别是手工分步模拟生成树的生成过程。
◆从单源点到其他顶点,以及各个顶点间的最短路径问题,掌握熟练手工模拟。
1.问:
当有向图中仅1个顶点的入度为0,其余顶点的入度均为1,此时是何形状
是树!
而且是一棵有向树!
2.讨论:
邻接表与邻接矩阵有什么异同之处
1.联系:
邻接表中每个链表对应于邻接矩阵中的一行,
链表中结点个数等于一行中非零元素的个数。
2.区别:
对于任一确定的无向图,邻接矩阵是唯一的(行列号与顶点编号一致),
但邻接表不唯一(链接次序与顶点编号无关)。
3.用途:
邻接矩阵多用于稠密图的存储
而邻接表多用于稀疏图的存储
3.若对连通图进行遍历,得到的是生成树
若对非连通图进行遍历,得到的是生成森林。
第8章 查找
◆查找表是称为集合的数据结构。
是元素间约束力最差的数据结构:
元素间的关系是元素仅共在同一个集合中。
(同一类型的数据元素构成的集合)
◆查找表的操作:
查找,插入,删除。
◆静态查找表:
顺序表,有序表等。
针对静态查找表的查找算法主要有:
顺序查找、折半查找、分块查找
一、顺序查找(线性查找)
技巧:
把待查关键字key存入表头或表尾(俗称“哨兵”),这样可以加快执行速度。
intSearch_Seq(SSTableST,KeyTypekey){
[0].key=key;
for(i=;
[i].key!
=key;
--i);
returni;
}
PLspPRf
找的过程是怎样的
给定一个值K,在含有n个记录的文件中进行搜索,寻找一个关键字值等于K的记录,如找到则输出该记录,否则输出查找不成功的信息。
2.对查找表常用的操作有哪些
查询某个“特定的”数据元素是否在表中;
查询某个“特定的”数据元素的各种属性;
在查找表中插入一元素;
从查找表中删除一元素。
3.哪些查找方法
查找方法取决于表中数据的排列方式;
4.如何评估查找方法的优劣
用比较次数的平均值来评估算法的优劣。
称为平均查找长度ASL。
ASL=∑Pi.Ci
5.使用折半查找算法时,要求被查文件:
采用顺序存贮结构、记录按关键字递增有序
6.将线性表构造成二叉排序树的优点:
①查找过程与顺序结构有序表中的折半查找相似,查找效率高;
②中序遍历此二叉树,将会得到一个关键字的有序序列(即实现了排序运算);
③如果查找不成功,能够方便地将被查元素插入到二叉树的叶子结点上,而且插入或删除时只需修改