数据结构笔记汇总

1.逻辑结构:线性和非线性

线性:线性(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 )的时间复杂度为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 ⼊⼀个新元素时,需要从后向前依次后移(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

在⼀棵树中,每个结点最多有(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

图的边集

若⼀个图的边集为{则从顶点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)、栈、队、数组

非线性:树形(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 )的时间复杂度为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 ⼊⼀个新元素时,需要从后向前依次后移(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

在⼀棵树中,每个结点最多有(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

图的边集

若⼀个图的边集为{则从顶点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.查找

二分查找

Original: https://www.cnblogs.com/zrlm/p/16407073.html
Author: 铃木奈奈
Title: 数据结构笔记汇总

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/605133/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球