读书笔记_数据结构-使用C++语言描述(第二版)

来源:互联网 发布:知乎 墨菲定律 编辑:程序博客网 时间:2024/06/08 08:02

 

第一章    基础知识

数据:计算机加工处理的对象,分为数值数据和非数值数据。

数据结构的设计过程分为抽象层(数据的逻辑结构及运算)、数据结构层、实现层。

数据的逻辑结构:集合结构、线性结构、树形结构、图状结构。(线性和非线性)

存储表示方法:顺序和链接(以及索引和散列)。

数据结构常见运算:创建、清除、插入、删除、搜索、更新、访问、遍历。

创建后结构是否变化分为:静态数据结构和动态数据结构。

抽象:实质是抽取共同和本质的内容。

第二章    线性表

线性表是一种动态数据结构,它的表长可以变化。

第三章    堆栈和队列

堆栈

队列

中缀表达式转化为后缀表达式(匹配括号)

后缀表达式的计算(遇到操作符弹出两个数)

递归算法的有点:程序非常简洁和清晰,且易于分析;缺点:费时间、费空间。

第四章    数字和字符串

特殊矩阵:对称矩阵(aij=aji),带状矩阵,稀疏矩阵(顺序表示和转置)。

字符串:简单模式匹配算法,模式匹配的KMP算法。

第五章    树

树的定义和树的递归定义。

结点,边,路径,双亲,孩子,兄弟,后裔,祖先,度,叶子,分支结点,树的度,层次,树的高度,无序树,有序树,森林,果园或称有序森林,不能为空树,可以为空森林。

二叉树(可为空)分左子树和右子树,有五种基本形态。

满二叉树:高度为h的二叉树恰好有2h-1个结点。

完全二叉树:一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上。(n个结点则高度为不大于log2(n+1)的最大整数)

扩充二叉树:也称2-树,除了叶结点外,其余结点都必须有两个孩子。

二叉树的存储表示:顺序表示(不适合),链接表示。

应当避免共享结点。

森林和二叉树的转换(递归定义)。兄弟变父子。父子变兄弟。

树是非线性数据结构,一般采用链接方式存储,如果树结构的大小和形状改变不大时也可以采取顺序方式存储。链接方式:多重链表表示法,孩子兄弟表示法,双亲表示法,三重链表表示法,带右链的先序表示法。

树和森林的遍历:深度优先遍历(先序、中序、后序)和宽度优先遍历(按层次)。

大小为n的堆:一棵包含n个结点的完全二叉树,该树中的每个结点的关键字值大于等于其双亲的关键字,为最小堆。反之为最大堆。

堆的向上调整和向下调整是优先权队列的基础。

哈夫曼编码是不等长编码。

从根到树中任意结点的路径长度,是指从根结点到该结点的路径上所包括的边的数目。树的内路径长度(除去叶子结点路径长度和)和树的外路径长度(到叶子结点的路径长度和)。

设I和E分别是一棵扩充二叉树的内路径长度和外路径长度,n是树中非叶结点的数目,则E=I+2n。

树的加权路径长度为树中所有叶子结点的加权路径长度之和。WPL=wklk的1到m的求和。

哈夫曼算法:构造具有最小加权路径长度的扩充二叉树的算法。对应的则为哈夫曼(编码)树。

第六章    集合和搜索

主关键字,次关键字。内搜索,搜索成功,搜索失败。内搜索,外搜索。静态搜索,动态搜索。符号表算法。基于关键字比较的搜索(线性表和搜索树),基于计算地址的搜索(跳表和散列表)。

无序表的顺序搜索。有序表的顺序搜索。

平均搜索长度。

二分搜索算法(对半搜索只适用于有序表且是顺序存储)。

第七章    搜索树

二叉搜索树也称二叉排序树(中序遍历),是一种最容易实现的搜索树。若左子树不空,左子树关键字值小于根结点关键字值。若右子树不空,右子树上鄋关键字值大于根,左右子树都是二叉搜索树。

二叉搜索树的搜索:将x与根结点比较,若x小于该结点的值,则用相同的方法搜索左子树,大于则搜索右子树,相等则搜索成功。

二叉搜索树的插入:搜索后插入(可能重复)。

二叉搜索树的删除:搜索中序遍历下的直接后继,替代,再删除。

二叉搜索树操作的平均时间为O(log2n)。

二叉平衡树(AVL树):特殊的二叉搜索树,有效控制树的高度,避免产生普通二叉搜索树的“退化”树形。左右子树的高度差绝对值不超过1,左右子树都为二叉平衡树。平衡因子为左子树高度减去右子树高度,其值只能为-1,、0、1。

二叉平衡树的平衡旋转(LL、RR、LR)、插入、删除、高度。

二叉平衡树的搜索最坏情况时间复杂度是O(log2n)。

B-树(外搜索树):多叉平衡树。

第八章 跳表和散列表

字典是记录的集合。表示字典:线性表、搜索树、跳表、散列表。

跳表在实现的难度和性能之间做了很好的折中。

跳表是一个有序链表,每个结点包含可变数目的链(指针),结点中的第i层链,跳过那些只包含低于第i层链的结点,构成一个单链表。一个有n个元祖的跳表,在理想情况下的链级数为ceiling(log2n),即跳表的最大层次为ceiling(log2n)-1。

随机跳表。

跳表的搜索、插入、删除。

散列表:元素在存储结构中的位置与元素的关键字值之间存在直接的确定关系。

散列技术中的冲突:是指对于关键字集合中的两个关键字值Ki和Kj,当Ki不等于Kj时,有h(Ki)=h(Kj),h是散列函数。

散列函数应该:能快速计算,具有均匀性。

目前比较通用的散列函数:

除留余数法,h(key) = key mod M;M是散列表的大小,M的选择十分重要。

平方取中法,h(key) = floor(M/W(key2 mod W));W是计算机字长,M是散列表长,key是无符号整数。

折叠法,

数字分析法,。

解决冲突也称为“溢出”处理技术:拉链的方法(开散列法)和开地址法(闭散列法)。

开地址法:线性探查法,伪随机探查法,二次探查法,双散列法。

 

第九章 图

图,顶点,有向图,无向图,自回图,多重图,完全图。

无向完全图有n(n-1)/2条边,有向完全图有n(n-1)条边。

路径,路径的长度,子图,简单路径,回路。

连通图,强连通图,带权的图称为网。

连通分量:无向图的一个极大连通子图。

图运算:深度优先遍历图,宽度优先遍历图,拓扑排序,关键路径,普里姆算法求最小代价生成树,克鲁斯卡尔算法求最小代价生成树,迪杰特斯拉算法求单元最短路径,弗洛伊德算法求所有顶点之间的最短路径。

图的存储结构:矩阵表示法:邻接矩阵,关联矩阵;邻接表表示法;

图的遍历(可能到不了和存在回路问题):深度优先遍历(邻接矩阵表示图则时间复杂度为O(n2)),宽度优先遍历(邻接矩阵表示图则时间复杂度为O(n2))。

拓扑排序是求解网络问题的主要算法之一。管理技术,如计划评审技术和关键路径法都用到了这一算法。

AOV网络(顶点活动网络):一个有向图G,若各顶点代表活动,各条边表示活动之间的领先关系。(拟序关系,传递性和反自反性)(一般是一个有向无环图)

AOE网络(顶点事件网络):与AOV对应的活动网络。

生成树:一个无向连通图的生成树是一个极小连通图,它包括图中全部顶点,并且有尽可能少的边。

最小代价生成树:一个网络的各生成树中,具有最小代价的生成树。

普里姆算法(Prim):选n-1条边,选边准则:寻找一条代价最小的边(u’,v’),是所有一个端点u在构造中的生成树上,而另一个端点不在该树上的边(u,v)中代价是最小的。O(n2)。

克鲁斯卡尔算法(Kruskal):选边原则:每次选择一条代价最小的边,如果不形成回路就加入集合,直到有了n-1条边。e条边,O(elog2e)。

单元最短路径问题:迪杰特斯拉算法(Dijkstra):首先求得长度最短的一条最短路径,再求得长度次短的的一条最短路径,以此类推,直到从源头到其他所有顶点之间的最短路径都已经求得为止。O(n3)。

所有顶点之间的最短路径问题:弗洛伊德算法(Floyd):集合S每次加入一个顶点,保存各条最短路径的长度,从i到j中间只经过S中的点,可以认为是“当前最短路径”。O(n3)。

第十章 内排序

稳定排序算法:相等元素排序后的先后顺序不变。反之为不稳定排序。

时间复杂度:元素比较次数和移动次数衡量,一般按平均情况估算,也常估算最好和最坏。

整个排序过程可以在内存中进行,则称之为内部排序。如果不能全部放入内存而需要访问外存则为外部排序。

l  简单选择排序:每次找出最小与未排好的最前一个元素交换。最好最坏和平均:O(n2)。不稳定。

l  直接插入排序:每次插入一个元素使之有序。最好O(n),最坏O(n2),平均O(n2)。稳定。

l  冒泡排序:每趟交换,最大元素沉底。最好O(n),最坏O(n2),平均O(n2)。稳定。

l  快速排序:给定元素分割为左右,分到只有一个元素。最好O(nlog2n),最坏O(n2),平均O(nlog2n)。存储空间O(n)。不稳定。

l  两路合并排序(归并排序):两两合并。最好最坏平均O(nlog2n)。存储空间O(n)。稳定。

l  堆排序:构造堆,调整。最好最坏平均O(nlog2n)。不稳定。

l  基数排序:位数从低到高进行排序。最好最坏平均O(d*(radix+n))。存储空间O(radix*d+n)。稳定。

l  希尔排序(插入排序一种,缩小增量排序):按步长间隔分组进行直接插入排序。最好O(n),最坏O(n2),平均O(n1.3)。不稳定。

l  计数排序:非比较排序(比较排序时间下限是O(nlog2n)),被排序的数组为A,排序后存储到B,C为临时数组,C[A[i]]表示小于等于a[i]的元素个数,正好是A[i]排序后应该在的位置。最好最坏平均O(n+k),k为最大的数加一,稳定。

l  桶排序(箱排序,非比较排序):将n个数放入m个桶里面,每个桶里面再用其他排序算法。要求数据的长度必须完全一样,要被排序的数组内的数值是均匀分配的。O(n),稳定,耗空间。

l  双向冒泡排序(鸡尾酒排序):先让冒泡排序由左向右进行,再让冒泡排序由右往左进行,如此往复,使用left与right两个旗标来记录左右两端已排序的元素位置。最好O(n),最坏O(n2),平均O(n2)。稳定。

l  折半插入排序:由于前半部分为已排好序的数列,这样我们不用按顺序依次寻找插入点,可以采用折半查找的方法来加快寻找插入点的速度。只是减少了比较次数而已。元素移动次数不变。

第十一章 外排序

文件组织方式:顺序文件、散列文件、索引文件、倒排文件。

阅读全文
0 0