数据结构 课件
第一章





- 数据的逻辑结构:
集合:各个元素没有其他关系;
线性结构:一对一;
树形结构:一对多;
图状结构(网状结构):多对多;
- 数据的物理结构(存储结构):顺序存储;链式存储;索引存储;散列存储;
- 数据的运算:运算的定义是针对逻辑结构的,指出运算的功能;运算的实现是针对存储结构的,指出运算的具体操作步骤。





第二章 线性表



顺序表按位查找时间复杂度为O(1),按值查找平均和最坏时间复杂度为O(n);
顺序表优点:可随机存取,存储密度高;
顺序表缺点:要求大片连续空间,改变容量不方便;

单链表按位查找和按值查找时间复杂度都为O(n);
单链表创建:头插法、尾插法;(头插法的应用:链表的逆置;)
单链表插入操作的时间复杂度:
- 在头部插入节点:O(1),直接将新节点作为链表的头节点。
- 在尾部插入节点:O(n),需要遍历整个链表找到尾节点,然后将新节点插入尾节点之后。
- 在中间位置插入节点:O(n),需要遍历链表找到插入位置的上一个节点,然后进行插入操作。
单链表删除操作的时间复杂度:删除头节点:O(1);删除尾节点:O(n);删除中间节点:O(n)。
![]()


第三章 栈和队列

特性:后进先出(LIFO);
栈的增删(元素进栈出栈)只能在栈顶操作;


栈的顺序存储和链式存储(实现方式:带头节点和不带头结点);
队列的特点:先进先出(FIFO);只能在队尾插入、在队头删除;


栈的应用:括号匹配的实现、中缀后缀前缀表达式求值中的应用、递归。
后缀、前缀表达式计算:操作数入栈;
中缀转后缀:操作符入栈;
中缀表达式:操作数和运算符入栈。


队列的应用:树的层次遍历、图的广度优先遍历
数组的存储结构:一维数组、二维数组。(数组下标默认从0开始;)

第四章 串









字母与对应的next值的字母一致,以最前面的next值做为nextval的值;其他不一样的与next值保持一致。
第五章 树与二叉树
































































































第六章 图




















从行指向列。

































































DAG(有向无环图)描述表达式:




















特性:




第七章 查找



































二叉排序树(BST)










平衡二叉树(AVL)














红黑树(Red-Black Tree)RBT














































第八章 排序


插入(直接插、折半插、希尔)、交换(冒泡、快速)、选择(选择、堆)





































































































































归纳
- 树的先根后根遍历 = 深度优先遍历
树的层次遍历 = 广度优先遍历
- 并查集最坏时间复杂度 Find O(n)——>小树并大树 O(log2n)——>压缩路径O(a(n))
- 最小生成树:Prim O(|v||v|)、Kruskal O(|E|log2|E|)
最短路径:BFS O(|V||V|或|v|+|E|)、Dijkstra O(|v||v|)、Floyd O(|v||v||v|)
- 插入(直接插O(1)O(nn)稳定、折半插O(1)O(nn)稳定、希尔O(1)O(n1.3n)不稳定)
交换(冒泡O(1)O(nn)稳定、快速O(1)O(nlog2n)不稳定)
选择(选择O(1)O(nn)不稳定、堆O(1)O(nlog2n)不稳定)
- ASL (Average Search Length),即平均查找长度.
带权路径长度(WPL)。
零碎知识点:
- 有序表属于逻辑结构。
- 顺序存储:随机存储;链式存取只能实现顺序存取。
- 静态链表以next=-1 为结束标志;插入和删除只修改指针,不移动元素。
- 链式存储结构比顺序存储结构更能方便的表示各种逻辑结构。【链式存储结构用指针表示逻辑关系,指针的设置是任意的;顺序存储结构只能用物理上的邻接关系来表示逻辑结构】
- 循环队列:队空:Q.f == Q.r ;队满:(Q.r + 1)%MaxSize == Q.f ; 队长:(Q.r-Q.f+MaxSize)%MaxSize
- 将递归程序转化为非递归程序 用栈实现。
- 后序非递归遍历的过程中,栈中保留当前节点的所有祖先。
- 已知前后序序列,不存在度为1的结点时 能确定唯一二叉树。
- 树的路径长度是从树根到每一个结点的路径长度的总和。树根到每个结点路径的最大值是树的高度减1。
- 结点的带权路径长度:从根结点到该结点之间的路径长度与该结点权的乘积。
- 二叉树分左右,有序树不分。对任意二叉树的高度:[log2N]+1 ~ N。
- 堆:适合大批数据的部分排序。
- Huffman树——》最优二叉树——》带权路径长度最短的树
- Huffman编码——》不等长编码——》是通过中最经典的压缩编码
- WPL = 所有叶子结点的带权路径长度之和。
- 无向完全图:n(n-1)/2
- 查找任何一个元素都要至少比较2次:分块查找。
- 二叉排序树最少比较1次。
- 判断回路:拓扑排序、关键路径、DFS
- 强连通有向图,边的个数至少为(n)
- 拓扑序列唯一,顶点的出度入度不一定最多为 1 ,(线性有向图)
- 单循环队列只设尾指针 出队 O(log2n)
- 顺序表平均移动次数至少为n/2;顺序查找平均比较次数(n+1)/2
- 元素比较次数与初始序列无关的是:简单选择、堆、归并、基数排序。
- 元素移动次数与初始序列无关的是:选择、插入、基数排序。
- 算法的时间复杂度与初始序列无关的是:选择、堆、归并、基数排序。
- 算法的排序趟数与初始序列无关的是: 选择、插入、基数排序。
- 数据对象是性质相同的数据元素的集合。
- 循环链表插入删除时要进行上溢和下溢的判断。
- 链队列用单循环链表表示,只设尾指针,出队操作时间复杂度为O(log2n)
- 设指针变量top指向当前链式栈的栈顶,则删除栈顶元素的操作序列为:top=top->next。
- 整个单链表由头指针唯一确定。
- 序列基本有序时,直接插入排序和冒泡排序效率高,最好时间复杂度为O(n)。
- 采用逆邻接表的存储方式来加速求解给定顶点的入度,边扫描边记录所有顶点的入度。O(n+e)
- 联通n个顶点的有向图,至少需要n条弧【有向环】
- 在一个含15个结点的二叉排序树上,查找一个不存在的元素,比较次数最少的是 1 次。【当树仅有左子树或右子树时】
- 在二叉排序树中插入一个结点的时间复杂度为O(n)。
- 关节点:删除顶点V与V上的所有边,图不再是连通图,顶点V就叫关节点。(没有关节点的连通图为双(重)连通图)。
判断:画DFS:如果根结点a有两个或两个以上的分支,a就是关节点。
生成树有两颗子树意味着两个子树之间互不相同。生成树中根结点的子树各不相通。除通过根结点本身。 若V没有和它祖先相同的回边,V是关节点。无向连通图中若删除结点和关联边则使图不联通。
- 设二叉树有2n个结点,且m<n,不可能存在 ( ) 结点。 A.n个度为0 B.2m个度为0 C.2m个度为1 D.2m个度为2
解:2n = n0+n1+n2=n2+2n2+1,n1 = 2(n-n2)-1 n1为奇数,选C。
- 若度为m的哈夫曼树中,叶子结点个数为n,则非叶子节点的个数为( (n0-1)/(m-1) )。
解:n=n0+nm n-1=m*nm = nm+n0-1 (m-1)nm=n0-1
- 若无向图G=(V,E)中含有7个顶点,要保证G在任何情况下都是联通的,则至少需要的边数最少是(16)
解:(6*5)/2+1 =16
浙公网安备 33010602011771号