数据结构笔记汇总
线性: 线性(1:1)、栈、队、数组
非线性:树形(1:多)、图形(多:多)
存储结构:顺序(数组)、链式(指针)
2. 逻辑结构与元素相对位置无关
链式存储物理地址和逻辑地址不一定相同连续,所以它内存中可⽤存储单元的地址/数据结点地址:连续与否都可以
3. (解释)不生成可执行文件
4. 读取元素花费时间最少:顺序表
5. 在具有 n 个结点的单链表上查找值为 x 的元素时,其时间复杂度为O(n)
6. 设指针 q 指向单链表中结点 A,指针 p 指向单链表中结点 A 的后继结点 B,指针 s 指向被插⼊的结点 X,则在结点 A 和结点 B 插⼊结点 X 的操作序列为:q->next=s;s->next=p;
7. 访问第 i 个元素的前驱(1<i<=n)的时间复杂度为O(1)
8. 添加/删除操作
单链表
带头结点的单链表
带头结点的双循环单链表
单链表的头插法建立链表
单链表的头插法建⽴链表所得到的数据的顺序与输⼊的时候的顺序相反
单链表的头插法建⽴链表算法不简单,要引⼊⼤量的指针辅助运算。(F)
单链表的尾插发建立链表
单链表的尾插法建⽴链表所得到的数据的顺序与输⼊的时候的顺序相同
双链表
带头结点的双循环链表
链式存储的后插法
带头结点的双循环链表的空表
9. 3n+nlog2n+n2+8的数量级:n2
10. 算法的评价不包括并行性
11. 集合中任何两个结点之间都有逻辑关系但组织形式松散(F)
12. 数据元素具有相同的特性=数据项个数相同,类型一致
13. 数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为顺序存储结构
14. 算法
定义:有限序列
目的:分析效率求改进
15. 高效性:指算法的执行效率高(T)
指算法需要的时间性能(F)
16. 链表
Malloc()申请
Free()释放
在⼀个带头结点的双向循环链表中,若要在 p 所指向的结点之前插⼊⼀个新结点,则需要相继修改(4)个指针域的值
1、该新结点前驱指针指向p的前驱
2、p的前驱指针指向该新结点
3、该新结点的后继域指向p结点
4、前驱的后继域指向该新结点
17. 线性表
在进⾏添加/删除元素时,应该在删除元素前判空
在添加元素前判空(F)
可以在任何位置插入删除
除第⼀个和最后⼀个元素外,其余每个元素都由⼀个且仅有⼀个直接前驱和直接后继
元素之间的逻辑关系是通过(物理位置)决定的.
有限序列,可以为空
串是⼀种特殊的线性表
两种存储结构:线性和链式
线性表链式
线性表链式:插入删除方便,只需要向前或向后移动元素即可(F)
线性表链接存储:
链表是⼀种动态存储结构,链表的结点可调⽤申请 malloc()和 free()释放
链表的结点可⽤free()申请和⽤malloc()释放(F)
链表是⾮随机存取存储结构,对链表的存取必须从头指针开始
对链表的存取可以从任何结点开始(F)
插⼊删除运算⾮常⽅便;只需修改相应指针值
只需要向前或向后移动元素即可(F)
逻辑上相邻的元素,其物理位置⼀定相邻,元素之间的邻接关系由指针域指示
不需要预先分配存储空间,适用于数据量变化较大的情况
表的长度:数据结点的个数
适用于经常进行插入和删除的操作
链接存储的存储结构所占存储空间分两部分,⼀部分存放结点值,另⼀部分存放表示结点间关系的指针
线性表顺序存储
不便于插入和删除的实现,而链式存储便于
适用于变化量小的情况
必须按最⼤可能⻓度预分存储空间,存储空间利⽤率低,表的容量难以扩充,是⼀种静态存储结构
是一种随机存取结构
适用于经常进行存取的操作
删除时的最坏情况:要删除的元素是顺序表的第一个元素
删除时的最好情况:要删除的元素是顺序表的最后一个元素
要求能够较快的插⼊和删除,⼜要求储存结构能够反映数据元素之间的逻辑关系则应该以顺序储存⽅式储存
在⼀个⻓度为 n 的顺序存储的线性表中,向第 i 个元素(1<=i<=n+1)位置插⼊⼀个新元素时,需要从后向前依次后移(n-i+1)个元素
线性表一旦建立,就不能添加元素(F)
最后一个元素之后插入一个元素和删除最后一个元素,采用容量足够大的顺序表
长度为n,删除第i个元素,要向前移动n-1个元素
长度为n,第i个位置插入一个新元素,时间复杂度为O(n)
线性表是n个数据元素的有限序列(所以学院组织结构表就不是线性表)
顺序线性表中有 n 个数据元素,则删除表中第 i 个元素需要移动(n-1)个元素
18. 顺序表
做删除操作时,应该将表的长度-1
插⼊⼀个元素所需移动的元素平均数是(n+1)/2
顺序表的⻓度是指:表中数据元素的个数
向⼀个有 127 个元素的顺序表中插⼊⼀个新元素并保持原来顺序不变,平均要移动(63.5)个元素
在⼀个⻓度为 n 的顺序表中,删除值为 x 的元素时需要⽐较元素和移动元素的总次数为n
表尾插⼊⼀个元素的时间复杂性的量级为O(1)
19. 数组
逻辑结构à线性结构
存储结构à顺序结构
设⼀维数组中有 n 个数组元素,则读取值为 x 的数据元素的平均时间复杂度为O(n)
设⼀维数组中有 n 个数组元素,则读取第 i 个数组元素的平均时间复杂度为0(1)
假定利⽤数组 a[N]顺序存储⼀个栈,⽤ top 表示栈顶指针,top==-1 表示栈空,并已知栈未满,当元素 x进栈时所执⾏的操作为a[++top]= x
在⼀个具有 n 个单元的顺序栈中,假定以地址低端(即 0 单元)作为栈底,以 top 作为栈顶指针,则当做出栈处理时,top 变化为top—
20. 队列
先进先出
只能在队尾添加/插入新元素
只能在队首删除元素
⽆论是顺序存储还是链接存储的栈和队列,进⾏插⼊或删除运算的时间复杂性均为O(1)
利⽤顺序队进⾏元素⼊队时最⼤的问题是会出现假溢出现象
队列是被限定为只能在表的⼀端进⾏插⼊运算,在表的另⼀端进⾏删除运算的线性表
当利⽤⼤⼩为 N 的数组存储循环队列时,该队列的最⼤⻓度是n
从⼀个顺序循环队列中删除元素时,⾸先需要后移队首指针
判定⼀个队列 QU(最多元素为 m0)为满队列的条件是QU->rear - QU->front = = m0
在⼀个链队列中,front 和 rear 分别为头指针和尾指针,则插⼊⼀个结点 s 的操作为rear->next=s;rear=s;
在⼀个 n 个结点的双向链表中指针 p 所指向的结点之前插⼊⼀个新结点时,其时间复杂性的量级为O(1)
21. 栈
先进后出,后进先出
只能在栈顶做插入/删除操作
向顺序栈中插⼊新的元素分三步,分别是:判断溢出或栈满 修改栈顶指针 把新元素赋给栈顶单元
从顺序栈中删除元素分三步,分别是:判断栈空 栈顶指针的值返回 修改栈顶指针
向栈中压⼊元素的操作是:先移动栈顶指针,然后存⼊元素
设⽤链表作为栈的存储结构则退栈操作:必须判别栈是否为空
设⽤链表作为栈的存储结构则进栈操作:对栈不作任何判别
顺序栈中在做出栈运算时,应先判别栈是否为空
顺序栈中在做进栈运算时,应先判别栈是否为满
Push进pop出
设栈 S 和队列 Q 的初始状态为空,元素 e1,e2,e3,e4,e5,e6依次通过栈 S,⼀个元素出栈后即进⼊队列 Q,若 6 个元素出队的序列是 e2,e4,e3,e6,e5,e1,则栈的容量⾄少应该是3
⼀个栈的输⼊序列为:1,2,3,4,则栈的不可能输出的序列是4321
打印机à队列
判定⼀个顺序栈 ST(最多元素为 m0)为空的条件是ST->top==0
假定⼀个链式栈的栈顶指针⽤ top 表示,每个结点的结构具有两个域 data 和 next,出栈时进⾏的指针操作为top=top->next
删除⾮空的顺序存储结构的堆栈的栈顶元素,栈顶指针 top 的变化是top=top-1
向⼀个栈顶指针为 hs 的链栈中插⼊⼀个*s 结点时,应执⾏s->next=hs;hs=s;
顺序栈中当栈中元素为 m 时,做进栈运算时发⽣上溢,则说明栈的可⽤最⼤容量为m
判定⼀个顺序栈的 S(最多元素时 m0)为满的条件是S->top==m0-1
为了增加内存空间的利⽤率和减少发⽣上溢的可能性,由两个栈共享⼀⽚连续的内存空间时,应将两个
栈的(栈底)分别设在这⽚内存空间的两端,这样只有当两个栈的栈顶在栈空间的某⼀位置相遇时才产⽣上溢
设输⼊序列 1、2、3、…、n 经过栈作⽤后,输出序列中的第⼀个元素是 n,则输出序列中的第 i 个输出元素是n+1-i
判定⼀个顺序栈 S(栈空间⼤⼩为 n)为空的条件是S->top==0
设输⼊序列为 1、2、3、4、5、6,则通过栈的作⽤后可以得到的输出序列为:3,2,5,6,4,1
设指针变量 front 表示链式队列的队头指针,指针变量 rear 表示链式队列的队尾指针,指针变量 s 指向将要⼊队列的结点 X,则⼊队列的操作序列为rear->next=s;rear=s;
解决顺序队上溢的⽅法
1、每当删除⼀个队头元素时,则依次移动队中的元素,始终使 front 指针指向队列中的第⼀个位置
2、采⽤平移元素的⽅法:每当队列中加⼊⼀个元素时,队列中已有的元素向队头移动⼀个位置
3、建⽴⼀个⾜够⼤的存储空间,但这样做会造成空间的使⽤效率降低
4、发⽣上溢时,⾃动丢失多余元素(F)
22. 单链表
已知单链表尾指针,时间复杂度为O(1)
单链表中设置头结点:空表和非空表统一,算法处理一致
⾮空的循环单链表 head 的尾结点(由 p 所指向),满⾜条件:p->next==head
将⻓度为 n 的单链表链接在⻓度为 m 的单链表之后的算法的时间复杂度为O(m)
⼀个单链表中,若删除 p 所指向结点的后续结点(=单链表中指针 p 指向结点 m,若要删除 m 之后的结点(若存在),则需要修改指针的操作为),则执⾏p->next=p->next->next;
在⼀单链表中 n 个数据结点,则读第 i 个数据结点的平均时间复杂度为O(n)
对于⼀个具有 n 个结点的单链表,在已知的结点*p 后插⼊⼀个新结点的时间复杂性为O(1)
单链表的判空条件
不带头结点的单链表head为空:head=null
⼀条单链表的头指针变量为 head 且该链表没有头结点,判空:head=0
23. 树
树à层次
二叉树不是特殊的树,使用不是树转化过来的特殊情形
⼆叉树与树具有相同的树形结构(F)
二叉树是非线性数据结构,顺序存储结构和链式存储结构都能存储,但,不是所有的⼆叉树树形结构都适⽤顺序存储结构
若初始森林中共有 n 裸⼆叉树,进⾏ 2n-1 次合并后才能剩下⼀棵最终的哈夫曼树(F)
若⽬标串的⻓度为 n,模式串的⻓度为[n/3],则执⾏模式匹配算法时,在最坏情况下的时间复杂度是O(n2)
分支
设⾮空⼆叉树上叶⼦节点数为 n0,双分⽀数为 n²,单分⽀数为 n1,则n0=n2+1
深度
深度为 k 的完全⼆叉树中最少有(2k-1)个结点
设⼀棵完全⼆叉树中有 65个结点,则该完全⼆叉树的深度为7,因为2n-1
设⼆叉树有 n 个结点,则其深度无法确定
结点数
⼆叉树的第 k 层的结点数最多为2k-1
⼀棵⼆叉树上第 5 层的结点数最多为16个,因为2k-1
深度为 5 的⼆叉树最少有(5)个结点
如果 T2是由有序树 T 转化⽽来的⼆叉树,T后序结点=T2中序结点,T前序结点=T2前序结点
设某棵⼆叉树中有 2000 个结点,则该⼆叉树的最⼩⾼度为11,因为210=1024<2000,211=2048>2000
在⼀棵树中,每个结点最多有(1)个前驱结点
⼆叉树中第 i(i≥1)层上的结点数最多有(2i+1)个
利⽤ n 个值⽣成的哈夫曼树中共有(2n-1)个结点.
设⼆叉树根结点的层次为 0,⼀棵⾼度为 h 的满⼆叉树中的结点个数是2n+1-1
设 F 是由 T1、T2 和 T3三棵树组成的森林,与 F 对应的⼆叉树为 B,T1、T2 和 T3 的结点数分别为 N1、N²和 N3,则⼆叉树 B 的根结点的左⼦树的结点数为N1-1
对含有(1)个结点的⾮空⼆叉树,采⽤任何⼀种遍历⽅式,其结点访问序列均相同
⼀棵深度为 h 的满 k 叉树有如下性质: 第 h 层上的结点都是叶⼦结点,其余各层上的结点都有 k 棵⾮空⼦树.如果按层次顺序从 1 开始对全部结点编号,则各层上的结点数⽬是ki-1
实现任意⼆叉树,m 个树叶,⼀共 n 个结点,度为 1 的结点 t 个,度为 2 的结点有 p 个,则m=p+1
对于⼀棵具有 n 个结点的⼆叉树,当进⾏链接存储时,其⼆叉链表中的指针域的总数为 2n,其中(n-1)个⽤于链接孩⼦结点,(n+1)个空闲着
设深度为 k 的⼆叉树上只有度为 0和度为 2的节点,则这类⼆叉树上所含结点总数最少2k-1
二叉树共有5种不同的形态
具有 3 个结点的⼆叉树共有(5)种状态.
设某棵⼆叉树中只有度数为 0 和度数为 2的结点且度数为 0 的结点数为 n,则这棵⼆叉中共有(2n-1)个结点
在⼀棵⼆叉树中,度为 0 的结点个数为 n0,度为 2 的结点个数为 n²,则 n=n2+1
叶子结点
设某棵完全⼆叉树中有 100 个结点,则该⼆叉树中有(50)个叶⼦结点
设某棵⼆叉树的⾼度为 10,则该⼆叉树上叶⼦结点最多有512
某哈夫曼树中有 199 个结点,则该哈夫曼树中有(100)个叶⼦结点//(n+1)/2
指针域
设⼀棵 m 叉树的结点数为 n,⽤多重链表表示其存储结构,则该树中有(n(m-1)+1)个空指针域
设哈夫曼树中的叶⼦结点总数为m,若⽤⼆叉链表作为存储结构,则该哈夫曼树中总共有(2m)个空指针
域.
N 个结点链接存储,指针域总数 2n,链接孩⼦结点 2n,空闲的有 n+1
高度
对于⼀个具有 n 个结点的⼆叉树,当它为(完全二叉树)具有最⼩⾼度
具有 n(n>0)个结点的完全⼆叉树的⾼度为[log 2 (n+1)]或[log 2 n]+1
对于⼀个具有 n 个结点的⼆叉树,当它为⼀棵(单分支)⼆叉树时具有最⼤⾼度.
对于⼀个具有 n 个结点的⼆叉树,当它为单分⽀⼆叉树时具有最⼤⾼度,其⾼度为n
带权路径长度
左孩子、右孩子、双亲结点
将含有 83 个结点的完全⼆叉树从根结点开始编号,根为 1 号,后⾯按从上到下、从左到右的顺序对结
点编号,那么编号为 41 的双亲结点编号为20
三叉树
在三叉链表上,⼆叉树的求双亲运算很容易实现(F)
欲实现任意⼆叉树的后序遍历的⾮递归算法⼆不必使⽤栈结构,最佳⽅案是⼆叉树采⽤(三叉链表)存储结构.
在⼀棵具有 k 层的满三叉树中,结点总数为(3k-1)/2
⼀棵三叉树的结点数为 50,则它的最⼩⾼度为5
哈夫曼树
设⽤于通信的电⽂仅由 8个字⺟组成,字⺟在电⽂中出现的频率分别为
根据这些频率作为权值构造哈夫曼树,则这棵哈夫曼树的⾼度为7
先序、中序、后序遍历
前序:第⼀个结点 A 是根结点,是后序的最后⼀个结点
前序:⼦树的第⼀个结点为⼦树根结点
中序:根据前序的根节点,判断是否有左右⼦树。
中序:左⼦树--> 根节点--> 右⼦树
后序:左⼦树--> 右⼦树-->根节点
先序: 根节点-->左⼦树-->右⼦树
⼆叉树的先序遍历序列和后序遍历序列正好相反,则该⼆叉树满⾜的条件是任⼀结点⽆右孩⼦
⼆叉树的先序遍历序列和后序遍历序列正好相同,则该⼆叉树满⾜的条件是空或只有⼀个结点
⼆叉树的先序遍历序列和中序遍历序列正好相同,则该⼆叉树满⾜的条件是任⼀结点⽆左孩⼦
已知⼆叉树的前序遍历和后序遍历序列并不能惟⼀地确定这棵树,因为不知道树的根结点是哪⼀个。(F)
任何⼀棵⼆叉树的叶结点在其先根、中根、后跟遍历序列中的相对位置肯定不发生变化
任何⼀棵⼆叉树的叶结点在先序、中序和后序遍历序列中的相对次序不发生改变
⼆叉树结点的先根序列、中根序列和后根序列中,所有叶⼦结点的先后顺序完全相同
⼆叉树中,具有两个⼦⼥的⽗结点,在中序遍历序列中,它的后继结点最多只能有⼀个⼦⼥结点
由⼆叉树的前序和后序遍历序列(不能)惟⼀确定这棵⼆叉树
设 a,b 为⼀棵⼆叉树上的两个结点,在中序遍历时,a 在 b 前的条件是.a 在 b 左⽅
⼀棵⼆叉树满⾜下列条件:对任意结点,若存在左、右⼦树,则其值都⼩于它的左⼦树上所有结点的值,⽽⼤于右⼦树上所有结点的值.现采⽤(中根)遍历⽅式就可以得到这棵⼆叉树所有结点的递增序列
⼀棵⼆叉树有 n 个结点,要按某顺序对该⼆叉树中的结点编号,(号码为 1-n),编号须具有如下性质:
⼆叉树中任⼀结点 V,其编号等于其左⼦树中结点的最⼤编号加 1.⽽其右⼦树中结点的最⼩编号等于 V 的编号加 1.试问应按(中序)遍历顺序编号
在⼆叉链表上,求双亲运算的时间性能很好(F)
⼆叉判定树应用在:描述分类过程和处理判定优化等⽅⾯上
后缀表达式
24. 图
设 G1=(V1,E1)和 G2=(V2,E2)为两个图,如果 V1ÍV2,E1ÍE2 则称.G1是 G2 的⼦图
有向图
某有向图中有 n 个顶点,则该有向图对应的邻接表中有(n)个表头结点
对于⼀个有向图,若⼀个顶点的度为 k1,出度为 k2,则对应逆邻接表中该顶点单链表中的边结点数为k1-k2
图的逆邻接表存储结构只适⽤于(有向图)图
在⼀个具有 n 个顶点的有向图中,若所有顶点的出度数之和为 s,则所有顶点的度数之和为2s
在⼀个具有 n 个顶点的有向图中,若所有顶点的出度数之和为 s,则所有顶点的⼊度数之和为s
在⼀个具有 n 个顶点的有向完全图中,所含的边数为n(n-1)
有 8 个结点的有向完全图最多有(56)条边,因为n(n-1)
无向图
设⽆向图 G 中有 n 个顶点 e 条边,则⽤⽤邻接表作为图的存储结构进⾏深度优先或⼴度优先遍历的时间复杂度为O(n+e)
设⽆向图 G 中有 n 个顶点 e 条边,则其对应的邻接表中的表头结点和表结点的个数分别为n和2e
设某有向图的邻接表中有 n 个表头结点和 m 个表结点,则该图中有(m)条有向边
设⽆向图 G 中有 n 个顶点 e 条边,则⽤邻接矩阵作为图的存储结构进⾏⼴度优先遍历时的时间复杂度为O(n2)
如果 n 个顶点的图是⼀个环,则它有(n)棵⽣成树
设⽆向图G中有n个顶点e条边,则⽤邻接表作为图的存储结构进⾏深度优先遍历时的时间复杂度为O(n2)
图中的⼀条路径⻓度为 k,该路径所含的顶点数为k+1
当 n 个顶点的⽆向图 G 的顶点度数的最⼩值⼤于或者等于(n)时,G ⾄少有⼀条回路
在含 n 个顶点和 e 条边的⽆向图的邻接矩阵中,零元素的个数为n2-2e
对于⼀个具有 n 个顶点和 e 条边的⽆向图,若采⽤邻接表表示,则表头数量为n
对于⼀个具有 n 个顶点和 e 条边的⽆向图,若采⽤邻接表表示,则所有邻接表中的结点总数是2e
⼀个⽆向图有 n 个顶点和 e 条边,则所有顶点的度的和为(2e)
一个无向图有 n 个顶点和e 条边,则该⽆向图中所有顶点的⼊度之和为2e
在⼀个具有 n 个顶点和 e 条边的⽆向图的邻接矩阵中,表示边存在的元素(⼜称为有效元素)的个数为2e
假设⼀个有n个顶点和e条弧的有向图⽤邻接表表示,则删除与某个顶点vi相关的所有弧的时间复杂度是O(n+e)
在⼀个具有 n 个顶点的⽆向图中,要连通全部顶点⾄少需要(n-1)条边.
设⽆向图 G 中有 n 个顶点,则该⽆向图的最⼩⽣成树上有(n-1)条边
⼀个具有 n 个顶点的有向图最多有(n(n-1))条边
⼀个具有 n 个顶点的⽆向完全图的边数为n(n-1)/2
设某⽆向图中有 n 个顶点 e 条边,则建⽴该图邻接表的时间复杂度为O(n+e)
设⽆向图 G(如下图所示),则其最⼩⽣成树上所有边的权值之和为8
在⽆向图中定义顶点 vi 与 vj 之间的路径为从 vi 到 vj 的⼀个顶点序列
路径长度
⽤ Dijkstra 算法求某⼀顶点到其余各顶点间的最短路径是按路径⻓度(递增)的次序来得到最短路径的
关键路径是事件结点⽹络中的从源点到汇点的最⻓路径
邻接表
邻接表是图的⼀种链式存储
连通图
n 个顶点的连通图⾄少(n-1)条边
具有 6 个顶点的⽆向图⾄少应有(5)条边才能确保是⼀个连通图
在⼀个连通图中存在着(1)个连通分量
设某强连通图中有 n 个顶点,则该强连通图中⾄少有(n)条边
具有 50 个顶点的⽆向图⾄少应有(49)条边才能确保是⼀个连通图
对于⼀个具有 n 个顶点的⽆向连通图,它包含的连通分量的个数为1
如果从⽆向图的任⼀顶点出发进⾏⼀次深度优先搜索即可访问所有顶点,则该图⼀定是连通图
任何⼀个⽆向连通图的最⼩⽣成树有一棵或多棵
广度优先遍历和深度优先遍历
⼴度优先遍历类似于⼆叉树的层次遍历
若⼀个图的边集为{(A,B),(A,C),(B,D),(C,F),(D,E),(D,F)},则从顶点 A 开始对该图进⾏深度优先搜索,得到的顶点序列可能为A,C,F,D,E,B
已知图的邻接矩阵同下图所示,根据算法,则从顶点 0 出发,按⼴度优先遍历的结点序列是0 1 2 3 4 6 5
已知图的邻接表如下所示,根据算法,则从顶点 0 出发按⼴度优先遍历的结点序列是 0 3 2 1
已知图的邻接表如下所示,根据算法,则从顶点 0 出发按深度优先遍历的结点序列是 0 1 2 3
图的边集
⼀个图的边集为{<0,1>3,<0,2>5,<0,3>5,<0,4>10,<1,2>4,<2,4>2,<3,4>6},则从顶点 v0到顶点 v4共有(4)条简单路径
若⼀个图的边集为{<1,2>,<1,4>,<2,5>,<3,1>,<3,5>,<4,3>},则从顶点 1开始对该图进⾏⼴度优先搜索,得到的顶点序列可能为1,2,4,5,3
拓扑排序
拓扑排序:可以判断出⼀个有向图中是否有环(回路)
任⼀个有向图的拓扑序列有一个或多个
稠密图、稀疏图(普里姆和克鲁斯卡尔)
⽤普⾥姆(Prim)算法求具有 n 个顶点 e 条边的图的最⼩⽣成树的时间复杂度为n2
若要求⼀个稠密图 G 的最⼩⽣成树,最好⽤(普里姆) 算法来求解.
若要求⼀个稀疏图 G 的最⼩⽣成树,最好⽤(克鲁斯卡尔) 算法来求解.
设有⼀稠密图 G,则 G 采⽤(矩阵)存储较省空间.
设有⼀稀疏图 G,则 G 采⽤(表)存储较省空间
领接矩阵
⽆向图的邻接矩阵是⼀个对称矩阵
已知⼀个图的邻接矩阵表示,计算第 i 个结点的⼊度的⽅法是:求矩阵第 i 列⾮零元素之和
已知⼀个图的邻接矩阵表示,删除所有从第 i 个结点出发的边的⽅法是:将矩阵第 i ⾏全部置为 0
带权有向图 G ⽤邻接矩阵 A 存储,则顶点 i 的⼊度等于 A 中第 i 列⾮⽆穷的元素个数之和
深度优先遍历类似于⼆叉树的先序遍历
图的深度优先遍历序列不唯一
⽤邻接表表示图进⾏深度优先遍历时,通常是采⽤(栈)来实现算法的
⽤邻接表表示图进⾏⼴度优先遍历时,通常是采⽤(队列)来实现算法的.
对于具有 n 个顶点的图,若采⽤邻接矩阵表示,则该矩阵的⼤⼩为n2
有向图 G ⽤邻接矩阵存储,其第 i ⾏的所有元素之和等于顶点 i 的出度
拓扑排序算法是通过重复选择具有(0)个前驱顶点的过程来完成的。//拓扑à没有前驱的
图遍历
⾮连通图不能⽤深度优先搜索法(F)
顶点与边
在⼀个图中,所有顶点的度数之和=所有边数
设某完全⽆向图中有 n 个顶点,则该完全⽆向图中有(n(n-1))/2条边
25. 排序
大多数排序算法都有两个基本的操作:比较和移动
设需要对 10个不同的记录关键字进⾏排序,则⾄少需要⽐较(9)次
排序的⽬的是为了以后对已排序的数据元数进⾏(查找)操作
直接插⼊排序和冒泡排序的时间复杂性为 O(n²), 若初始数据有序(即正序),则时间复杂性为O(n)
初始值
选择排序/简单选择排序/直接选择排序
在直接插⼊和直接选择排序中,若初始数据基本反序,则选⽤直接选择排序
在所有的排序⽅法中,关键字的⽐较次数与记录的初始排列⽆关的是直接选择排序
对⼀个由 n 个整数组成的序列,借助排序过程找出其中的最⼤值,希望⽐较次数和移动次数最少,应选
⽤(直接选择排序)
关键字的⽐较次数与记录的初始排列⽆关
在直接选择排序中,记录⽐较次数为 O(n²)数量级,记录的移动次数为O(n)数量级.
将上万个⼀组⽆序并且互不相等的正整数序列,存放于顺序存储结构中,采⽤(选择排序)⽅法能够最快地找出其中最⼤的正整数
⽬前以⽐较操作为基础的内部排序的时间复杂性 T(m)的范围是 O(nlog2n)~ O(n²),其⽐较次数
与待排序记录的初始状态⽆关的是(直接选择)排序
排序⽅法中,从未排序序列中挑选元素,并将其依次放⼊已排序序列(初始时为空)的⼀端的⽅法,称
为选择排序
插入排序/直接插入排序
对 n 个元素进⾏直接插⼊排序时间复杂性为n2
设⼀组初始记录关键字的⻓度为 8,则最多经过(7)趟插⼊排序可以得到有序序列.
在对 n 个元素进⾏直接插⼊排序的过程中,共需要进⾏(n-1)趟.
当初始序列已按健值有序时,⽤直接插⼊算法进⾏排序,需要⽐较的次数为n-1
直接插⼊排序算法的平均时间复杂度为O(n²)
排序⽅法中,从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素进⾏⽐较,将其放⼊
已排序序列的正确位置上的⽅法,称为插入排序
对于直接插⼊排序、冒泡排序、简单选择排序、堆排序、快速排序,当⽂件“局部有序”或⽂件⻓度较⼩
的情况下,最佳的内部排序⽅法是直接插入排序
冒泡排序
对 n 个元素的序列进⾏冒泡排序,在降序的情况下⽐较次数最多,其⽐较次数为(n(n-1))/2
对 n 个元素的序列进⾏冒泡排序,最少的⽐较次数是 n,此时元素的排列情况是已从⼩到⼤排列
对 n 个元素的序列进⾏冒泡排序,最少的⽐较次数是 n,此时元素的排列情况是升序
对 n 个元素的序列进⾏冒泡排序,其⽐较次数为 n(n-1)/2时,其原始数据序列是(降序)情况
对n个不同的排序码进⾏升序冒泡法排列,从⼤到⼩排列好的⽐较的次数最多
对n个不同的排序码进⾏冒泡排序,在元素⽆序的情况下⽐较的次数为(n(n-1))/2
排序时扫描待排序记录序列,顺次⽐较相邻的两个元素的⼤⼩,逆序时就交换位置,这是冒泡排序的基
本思想
对 n 个元素的序列进⾏冒泡排序,在(降序)的情况下⽐较次数最多
对 n 个元素的序列进⾏冒泡排序,最少的⽐较次数是n-1
在对⼀组有 8 个记录的数据表进⾏冒泡排序时,在整个排序过程中共需进⾏(7)趟才可完成.
在⽂件局部有序或⽂件⻓度较⼩的情况下,最佳的排序⽅法是冒泡排序
快速排序
快速排序是对序列中的元素通过适当的位置交换将有关元素⼀次性地放置在其最终位置上
最坏的情况下的时间复杂度是O(n²)
在最坏情况下(如初始记录已有序),快速排序的空间复杂性为n
在对 n 个元素进⾏快速排序的过程中,最好情况下需要进⾏(log 2 n)趟
快速排序在(被排序的数据已基本有序)情况下最不利于发挥其⻓处.
在堆排序,快速排序和归并排序中,若从平均情况下排序最快,则应⾸先选取(快速排序)⽅法
在堆排序中、快速排序和归并排序中,若从节省存储空间考虑,排在中间的是(快速排序)⽅法
每次把待排序的元素划分为左、右两个⼦区间,其中左区间中元素的关键字均⼩于等于基准元素的关键字,右区间中元素的关键字均⼤于等于基准元素的关键字,则此排序⽅法叫作快速排序
快速排序算法的平均时间复杂度为O(nlog 2 n)
归并排序
依次将每两个相邻的有序表合并成⼀个有序表的排序⽅法叫作归并排序
在归并排序过程中,需归并的趟数为log2n
若对 n 个元素进⾏归并排序,则进⾏每⼀趟归并的时间复杂度为n
⼆路归并排序的时间复杂度为(nlog2n)
在归并排序中,归并趟数的数量级表示为O(log2n)
在内部排序中,要求附加的内存容量最⼤的是归并排序
设⼀组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70),其中含有 5个⻓度为 2 的有序⼦表,则⽤归并排序的⽅法对该记录关键字序列进⾏⼀趟归并后的结果为15,25,35,50,20,40,80,85,36,70
在归并排序中,若待排序记录的个数为 20,则共需要进⾏ 5趟归并,在第 3趟归并中,是把⻓度为 4 的
有序表归并为⻓度为4的有序表
希尔排序
设⼀组初始记录关键字序列为(9,8,7,6,5,4,3,2,1,0),则以增量 d=5 的⼀趟希尔排序结束后前 5条记录关键字为4,3,2,1,0
⼀趟排序结束后不⼀定能够选出⼀个元素放在其最终位置上的是希尔排序
希尔排序的增量序列必须是递减
堆排序
在堆排序中、快速排序和归并排序中,若只从最坏的情况下排序最快并且要节省内存考虑,应选⽤(堆排序)
时间复杂度不受数据初始状态影响⽽恒为 O(nlog2n)的是堆排序
在任何情况下,时间复杂度均为 O(nlog2n)的不稳定的排序⽅法是堆排序
已知⼀个链表中有 3000 个结点,每个结点存放⼀个整数,(堆排序方法)可⽤于解决这 3000个整数的排序问题且不需要对算法作⼤的变动
设有 1000 个⽆序的元素,希望⽤最快的速度挑选出其中前 10 个最⼤的元素,最好选⽤(堆)排序法
交换排序
当两个元素⽐较出现反序时(即逆序)就相互交换位置的排序⽅法叫作交换排序
基数排序
如果将所有中国⼈按照⽣⽇来排序,则使⽤(基数排序)算法最快
比较排序的稳定和快慢
时间复杂度
关键字序列
26. 查找
二分查找
线性: 线性(1:1)、栈、队、数组
非线性:树形(1:多)、图形(多:多)
存储结构:顺序(数组)、链式(指针)
2. 逻辑结构与元素相对位置无关
链式存储物理地址和逻辑地址不一定相同连续,所以它内存中可⽤存储单元的地址/数据结点地址:连续与否都可以
3. (解释)不生成可执行文件
4. 读取元素花费时间最少:顺序表
5. 在具有 n 个结点的单链表上查找值为 x 的元素时,其时间复杂度为O(n)
6. 设指针 q 指向单链表中结点 A,指针 p 指向单链表中结点 A 的后继结点 B,指针 s 指向被插⼊的结点 X,则在结点 A 和结点 B 插⼊结点 X 的操作序列为:q->next=s;s->next=p;
7. 访问第 i 个元素的前驱(1<i<=n)的时间复杂度为O(1)
8. 添加/删除操作
单链表
带头结点的单链表
带头结点的双循环单链表
单链表的头插法建立链表
单链表的头插法建⽴链表所得到的数据的顺序与输⼊的时候的顺序相反
单链表的头插法建⽴链表算法不简单,要引⼊⼤量的指针辅助运算。(F)
单链表的尾插发建立链表
单链表的尾插法建⽴链表所得到的数据的顺序与输⼊的时候的顺序相同
双链表
带头结点的双循环链表
链式存储的后插法
带头结点的双循环链表的空表
9. 3n+nlog2n+n2+8的数量级:n2
10. 算法的评价不包括并行性
11. 集合中任何两个结点之间都有逻辑关系但组织形式松散(F)
12. 数据元素具有相同的特性=数据项个数相同,类型一致
13. 数据在计算机存储器内表示时,物理地址与逻辑地址相同并且是连续的,称之为顺序存储结构
14. 算法
定义:有限序列
目的:分析效率求改进
15. 高效性:指算法的执行效率高(T)
指算法需要的时间性能(F)
16. 链表
Malloc()申请
Free()释放
在⼀个带头结点的双向循环链表中,若要在 p 所指向的结点之前插⼊⼀个新结点,则需要相继修改(4)个指针域的值
1、该新结点前驱指针指向p的前驱
2、p的前驱指针指向该新结点
3、该新结点的后继域指向p结点
4、前驱的后继域指向该新结点
17. 线性表
在进⾏添加/删除元素时,应该在删除元素前判空
在添加元素前判空(F)
可以在任何位置插入删除
除第⼀个和最后⼀个元素外,其余每个元素都由⼀个且仅有⼀个直接前驱和直接后继
元素之间的逻辑关系是通过(物理位置)决定的.
有限序列,可以为空
串是⼀种特殊的线性表
两种存储结构:线性和链式
线性表链式
线性表链式:插入删除方便,只需要向前或向后移动元素即可(F)
线性表链接存储:
链表是⼀种动态存储结构,链表的结点可调⽤申请 malloc()和 free()释放
链表的结点可⽤free()申请和⽤malloc()释放(F)
链表是⾮随机存取存储结构,对链表的存取必须从头指针开始
对链表的存取可以从任何结点开始(F)
插⼊删除运算⾮常⽅便;只需修改相应指针值
只需要向前或向后移动元素即可(F)
逻辑上相邻的元素,其物理位置⼀定相邻,元素之间的邻接关系由指针域指示
不需要预先分配存储空间,适用于数据量变化较大的情况
表的长度:数据结点的个数
适用于经常进行插入和删除的操作
链接存储的存储结构所占存储空间分两部分,⼀部分存放结点值,另⼀部分存放表示结点间关系的指针
线性表顺序存储
不便于插入和删除的实现,而链式存储便于
适用于变化量小的情况
必须按最⼤可能⻓度预分存储空间,存储空间利⽤率低,表的容量难以扩充,是⼀种静态存储结构
是一种随机存取结构
适用于经常进行存取的操作
删除时的最坏情况:要删除的元素是顺序表的第一个元素
删除时的最好情况:要删除的元素是顺序表的最后一个元素
要求能够较快的插⼊和删除,⼜要求储存结构能够反映数据元素之间的逻辑关系则应该以顺序储存⽅式储存
在⼀个⻓度为 n 的顺序存储的线性表中,向第 i 个元素(1<=i<=n+1)位置插⼊⼀个新元素时,需要从后向前依次后移(n-i+1)个元素
线性表一旦建立,就不能添加元素(F)
最后一个元素之后插入一个元素和删除最后一个元素,采用容量足够大的顺序表
长度为n,删除第i个元素,要向前移动n-1个元素
长度为n,第i个位置插入一个新元素,时间复杂度为O(n)
线性表是n个数据元素的有限序列(所以学院组织结构表就不是线性表)
顺序线性表中有 n 个数据元素,则删除表中第 i 个元素需要移动(n-1)个元素
18. 顺序表
做删除操作时,应该将表的长度-1
插⼊⼀个元素所需移动的元素平均数是(n+1)/2
顺序表的⻓度是指:表中数据元素的个数
向⼀个有 127 个元素的顺序表中插⼊⼀个新元素并保持原来顺序不变,平均要移动(63.5)个元素
在⼀个⻓度为 n 的顺序表中,删除值为 x 的元素时需要⽐较元素和移动元素的总次数为n
表尾插⼊⼀个元素的时间复杂性的量级为O(1)
19. 数组
逻辑结构à线性结构
存储结构à顺序结构
设⼀维数组中有 n 个数组元素,则读取值为 x 的数据元素的平均时间复杂度为O(n)
设⼀维数组中有 n 个数组元素,则读取第 i 个数组元素的平均时间复杂度为0(1)
假定利⽤数组 a[N]顺序存储⼀个栈,⽤ top 表示栈顶指针,top==-1 表示栈空,并已知栈未满,当元素 x进栈时所执⾏的操作为a[++top]= x
在⼀个具有 n 个单元的顺序栈中,假定以地址低端(即 0 单元)作为栈底,以 top 作为栈顶指针,则当做出栈处理时,top 变化为top—
20. 队列
先进先出
只能在队尾添加/插入新元素
只能在队首删除元素
⽆论是顺序存储还是链接存储的栈和队列,进⾏插⼊或删除运算的时间复杂性均为O(1)
利⽤顺序队进⾏元素⼊队时最⼤的问题是会出现假溢出现象
队列是被限定为只能在表的⼀端进⾏插⼊运算,在表的另⼀端进⾏删除运算的线性表
当利⽤⼤⼩为 N 的数组存储循环队列时,该队列的最⼤⻓度是n
从⼀个顺序循环队列中删除元素时,⾸先需要后移队首指针
判定⼀个队列 QU(最多元素为 m0)为满队列的条件是QU->rear - QU->front = = m0
在⼀个链队列中,front 和 rear 分别为头指针和尾指针,则插⼊⼀个结点 s 的操作为rear->next=s;rear=s;
在⼀个 n 个结点的双向链表中指针 p 所指向的结点之前插⼊⼀个新结点时,其时间复杂性的量级为O(1)
21. 栈
先进后出,后进先出
只能在栈顶做插入/删除操作
向顺序栈中插⼊新的元素分三步,分别是:判断溢出或栈满 修改栈顶指针 把新元素赋给栈顶单元
从顺序栈中删除元素分三步,分别是:判断栈空 栈顶指针的值返回 修改栈顶指针
向栈中压⼊元素的操作是:先移动栈顶指针,然后存⼊元素
设⽤链表作为栈的存储结构则退栈操作:必须判别栈是否为空
设⽤链表作为栈的存储结构则进栈操作:对栈不作任何判别
顺序栈中在做出栈运算时,应先判别栈是否为空
顺序栈中在做进栈运算时,应先判别栈是否为满
Push进pop出
设栈 S 和队列 Q 的初始状态为空,元素 e1,e2,e3,e4,e5,e6依次通过栈 S,⼀个元素出栈后即进⼊队列 Q,若 6 个元素出队的序列是 e2,e4,e3,e6,e5,e1,则栈的容量⾄少应该是3
⼀个栈的输⼊序列为:1,2,3,4,则栈的不可能输出的序列是4321
打印机à队列
判定⼀个顺序栈 ST(最多元素为 m0)为空的条件是ST->top==0
假定⼀个链式栈的栈顶指针⽤ top 表示,每个结点的结构具有两个域 data 和 next,出栈时进⾏的指针操作为top=top->next
删除⾮空的顺序存储结构的堆栈的栈顶元素,栈顶指针 top 的变化是top=top-1
向⼀个栈顶指针为 hs 的链栈中插⼊⼀个*s 结点时,应执⾏s->next=hs;hs=s;
顺序栈中当栈中元素为 m 时,做进栈运算时发⽣上溢,则说明栈的可⽤最⼤容量为m
判定⼀个顺序栈的 S(最多元素时 m0)为满的条件是S->top==m0-1
为了增加内存空间的利⽤率和减少发⽣上溢的可能性,由两个栈共享⼀⽚连续的内存空间时,应将两个
栈的(栈底)分别设在这⽚内存空间的两端,这样只有当两个栈的栈顶在栈空间的某⼀位置相遇时才产⽣上溢
设输⼊序列 1、2、3、…、n 经过栈作⽤后,输出序列中的第⼀个元素是 n,则输出序列中的第 i 个输出元素是n+1-i
判定⼀个顺序栈 S(栈空间⼤⼩为 n)为空的条件是S->top==0
设输⼊序列为 1、2、3、4、5、6,则通过栈的作⽤后可以得到的输出序列为:3,2,5,6,4,1
设指针变量 front 表示链式队列的队头指针,指针变量 rear 表示链式队列的队尾指针,指针变量 s 指向将要⼊队列的结点 X,则⼊队列的操作序列为rear->next=s;rear=s;
解决顺序队上溢的⽅法
1、每当删除⼀个队头元素时,则依次移动队中的元素,始终使 front 指针指向队列中的第⼀个位置
2、采⽤平移元素的⽅法:每当队列中加⼊⼀个元素时,队列中已有的元素向队头移动⼀个位置
3、建⽴⼀个⾜够⼤的存储空间,但这样做会造成空间的使⽤效率降低
4、发⽣上溢时,⾃动丢失多余元素(F)
22. 单链表
已知单链表尾指针,时间复杂度为O(1)
单链表中设置头结点:空表和非空表统一,算法处理一致
⾮空的循环单链表 head 的尾结点(由 p 所指向),满⾜条件:p->next==head
将⻓度为 n 的单链表链接在⻓度为 m 的单链表之后的算法的时间复杂度为O(m)
⼀个单链表中,若删除 p 所指向结点的后续结点(=单链表中指针 p 指向结点 m,若要删除 m 之后的结点(若存在),则需要修改指针的操作为),则执⾏p->next=p->next->next;
在⼀单链表中 n 个数据结点,则读第 i 个数据结点的平均时间复杂度为O(n)
对于⼀个具有 n 个结点的单链表,在已知的结点*p 后插⼊⼀个新结点的时间复杂性为O(1)
单链表的判空条件
不带头结点的单链表head为空:head=null
⼀条单链表的头指针变量为 head 且该链表没有头结点,判空:head=0
23. 树
树à层次
二叉树不是特殊的树,使用不是树转化过来的特殊情形
⼆叉树与树具有相同的树形结构(F)
二叉树是非线性数据结构,顺序存储结构和链式存储结构都能存储,但,不是所有的⼆叉树树形结构都适⽤顺序存储结构
若初始森林中共有 n 裸⼆叉树,进⾏ 2n-1 次合并后才能剩下⼀棵最终的哈夫曼树(F)
若⽬标串的⻓度为 n,模式串的⻓度为[n/3],则执⾏模式匹配算法时,在最坏情况下的时间复杂度是O(n2)
分支
设⾮空⼆叉树上叶⼦节点数为 n0,双分⽀数为 n²,单分⽀数为 n1,则n0=n2+1
深度
深度为 k 的完全⼆叉树中最少有(2k-1)个结点
设⼀棵完全⼆叉树中有 65个结点,则该完全⼆叉树的深度为7,因为2n-1
设⼆叉树有 n 个结点,则其深度无法确定
结点数
⼆叉树的第 k 层的结点数最多为2k-1
⼀棵⼆叉树上第 5 层的结点数最多为16个,因为2k-1
深度为 5 的⼆叉树最少有(5)个结点
如果 T2是由有序树 T 转化⽽来的⼆叉树,T后序结点=T2中序结点,T前序结点=T2前序结点
设某棵⼆叉树中有 2000 个结点,则该⼆叉树的最⼩⾼度为11,因为210=1024<2000,211=2048>2000
在⼀棵树中,每个结点最多有(1)个前驱结点
⼆叉树中第 i(i≥1)层上的结点数最多有(2i+1)个
利⽤ n 个值⽣成的哈夫曼树中共有(2n-1)个结点.
设⼆叉树根结点的层次为 0,⼀棵⾼度为 h 的满⼆叉树中的结点个数是2n+1-1
设 F 是由 T1、T2 和 T3三棵树组成的森林,与 F 对应的⼆叉树为 B,T1、T2 和 T3 的结点数分别为 N1、N²和 N3,则⼆叉树 B 的根结点的左⼦树的结点数为N1-1
对含有(1)个结点的⾮空⼆叉树,采⽤任何⼀种遍历⽅式,其结点访问序列均相同
⼀棵深度为 h 的满 k 叉树有如下性质: 第 h 层上的结点都是叶⼦结点,其余各层上的结点都有 k 棵⾮空⼦树.如果按层次顺序从 1 开始对全部结点编号,则各层上的结点数⽬是ki-1
实现任意⼆叉树,m 个树叶,⼀共 n 个结点,度为 1 的结点 t 个,度为 2 的结点有 p 个,则m=p+1
对于⼀棵具有 n 个结点的⼆叉树,当进⾏链接存储时,其⼆叉链表中的指针域的总数为 2n,其中(n-1)个⽤于链接孩⼦结点,(n+1)个空闲着
设深度为 k 的⼆叉树上只有度为 0和度为 2的节点,则这类⼆叉树上所含结点总数最少2k-1
二叉树共有5种不同的形态
具有 3 个结点的⼆叉树共有(5)种状态.
设某棵⼆叉树中只有度数为 0 和度数为 2的结点且度数为 0 的结点数为 n,则这棵⼆叉中共有(2n-1)个结点
在⼀棵⼆叉树中,度为 0 的结点个数为 n0,度为 2 的结点个数为 n²,则 n=n2+1
叶子结点
设某棵完全⼆叉树中有 100 个结点,则该⼆叉树中有(50)个叶⼦结点
设某棵⼆叉树的⾼度为 10,则该⼆叉树上叶⼦结点最多有512
某哈夫曼树中有 199 个结点,则该哈夫曼树中有(100)个叶⼦结点//(n+1)/2
指针域
设⼀棵 m 叉树的结点数为 n,⽤多重链表表示其存储结构,则该树中有(n(m-1)+1)个空指针域
设哈夫曼树中的叶⼦结点总数为m,若⽤⼆叉链表作为存储结构,则该哈夫曼树中总共有(2m)个空指针
域.
N 个结点链接存储,指针域总数 2n,链接孩⼦结点 2n,空闲的有 n+1
高度
对于⼀个具有 n 个结点的⼆叉树,当它为(完全二叉树)具有最⼩⾼度
具有 n(n>0)个结点的完全⼆叉树的⾼度为[log 2 (n+1)]或[log 2 n]+1
对于⼀个具有 n 个结点的⼆叉树,当它为⼀棵(单分支)⼆叉树时具有最⼤⾼度.
对于⼀个具有 n 个结点的⼆叉树,当它为单分⽀⼆叉树时具有最⼤⾼度,其⾼度为n
带权路径长度
左孩子、右孩子、双亲结点
将含有 83 个结点的完全⼆叉树从根结点开始编号,根为 1 号,后⾯按从上到下、从左到右的顺序对结
点编号,那么编号为 41 的双亲结点编号为20
三叉树
在三叉链表上,⼆叉树的求双亲运算很容易实现(F)
欲实现任意⼆叉树的后序遍历的⾮递归算法⼆不必使⽤栈结构,最佳⽅案是⼆叉树采⽤(三叉链表)存储结构.
在⼀棵具有 k 层的满三叉树中,结点总数为(3k-1)/2
⼀棵三叉树的结点数为 50,则它的最⼩⾼度为5
哈夫曼树
设⽤于通信的电⽂仅由 8个字⺟组成,字⺟在电⽂中出现的频率分别为
根据这些频率作为权值构造哈夫曼树,则这棵哈夫曼树的⾼度为7
先序、中序、后序遍历
前序:第⼀个结点 A 是根结点,是后序的最后⼀个结点
前序:⼦树的第⼀个结点为⼦树根结点
中序:根据前序的根节点,判断是否有左右⼦树。
中序:左⼦树--> 根节点--> 右⼦树
后序:左⼦树--> 右⼦树-->根节点
先序: 根节点-->左⼦树-->右⼦树
⼆叉树的先序遍历序列和后序遍历序列正好相反,则该⼆叉树满⾜的条件是任⼀结点⽆右孩⼦
⼆叉树的先序遍历序列和后序遍历序列正好相同,则该⼆叉树满⾜的条件是空或只有⼀个结点
⼆叉树的先序遍历序列和中序遍历序列正好相同,则该⼆叉树满⾜的条件是任⼀结点⽆左孩⼦
已知⼆叉树的前序遍历和后序遍历序列并不能惟⼀地确定这棵树,因为不知道树的根结点是哪⼀个。(F)
任何⼀棵⼆叉树的叶结点在其先根、中根、后跟遍历序列中的相对位置肯定不发生变化
任何⼀棵⼆叉树的叶结点在先序、中序和后序遍历序列中的相对次序不发生改变
⼆叉树结点的先根序列、中根序列和后根序列中,所有叶⼦结点的先后顺序完全相同
⼆叉树中,具有两个⼦⼥的⽗结点,在中序遍历序列中,它的后继结点最多只能有⼀个⼦⼥结点
由⼆叉树的前序和后序遍历序列(不能)惟⼀确定这棵⼆叉树
设 a,b 为⼀棵⼆叉树上的两个结点,在中序遍历时,a 在 b 前的条件是.a 在 b 左⽅
⼀棵⼆叉树满⾜下列条件:对任意结点,若存在左、右⼦树,则其值都⼩于它的左⼦树上所有结点的值,⽽⼤于右⼦树上所有结点的值.现采⽤(中根)遍历⽅式就可以得到这棵⼆叉树所有结点的递增序列
⼀棵⼆叉树有 n 个结点,要按某顺序对该⼆叉树中的结点编号,(号码为 1-n),编号须具有如下性质:
⼆叉树中任⼀结点 V,其编号等于其左⼦树中结点的最⼤编号加 1.⽽其右⼦树中结点的最⼩编号等于 V 的编号加 1.试问应按(中序)遍历顺序编号
在⼆叉链表上,求双亲运算的时间性能很好(F)
⼆叉判定树应用在:描述分类过程和处理判定优化等⽅⾯上
后缀表达式
24. 图
设 G1=(V1,E1)和 G2=(V2,E2)为两个图,如果 V1ÍV2,E1ÍE2 则称.G1是 G2 的⼦图
有向图
某有向图中有 n 个顶点,则该有向图对应的邻接表中有(n)个表头结点
对于⼀个有向图,若⼀个顶点的度为 k1,出度为 k2,则对应逆邻接表中该顶点单链表中的边结点数为k1-k2
图的逆邻接表存储结构只适⽤于(有向图)图
在⼀个具有 n 个顶点的有向图中,若所有顶点的出度数之和为 s,则所有顶点的度数之和为2s
在⼀个具有 n 个顶点的有向图中,若所有顶点的出度数之和为 s,则所有顶点的⼊度数之和为s
在⼀个具有 n 个顶点的有向完全图中,所含的边数为n(n-1)
有 8 个结点的有向完全图最多有(56)条边,因为n(n-1)
无向图
设⽆向图 G 中有 n 个顶点 e 条边,则⽤⽤邻接表作为图的存储结构进⾏深度优先或⼴度优先遍历的时间复杂度为O(n+e)
设⽆向图 G 中有 n 个顶点 e 条边,则其对应的邻接表中的表头结点和表结点的个数分别为n和2e
设某有向图的邻接表中有 n 个表头结点和 m 个表结点,则该图中有(m)条有向边
设⽆向图 G 中有 n 个顶点 e 条边,则⽤邻接矩阵作为图的存储结构进⾏⼴度优先遍历时的时间复杂度为O(n2)
如果 n 个顶点的图是⼀个环,则它有(n)棵⽣成树
设⽆向图G中有n个顶点e条边,则⽤邻接表作为图的存储结构进⾏深度优先遍历时的时间复杂度为O(n2)
图中的⼀条路径⻓度为 k,该路径所含的顶点数为k+1
当 n 个顶点的⽆向图 G 的顶点度数的最⼩值⼤于或者等于(n)时,G ⾄少有⼀条回路
在含 n 个顶点和 e 条边的⽆向图的邻接矩阵中,零元素的个数为n2-2e
对于⼀个具有 n 个顶点和 e 条边的⽆向图,若采⽤邻接表表示,则表头数量为n
对于⼀个具有 n 个顶点和 e 条边的⽆向图,若采⽤邻接表表示,则所有邻接表中的结点总数是2e
⼀个⽆向图有 n 个顶点和 e 条边,则所有顶点的度的和为(2e)
一个无向图有 n 个顶点和e 条边,则该⽆向图中所有顶点的⼊度之和为2e
在⼀个具有 n 个顶点和 e 条边的⽆向图的邻接矩阵中,表示边存在的元素(⼜称为有效元素)的个数为2e
假设⼀个有n个顶点和e条弧的有向图⽤邻接表表示,则删除与某个顶点vi相关的所有弧的时间复杂度是O(n+e)
在⼀个具有 n 个顶点的⽆向图中,要连通全部顶点⾄少需要(n-1)条边.
设⽆向图 G 中有 n 个顶点,则该⽆向图的最⼩⽣成树上有(n-1)条边
⼀个具有 n 个顶点的有向图最多有(n(n-1))条边
⼀个具有 n 个顶点的⽆向完全图的边数为n(n-1)/2
设某⽆向图中有 n 个顶点 e 条边,则建⽴该图邻接表的时间复杂度为O(n+e)
设⽆向图 G(如下图所示),则其最⼩⽣成树上所有边的权值之和为8
在⽆向图中定义顶点 vi 与 vj 之间的路径为从 vi 到 vj 的⼀个顶点序列
路径长度
⽤ Dijkstra 算法求某⼀顶点到其余各顶点间的最短路径是按路径⻓度(递增)的次序来得到最短路径的
关键路径是事件结点⽹络中的从源点到汇点的最⻓路径
邻接表
邻接表是图的⼀种链式存储
连通图
n 个顶点的连通图⾄少(n-1)条边
具有 6 个顶点的⽆向图⾄少应有(5)条边才能确保是⼀个连通图
在⼀个连通图中存在着(1)个连通分量
设某强连通图中有 n 个顶点,则该强连通图中⾄少有(n)条边
具有 50 个顶点的⽆向图⾄少应有(49)条边才能确保是⼀个连通图
对于⼀个具有 n 个顶点的⽆向连通图,它包含的连通分量的个数为1
如果从⽆向图的任⼀顶点出发进⾏⼀次深度优先搜索即可访问所有顶点,则该图⼀定是连通图
任何⼀个⽆向连通图的最⼩⽣成树有一棵或多棵
广度优先遍历和深度优先遍历
⼴度优先遍历类似于⼆叉树的层次遍历
若⼀个图的边集为{(A,B),(A,C),(B,D),(C,F),(D,E),(D,F)},则从顶点 A 开始对该图进⾏深度优先搜索,得到的顶点序列可能为A,C,F,D,E,B
已知图的邻接矩阵同下图所示,根据算法,则从顶点 0 出发,按⼴度优先遍历的结点序列是0 1 2 3 4 6 5
已知图的邻接表如下所示,根据算法,则从顶点 0 出发按⼴度优先遍历的结点序列是 0 3 2 1
已知图的邻接表如下所示,根据算法,则从顶点 0 出发按深度优先遍历的结点序列是 0 1 2 3
图的边集
⼀个图的边集为{<0,1>3,<0,2>5,<0,3>5,<0,4>10,<1,2>4,<2,4>2,<3,4>6},则从顶点 v0到顶点 v4共有(4)条简单路径
若⼀个图的边集为{<1,2>,<1,4>,<2,5>,<3,1>,<3,5>,<4,3>},则从顶点 1开始对该图进⾏⼴度优先搜索,得到的顶点序列可能为1,2,4,5,3
拓扑排序
拓扑排序:可以判断出⼀个有向图中是否有环(回路)
任⼀个有向图的拓扑序列有一个或多个
稠密图、稀疏图(普里姆和克鲁斯卡尔)
⽤普⾥姆(Prim)算法求具有 n 个顶点 e 条边的图的最⼩⽣成树的时间复杂度为n2
若要求⼀个稠密图 G 的最⼩⽣成树,最好⽤(普里姆) 算法来求解.
若要求⼀个稀疏图 G 的最⼩⽣成树,最好⽤(克鲁斯卡尔) 算法来求解.
设有⼀稠密图 G,则 G 采⽤(矩阵)存储较省空间.
设有⼀稀疏图 G,则 G 采⽤(表)存储较省空间
领接矩阵
⽆向图的邻接矩阵是⼀个对称矩阵
已知⼀个图的邻接矩阵表示,计算第 i 个结点的⼊度的⽅法是:求矩阵第 i 列⾮零元素之和
已知⼀个图的邻接矩阵表示,删除所有从第 i 个结点出发的边的⽅法是:将矩阵第 i ⾏全部置为 0
带权有向图 G ⽤邻接矩阵 A 存储,则顶点 i 的⼊度等于 A 中第 i 列⾮⽆穷的元素个数之和
深度优先遍历类似于⼆叉树的先序遍历
图的深度优先遍历序列不唯一
⽤邻接表表示图进⾏深度优先遍历时,通常是采⽤(栈)来实现算法的
⽤邻接表表示图进⾏⼴度优先遍历时,通常是采⽤(队列)来实现算法的.
对于具有 n 个顶点的图,若采⽤邻接矩阵表示,则该矩阵的⼤⼩为n2
有向图 G ⽤邻接矩阵存储,其第 i ⾏的所有元素之和等于顶点 i 的出度
拓扑排序算法是通过重复选择具有(0)个前驱顶点的过程来完成的。//拓扑à没有前驱的
图遍历
⾮连通图不能⽤深度优先搜索法(F)
顶点与边
在⼀个图中,所有顶点的度数之和=所有边数
设某完全⽆向图中有 n 个顶点,则该完全⽆向图中有(n(n-1))/2条边
25. 排序
大多数排序算法都有两个基本的操作:比较和移动
设需要对 10个不同的记录关键字进⾏排序,则⾄少需要⽐较(9)次
排序的⽬的是为了以后对已排序的数据元数进⾏(查找)操作
直接插⼊排序和冒泡排序的时间复杂性为 O(n²), 若初始数据有序(即正序),则时间复杂性为O(n)
初始值
选择排序/简单选择排序/直接选择排序
在直接插⼊和直接选择排序中,若初始数据基本反序,则选⽤直接选择排序
在所有的排序⽅法中,关键字的⽐较次数与记录的初始排列⽆关的是直接选择排序
对⼀个由 n 个整数组成的序列,借助排序过程找出其中的最⼤值,希望⽐较次数和移动次数最少,应选
⽤(直接选择排序)
关键字的⽐较次数与记录的初始排列⽆关
在直接选择排序中,记录⽐较次数为 O(n²)数量级,记录的移动次数为O(n)数量级.
将上万个⼀组⽆序并且互不相等的正整数序列,存放于顺序存储结构中,采⽤(选择排序)⽅法能够最快地找出其中最⼤的正整数
⽬前以⽐较操作为基础的内部排序的时间复杂性 T(m)的范围是 O(nlog2n)~ O(n²),其⽐较次数
与待排序记录的初始状态⽆关的是(直接选择)排序
排序⽅法中,从未排序序列中挑选元素,并将其依次放⼊已排序序列(初始时为空)的⼀端的⽅法,称
为选择排序
插入排序/直接插入排序
对 n 个元素进⾏直接插⼊排序时间复杂性为n2
设⼀组初始记录关键字的⻓度为 8,则最多经过(7)趟插⼊排序可以得到有序序列.
在对 n 个元素进⾏直接插⼊排序的过程中,共需要进⾏(n-1)趟.
当初始序列已按健值有序时,⽤直接插⼊算法进⾏排序,需要⽐较的次数为n-1
直接插⼊排序算法的平均时间复杂度为O(n²)
排序⽅法中,从未排序序列中依次取出元素与已排序序列(初始时为空)中的元素进⾏⽐较,将其放⼊
已排序序列的正确位置上的⽅法,称为插入排序
对于直接插⼊排序、冒泡排序、简单选择排序、堆排序、快速排序,当⽂件“局部有序”或⽂件⻓度较⼩
的情况下,最佳的内部排序⽅法是直接插入排序
冒泡排序
对 n 个元素的序列进⾏冒泡排序,在降序的情况下⽐较次数最多,其⽐较次数为(n(n-1))/2
对 n 个元素的序列进⾏冒泡排序,最少的⽐较次数是 n,此时元素的排列情况是已从⼩到⼤排列
对 n 个元素的序列进⾏冒泡排序,最少的⽐较次数是 n,此时元素的排列情况是升序
对 n 个元素的序列进⾏冒泡排序,其⽐较次数为 n(n-1)/2时,其原始数据序列是(降序)情况
对n个不同的排序码进⾏升序冒泡法排列,从⼤到⼩排列好的⽐较的次数最多
对n个不同的排序码进⾏冒泡排序,在元素⽆序的情况下⽐较的次数为(n(n-1))/2
排序时扫描待排序记录序列,顺次⽐较相邻的两个元素的⼤⼩,逆序时就交换位置,这是冒泡排序的基
本思想
对 n 个元素的序列进⾏冒泡排序,在(降序)的情况下⽐较次数最多
对 n 个元素的序列进⾏冒泡排序,最少的⽐较次数是n-1
在对⼀组有 8 个记录的数据表进⾏冒泡排序时,在整个排序过程中共需进⾏(7)趟才可完成.
在⽂件局部有序或⽂件⻓度较⼩的情况下,最佳的排序⽅法是冒泡排序
快速排序
快速排序是对序列中的元素通过适当的位置交换将有关元素⼀次性地放置在其最终位置上
最坏的情况下的时间复杂度是O(n²)
在最坏情况下(如初始记录已有序),快速排序的空间复杂性为n
在对 n 个元素进⾏快速排序的过程中,最好情况下需要进⾏(log 2 n)趟
快速排序在(被排序的数据已基本有序)情况下最不利于发挥其⻓处.
在堆排序,快速排序和归并排序中,若从平均情况下排序最快,则应⾸先选取(快速排序)⽅法
在堆排序中、快速排序和归并排序中,若从节省存储空间考虑,排在中间的是(快速排序)⽅法
每次把待排序的元素划分为左、右两个⼦区间,其中左区间中元素的关键字均⼩于等于基准元素的关键字,右区间中元素的关键字均⼤于等于基准元素的关键字,则此排序⽅法叫作快速排序
快速排序算法的平均时间复杂度为O(nlog 2 n)
归并排序
依次将每两个相邻的有序表合并成⼀个有序表的排序⽅法叫作归并排序
在归并排序过程中,需归并的趟数为log2n
若对 n 个元素进⾏归并排序,则进⾏每⼀趟归并的时间复杂度为n
⼆路归并排序的时间复杂度为(nlog2n)
在归并排序中,归并趟数的数量级表示为O(log2n)
在内部排序中,要求附加的内存容量最⼤的是归并排序
设⼀组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70),其中含有 5个⻓度为 2 的有序⼦表,则⽤归并排序的⽅法对该记录关键字序列进⾏⼀趟归并后的结果为15,25,35,50,20,40,80,85,36,70
在归并排序中,若待排序记录的个数为 20,则共需要进⾏ 5趟归并,在第 3趟归并中,是把⻓度为 4 的
有序表归并为⻓度为4的有序表
希尔排序
设⼀组初始记录关键字序列为(9,8,7,6,5,4,3,2,1,0),则以增量 d=5 的⼀趟希尔排序结束后前 5条记录关键字为4,3,2,1,0
⼀趟排序结束后不⼀定能够选出⼀个元素放在其最终位置上的是希尔排序
希尔排序的增量序列必须是递减
堆排序
在堆排序中、快速排序和归并排序中,若只从最坏的情况下排序最快并且要节省内存考虑,应选⽤(堆排序)
时间复杂度不受数据初始状态影响⽽恒为 O(nlog2n)的是堆排序
在任何情况下,时间复杂度均为 O(nlog2n)的不稳定的排序⽅法是堆排序
已知⼀个链表中有 3000 个结点,每个结点存放⼀个整数,(堆排序方法)可⽤于解决这 3000个整数的排序问题且不需要对算法作⼤的变动
设有 1000 个⽆序的元素,希望⽤最快的速度挑选出其中前 10 个最⼤的元素,最好选⽤(堆)排序法
交换排序
当两个元素⽐较出现反序时(即逆序)就相互交换位置的排序⽅法叫作交换排序
基数排序
如果将所有中国⼈按照⽣⽇来排序,则使⽤(基数排序)算法最快
比较排序的稳定和快慢
时间复杂度
关键字序列
26. 查找
二分查找
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本