第一章 基础知识
🍑 关于时间复杂度 可以看看这篇文章:https://blog.csdn.net/weixin_63866037/article/details/128087397
视频:BV13d4y1K74p
🍑 关于数据、数据元素、数据项、数据对象 可以看看这篇文章:https://blog.csdn.net/baidu_31657889/article/details/92797055
判断题
1-1 + 1-2
数据项是数据的最小单位。(T)
数据元素是数据的最小单位。(F)
解析:
1-3
数据的逻辑结构是指数据的各数据项之间的逻辑关系。(F)
解析:
错的,简而言之,逻辑结构就是数据元素间的逻辑关系,而不是数据元素内部的数据项之间的关系
1-4
数据结构概念包括数据之间的逻辑结构、数据在计算机中的存储方式和数据的运算三个方面。(T)
解析:
数据元素可以由类型互不相同的数据元素构成,但线性表中的元素必须是相同类型
1-6
数据元素可以由类型互不相同的数据项构成。(T)
解析:
数据元素是数据的基本单位;
数据项是组成数据元素、有独立含义的、不可分割的最小单位;
数据对象是性质相同的数据元素的集合,是数据的一个子集;
1-7
数据的逻辑结构说明数据元素之间的顺序关系,它依赖于计算机的存储结构。(F)
解析:
课本P4:数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的。
1-8 + 1-9
数据结构的抽象操作的定义与具体实现有关。(F)
抽象数据类型与计算机内部表示和实现无关。(T)
解析:
没有关系。 抽象操作是外部怎样使用该数据结构 ;具体实现是内部的事情,外部不需要关心。
1-12
算法的优劣与算法描述语言无关,但与所用计算机有关(F)
解析:
课本P11:时间复杂度和空间复杂度是衡量算法的两个主要指标;
1-25
算法可以没有输入,但是必须有输出(T)
解析:
算法可以不要输入,算法按照自身的初始状态执行下去就可以了算法必须要有输出,不然没有输出的话算法还有什么用呢
选择题
2-19
与数据元素本身的形式、内容、相对位置、个数无关的是数据的(C)
A.存储结构
B.存储实现
C.逻辑结构
D.运算实现
解析:
数据的逻辑结构是从逻辑关系上描述数据,它与数据的存储无关,是独立于计算机的
2-26
要判断一个整数N(>10)是否素数,我们需要检查3到 sqrt(N)之间是否存在奇数可以整除N。则这个算法的时间复杂度是:O(sqrt(N))
int N;
scanf("%d",&N);
for(int i=3;i<=sqrt(N);i++)
{
if.......
}
解析:
可以理解成循环sqrt(N)次
2-28
计算机算法必须具备输入、输出和()等五个特性。(B)
A.可行性、可移植性和可扩充性
B.可行性、确定性和有穷性
C.确定性、有穷性和稳定性
D.易读性、稳定性和安全性
解析:
首先是可行性
2-29
时间复杂度分析
下面算法的时间复杂度为 O(1)
int foo(int n)
{
return n * (n + 1) / 2;
}
解析:
这个算法的时间复杂度为 O(1)。无论 n 的值是多少,该算法都只需要一步计算就可以得出结果。
2-30
设 n 是描述问题规模的非负整数,下列程序段的时间复杂度是:(B)
x = 0;
while ( n >= (x+1)*(x+1) )
x = x+1;
解析:
2-2
被计算机加工的数据元素不是孤立的,它们彼此之间一般存在某种关系,通常把数据元素之间的这种关系称为 (B)
A.规则
B.结构
C.集合
D.运算
解析:
数据结构是带“结构”的数据元素的集合,“结构”就是指数据元素之间存在的关系。
2-3
在 Data_Structure = (D,R)中,D 是( )的有限集合。(A)
A.数据元素
B.算法
C.数据操作
D.数据对象
解析:
其中D是数据元素的集合,R是该集合中所有元素之间的关系的有限集合
2-4
计算机所处理的数据一般具有某种关系,这是指(B)。
A.数据与数据之间存在的某种关系
B.数据元素与数据元素之间存在的某种关系
C.元素内数据项与数据项之间存在的某种关系
D.数据文件内记录与记录之间存在的某种关系
解析:
数据结构是指相互之间存在一定关系的数据元素的集合,数据元素是讨论数据结构时涉及的最小数据单位,元素内部各数据项一般不给予考虑。
2-5
以下关于数据结构的说法中正确的是(A)
A.数据结构的逻辑结构独立于其存储结构
B.数据结构的存储结构独立于该数据结构的逻辑结构
C.数据结构的逻辑结构唯一地决定了该数据结构的存储结构
D.数据结构仅由其逻辑结构和存储结构决定
解析:
B. 存储结构: 数据的逻辑结构用计算机语言的实现;
C. 数据的逻辑结构和存储结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构;
D. 数据结构概念包括数据之间的逻辑结构、数据在计算机中的存储方式和数据的运算三个方面;
2-11
下列属于线性数据结构的是(A)。
A.栈 B.树 C.图 D.集合
2-12
下列属于线性数据结构的是(A)。
A.队列 B.树 C.图 D.二叉树
2-13
下列属于非线性数据结构的是(B)。
A.线性表 B.图 C.栈 D.队列
解析:
线性结构是一个有序数据元素的集合。
线性结构的特点是数据元素之间存在一对一的线性关系。
常见的线性结构有:线性表,栈,队列,双队列,数组,串。
常见的非线性结构有;二维数组,多维数组,广义表,树(二叉树等),图。
2-14
可以用( )定义一个完整的数据结构。(D )
A、数据元素
B、数据对象
C、数据关系
D、抽象数据类型
解析:
抽象数据类型(ADT)描述了数据的逻辑结构和抽象运算,通常用(数据对象,数据关系,基本操作集)这样的三元组来表示,从而构成了一个完整的数据结构定义。
数据项:一个元素由若干数据项组成
数据元素:组成数据对象的基本单位
数据对象:性质相同的数据元素的集合(类似于数组一般)
2-15
以下与数据的存储结构无关的术语是(D)
A、循环队列
B、链表
C、哈希表
D、栈
解析:
省流:找带"表"的 循环队列是数据表
数据的存储结构:顺序存储、链式存储、索引存储和散列存储。
A循环队列本身是用数据表(存储)表示的队列(逻辑),是一个数据结构;
B、C链表和哈希表是存储结构;D栈是逻辑结构。
2-16
基本术语
▁▁是数据的基本单位,在计算机中通常作为一个整体进行考虑和处理(B)
A.二进制位
B.数据元素
C.数据项
D.数据对象
解析:
数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整体处理。也被称为记录。
比如 畜类 牛、马、羊、鸡、猪、狗等动物当然就是畜类的数据元素。
填空题
4-18
基本术语
( 算法 ) 是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。
4-2
基本术语
( 数据 ) 是客观事物的符号表示,是所有能输入到计算机中并被计算机程序处理的符号的总称。
4-3
基本术语
( 结构 ) 是指数据元素之间的关系。
4-11
基本术语
( 抽象数据类型 ) 一般指由用户定义的、表示应用问题的数学模型,以及定义在该模型上的一组操作的总称。
4-16
基本术语
( 数据类型 ) 是一组的值的集合,以及定义在这个值的集合之上的一组操作的总称。
4-6
数据结构的数学定义为一个二元组:
DS=(D,R)
其中:DS 是数据结构,D 是 ( 数据元素 ) 的有限集,
R 是 D 上的 ( 关系 ) 的有限集。
4-9
存储结构的分类
在计算机中,数据元素之间的关系有两种基本表示方法:
(1) ( 顺序映像 ) 其特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系;
(2) ( 非顺序映像 ) 其特点是借助指示元素存储地址的指针来表示数据元素之间的逻辑关系。
请填:顺序映像/非顺序映像或顺序存储结构/链式存储结构。
4-15
基本术语
( 数据对象 ) 是性质相同的数据元素的集合,是 ( 数据 ) 的一个子集。
第二章 线性表
判断题
1-1
若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用顺序表存储最节省时间。(T)
解析:
顺序表,顺序存储的线性表,也就是数组。
而且元素是在最后的位置进行插入和删除运算,也就不涉及其他元素进行位移的额外操作,最多涉及的就是去扩展空间了。
1-2
(neuDS)在顺序表中逻辑上相邻的元素,其对应的物理位置也是相邻的。(T)
1-3
(neuDS)所谓随机存取,就是通过首地址和元素的位序号值可以在O(1)的时间内找到指定的元素。(T)
1-4
(neuDS)在顺序表上进行插入、删除操作时需要移动元素的个数与待插入或待删除元素的位置无关。(F)
解析:
顺序表当中进行插入与删除操作与所在位置有关
1-6
在线性表的顺序存储结构中,插入和删除元素时,移动元素的个数与该元素的位置有关。(T)
1-7
在顺序表中取出第i个元素所花费的时间与i成正比。(F)
解析:
取出第i个元素的意思不是找到这个元素,而是找到后删除或别的什么操作。
那么找到第i个元素的过程是不花费时间的,仅仅是一个地址移位运算而已。
但是接下来需要把i后面所有元素往前移一位,这才是花费时间的地方。
所以不是与i成正比,而是i越大花费时间越小
1-8
顺序存储的线性表可以随机存取。(T)
解析:
顺序表,顺序存储的线性表,也就是数组。
线性表的顺序存储结构可以通过线性表的首址加偏移的方法计算出来第i个数据的位置;而线性表的链式存储结构要访问第i个数据,就必须先访问前面的i-1个数据;
1-9
顺序存储方式只能用于存储线性结构。(F)
1-10
顺序存储结构的主要缺点是不利于插入或删除操作。(F)
1-11
若用链表来表示一个线性表,则表中元素的地址一定是连续的。(F)
1-12
(neuDS)在线性表的顺序存储结构中可实现快速的随机存取,而在链式存储结构中则只能进行顺序存取。(F)
1-13
线性表采用链式存储表示时,所有结点之间的存储单元地址可以连续也可以不连续。(T)
1-14
链表的每个结点都恰好有一个指针。(F)
解析:
链表的每个结点中通常包含两个指针,一个指向下一个结点,另一个指向前一个结点
1-15
线性表的顺序存储表示优于链式存储表示。(F)
1-16
在具有头结点的链式存储结构中,头指针指向链表中的第一个元素结点。(F)
解析:
头指针指向头结点
1-17
带头结点的单循环链表中,任一结点的后继结点的指针域均不空。(T)
解析:
循环链表:在链表尾部使用指针,并且让它指向链表头部的数据,将链表变成环形。这便是“循环链表”,也叫“环形链表”。
循环链表没有头和尾的概念。想要保存数量固定的最新数据时通常会使用这种链表。
1-18
链式存储的优点是插入、删除元素时不会引起后续元素的移动,缺点是只能顺序访问各元素。(T)
1-19
在一个设有头指针和尾指针的单链表中,执行删除该单链表中最后一个元素的操作与链表的长度无关。(F)
解析:
单链表没有指向前驱节点的指针,所以就算有尾指针,也得从头找到尾,删除最后一个
1-20
链表 - 存储结构
链表中逻辑上相邻的元素,其物理位置也一定相邻。(F)
1-21
循环链表可以做到从任一结点出发,访问到链表的全部结点。(T)
选择题
2-25
线性表若采用链式存储结构时,要求内存中可用存储单元的地址(B)
A.必须是连续的
B.连续或不连续都可以
C.部分地址必须是连续的
D.一定是不连续的
2-26
线性表L在什么情况下适用于使用链式结构实现?(A)
A.需不断对L进行删除插入
B.需经常修改L中的结点值
C.L中含有大量的结点
D.L中结点结构复杂
解析:
因为链式结构删除插入最简单
2-27
在单链表中,若p所指的结点不是最后结点,在p之后插入s所指结点,则执行(C)
A.s->next=p; p->next=s;
B.s->next=p->next; p=s;
C.s->next=p->next; p->next=s;
D.p->next=s; s->next=p;
2-29
对于一非空的循环单链表,h和p分别指向链表的头、尾结点,则有:(B)
A.p->next == h
B.p->next == NULL
C.p == NULL
D.p == h
解析:
非空,就不能出现NULL, 其次循环链表,头指向尾
2-31
链接存储的存储结构所占存储空间(A)。
A.分两部分,一部分存放结点值,另一部分存放表示结点间关系的指针
B.只有一部分,存放结点值
C.只有一部分,存储表示结点间关系的指针
D.分两部分,一部分存放结点值,另一部分存放结点所占单元数
2-32
单链表的存储密度(C)
A.大于1
B.等于1
C.小于1
D.不能确定
解析:
存储密度=单链表数据项所占空间/结点所占空间。 结点所占空间有数据域和指针域组成。故存储密度小于1
链表作为数据的存储结构本身是用来存数据的,存储密度就是节点中数据的存储量与整体的数据量的比值,当然整体的数据量中有指针的占据的空间,如果将一个结点的整体数据量看为1,那么除去指针的占有,它的比值总是小于1的。
2-15
已知表头元素为c的单链表在内存中的存储状态如下表所示:
现将f存放于1014H处,并插入到单链表中,若f在逻辑上位于a和e之间,则a、e、f的“链接地址”依次为(D)
A、1010H, 1014H, 1004H
B、1010H, 1004H, 1014H
C、1014H, 1010H, 1004H
D、1014H, 1004H, 1010H
解析:
根据存储状态,单链表的结构如下图所示。其中“链接地址”是指结点next所指的内存地址。当结点f插入后,a指向f, f指向e, e指向b。显然a、e和f的“链接地址”分别是f、b和e的内存地址,即1014H、1004H和1010H。
2-17
在单链表中,要删除某一指定结点,必须先找到该结点的(A)
A.直接前驱
B.自身位置
C.直接后继
D.直接后继的后继
解析:
2-18
在循环双链表的p所指结点之前插入s所指结点的操作是(D)
A.p->prior = s; s->next = p; p->prior->next = s; s->prior = p->prior;
B.p->prior = s; p->prior->next = s; s->next = p; s->prior = p->prior;
C.s->next = p; s->prior = p->prior; p->prior = s; p->right->next = s;
D.s->next = p; s->prior = p->prior; p->prior->next = s; p->prior = s;
解析:
一个结点分为三部分:prior data next
其中data用来存放数据
prior指向前一个结点的地址
next指向后一个结点的地址
2-19
线性表的链式存储结构与顺序存储结构相比,其优点是(C)。
A.所有的操作算法实现简单。
B.便于随机存取。
C.便于插入与删除。
D.便于节省存储空间。
2-20
在具有N个结点的单链表中,实现下列哪个操作,其算法的时间复杂度是O(N)?(B)
A.删除开始结点
B.遍历链表和求链表的第i个结点
C.删除地址为p的结点的后继结点
D.在地址为p的结点之后插入一个结点
解析:
链表只要看见“添加删除” 就是O(1)
是链表不是顺序表哦不要搞混
2-22
在单链表L中,若删除p所指结点(非尾结点)的直接后继结点,修改指针的语句应为( D)
A.p=p->next->next;
B.p=p->next; p->next=p->next->next;
C.p->next=p->next;
D.p->next=p->next->next;
解析:
p->next=p->next;总不能自己等于自己吧,所以得往后指 next
2-24
向一个有127个元素的顺序表中插入一个新元素并保持原来顺序不变,平均要移动的元素个数为(B)
A.8
B.63.5
C.63
D.7
解析:
顺序表 平均要移动的元素个数为:n/2
2-1
对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度为:(B)
A.O(1), O(1)
B.O(1), O(N)
C.O(N), O(1)
D.O(N), O(N)
解析;
我们在数组的末尾添加一个元素,这通常是一个O(1)的操作,因为不需要移动已有的元素。但是,如果我们要在数组中间或开始处添加一个元素,我们需要将后续的所有元素向后移动一位以腾出空间,这就需要O(N)的时间复杂度,因为最坏情况下我们可能需要移动所有的N个元素。
2-2
在N个结点的顺序表中,算法的时间复杂度为O(1)的操作是:(A)
A.访问第i个结点(1≤i≤N)和求第i个结点的直接前驱(2≤i≤N)
B.在第i个结点后插入一个新结点(1≤i≤N)
C.删除第i个结点(1≤i≤N)
D.将N个结点从小到大排序
解析:
这里是顺序表,不要看见插入删除就是O(1)
2-3
某线性表采用顺序存储结构,每个元素占4个存储单元,首地址为100,则第12个元素的存储地址为(A)。
A.144
B.145
C.147
D.148
解析:
100 + (12 - 1 )* 12 = 144
2-4
(neuDS)线性表的顺序存储结构是一种(A)
A.随机存取的存储结构
B.顺序存取的存储结构
C.索引存取的存储结构
D.散列存取的存储结构
解析:
在顺序存储结构中,可以直接根据元素的序号快速计算出元素存储的地址,因此可以实现随机存取。所谓随机存取,是指可以直接根据元素的索引直接访问,而不需要从头开始按顺序访问其他元素。
2-5
顺序存储表示中数据元素之间的逻辑关系是由(C)表示的。
A.指针
B.逻辑顺序
C.存储位置
D.问题上下文
2-7
若长度为n的非空线性表采用顺序存储结构,在表的第i个位置插入一个数据元素的合法值应该是(B)。
A.1≤i≤n
B.1≤i≤n+1
C.0≤i≤n-1
D.0≤i≤n
解析:
在顺序存储结构的线性表中,位置是从1开始计数的
如果线性表的长度为n,那么合法的插入位置i是n+1(在表的末尾插入)
正确答案是:
B. 1≤i≤n+1
2-9
若线性表最常用的操作是存取第i个元素及其前驱的值,则采用(D)存储方式节省时间。
A.单链表
B.双向链表
C.单循环链表
D.顺序表
解析:
这不就是数组最擅长的事情 存值
2-10
以下说法错误的是(D)。
A.求表长、定位这两种运算在采用顺序存储结构时实现的效率不比采用链式存储结构时实现的效率低
B.顺序存储的线性表可以随机存取
C.由于顺序存储要求连续的存储区域,所以在存储管理上不够灵活
D.线性表的链式存储结构优于顺序存储结构
2-11
若某线性表最常用的操作是存取任一指定序号的元素和在最后进行插入和删除运算,则利用(A)存储方式最节省时间。
A.顺序表
B.双链表
C.带头结点的双循环链表
D.单循环链表
2-12
采用顺序表存储结构存储的线性表,其首地址为100,每个元素的长度为2,则第5个元素的地址为。(B)
A.110
B.108
C.100
D.120
2-13
在一个长度为n的顺序表中,向第i个元素(1≤i≤n+1)位置插入一个新元素时需要从后向前移动多少个元素。(B)
A.n-i
B.n-i+1
C.n-i-1
D.i
解析:
特殊值法,长度为5的数组,向第5个元素前插入一个元素,需要移动1个元素
2-14
设顺序表L中有n个数据元素,则删除该表中第i个数据元素需要移动移动 个元素。
A.n-1-i
B.n+L-i
C.n-i
D.i
解析:
特殊值法,上题是插入,这回是删除
长度为5的数组,向第5个元素前插入一个元素,需要移动0个元素
填空题
4-1
顺序表 - 地址计算
假设顺序表第 1 个元素的内存地址是 100,每个元素占用 2 字节内存空间,则第 5 个元素的内存地址是(108)
4-2
在长度为n的顺序表L中将所有值为x的元素替换成y,该算法的时间复杂度为( O(n) )
4-3
在长度为n的循环单链表L中查找值最大的结点,其时间复杂度为( O(n) )
4-4
在有n个元素的顺序表中删除任意一个元素所需移动元素的平均次数为( (n-1)/2 )
解析:
在一个有5个元素的顺序表中(数组),如果要删除一个位于表中第1个位置的元素,那么需要移动的元素个数就是从第2个到第5个元素,也就是4个元素。因此,如果删除第2个元素,需要移动3个元素,删除第3个元素需要移动2个元素,以此类推,删除第n个元素则不需要移动任何元素。
要计算删除任意一个元素所需移动元素的平均次数,我们可以对所有可能的i的情况求平均。公式如下:
平均移动次数 = (n-1 + n-2 + n-3 + … + 1 + 0) / n
这个等差数列的和可以用公式计算:
S = (首项 + 末项) * 项数 / 2
在这个问题中,首项 a1 = n-1,末项 an = 0,项数 n。
所以移动次数的总和 S = (n-1 + 0) * n / 2 = n(n-1)/2
现在我们用总和除以n,得到平均移动次数:
平均移动次数 = (n(n-1)/2) / n = (n-1)/2
因此,在有n个元素的顺序表中删除任意一个元素所需移动元素的平均次数为 (n-1)/2。
4-5
在有n个元素的顺序表中的任意位置插入一个元素所需移动元素的平均次数为( n/2 )
解析:
N个元素的顺序表可插入的位置有N+1个,
移动次数总数为0+1+2…+n=(0+n)*(n+1)/2
平均次数为 总数/(N+1)= n/2
4-6
链接存储的特点是利用( 指针 )来表示数据元素之间的逻辑关系。
4-7
对于一个具有n(n≥1)个结点的单链表,插入一个尾结点的时间复杂度是( O(n) )
4-8
有一个长度为n的循环单链表L,在p所指的结点之前插入一个新结点,其时间复杂度为( O(n) )
4-9
有一个含有n个元素的线性表,可以采用单链表或双链表存储,其主要的操作是插入和删除第一个元素,最好选择(单链表)作为存储结构。
4-10
某个含有n个元素的线性表可以采用单链表或双链表存储结构,但要求快速删除指定位置的结点,应采用(双链表)
第三章 栈和队列
判断题
1-1
通过对堆栈S操作:Push(S,1), Push(S,2), Pop(S), Push(S,3), Pop(S), Pop(S)。输出的序列为:123(F)
解析:
1进栈,2进栈,2出栈,3进栈,3出栈,1出栈;输出序列为:231
1-3
若一个栈的输入序列为{1, 2, 3, 4, 5},则不可能得到{3, 4, 1, 2, 5}这样的出栈序列。(T)
解析:
这里我们要非常了解栈的性质,就是栈是后进先出的数据结构,因此我们注意到如果第一个元素首先输出的是3,那么3出栈之后栈内的情况就是(1,2),因此后面无论怎么输出2都应该先比1输出。
如何快速判断一个数列是否是合法的出栈顺序 请看https://blog.csdn.net/kuihan8061/article/details/109638675
1-5
栈是插入和删除只能在一端进行的线性表;队列是插入在一端进行,删除在另一端进行的线性表。(T)
解析:
队首出队列,队尾进队列
队列先进先出,栈后进先出
1-7
顺序栈中元素值的大小是有序的。(F)
解析:
顺序栈是指用顺序存储结构实现的栈,栈中的元素不一定是有序的
1-8
在n个元素连续进栈以后,它们的出栈顺序和进栈顺序一定正好相反。(T)
解析:
先进后出嘛
1-9
栈顶元素和栈底元素有可能是冋一个元素。(T)
解析:
在一个只包含一个元素的栈中,这个元素即是最后入栈的元素,也是最先入栈的元素,因此它既是栈顶元素,也是栈底元素。
1-10
栈是一种对进栈、出栈操作总次数做了限制的线性表。(F)
解析:
可以进行任意多次的进栈、出栈操作,但栈中最多只有m个元素
1-17
循环队列也存在着空间溢出问题。(T)
解析:
循环队列解决的是“假溢出”问题,但是仍然出现真正的溢出问题。假溢出指的是下标溢出,真溢出指的是空间溢出。
循环队列面临着数组可能溢出的问题。
1-18
循环队列执行出队操作时会引起大量元素的移动。(F)
解析:
出队对队首指针进行操作就行
1-20
n个元素进队的顺序和出队的顺序总是一致的。(T)
解析:
队列先进先出,栈后进先出
1-21
环形队列中有多少个元素可以根据队首指针和队尾指针的值来计算 (T)
解析:
队尾指针减队首指针就是元素个数
1-22
若采用“队首指针和队尾指针的值相等”作为环形队列为空的标志,则在设置一个空队时只需将队首指针和队尾指针赋同一个值,不管什么值都可以。(T)
选择题
2-6
给定一个堆栈的入栈序列为{ 1, 2, ⋯, n },出栈序列为{ p1 , p2, ⋯, pn }。如果p1 =n,则pi = ©
A.i
B.n - i
C.n - i + 1
D.不确定
解析:
2-8
令P代表入栈,O代表出栈。则将一个字符串3*a+b/c变为3 a * b c / +的堆栈操作序列是哪个?(例如将ABC变成BCA的操作序列是PPOPOO)(D)
A.PPPOOOPPOPPOOO
B.POPOPOPPOPPOOO
C.POPPOOPPOPOOPO
D.POPPOOPPOPPOOO
解析:
画图
2-10
从栈顶指针为ST的链栈中删除一个结点且用X保存被删结点的值,则执行©
A. X= ST->data;
B. X= ST; ST = ST->next;
C. X= ST->data; ST = ST->next;
D. ST = ST->next; X= ST->data;
解析:
要存储被删的值,一定是先保存后删除
2-22
链式栈与顺序栈相比,一个比较明显的优点是(B)
A.插入操作更加方便
B.通常不会出现栈满的情况
C.不会出现栈空的情况
D.删除操作更加方便
解析:
和顺序栈相比,链栈的优势是:通常不会出现栈满的情况。因为顺序栈用数组实现,必须事先确定栈的大小,对内存的使用效率并不高,无法避免因数组空间用光而引起的溢出问题;而链栈因为动态申请内存,一般不会出现栈满情况。
2-25
若已知一个栈的进栈序列是1,2,3,…,n,其输出序列为p1,p2,p3,…,pn,若p1 = 3,则p2为(A)
A.可能是2
B.一定是2
C.可能是1
D.一定是1
解析:
2-28
(neuDS)在链栈中,进行出栈操作时(B)
A.需要判断栈是否满
B.需要判断栈是否为空
C.需要判断栈元素的类型
D.无需对栈作任何操作
解析:
出栈时需要先对顺序栈进行判空操作,若顺序栈为空,则返回false,出栈时,记录当前出栈的元素,再将top指针前移(top-1)。
2-29
(neuDS)在顺序栈中,若栈顶指针top指向栈顶元素的下一个存储单元,且顺序栈的最大容量是maxSize,则顺序栈的判空条件是(A)。
A.top==0
B.top==-1
C.top==maxSize
D.top==maxSize-1
解析:
栈空,就找0
栈满,就找maxSize
2-34
若让元素1,2,3,4,5依次进栈,则出栈次序不可能出现在(C)种情况。
A.5,4,3,2,1
B.2,1,5,4,3
C.4,3,1,2,5
D.2,3,5,4,1
解析:
栈是后进先出的线性表,不难发现C选项中元素1比元素2先出栈,违背了栈的后进先出原则,所以不可能出现C选项所示的情况。
如何快速判断一个数列是否是合法的出栈顺序 请看https://blog.csdn.net/kuihan8061/article/details/109638675
2-38
栈可用于(D)。
A.递归调用
B.子程序调用
C.表达式求值
D.A、B、C
解析:
这是看这些应用中是否使用了栈的后进先出性质
递归调用、函数调用、表达式求值均可以使用栈的后进先出性质
2-43
已知入栈序列为1 2 3 4 5 6 7。出栈操作可以随意进行(只要栈不为空),且栈最多可容纳3个元素。则下列合法的出栈序列是(B)
A.4 2 1 3 7 5 6
B.3 2 1 5 4 6 7
C.4 3 7 6 5 2 1
D.3 5 4 2 1 6 7
解析:
注意:栈最多可容纳3个元素
挨个选项都试一下
2-44
假设元素按照e1,e2,e3,e4,e5,e6的次序进栈,出栈序列为e2,e4,e3,e6,e5,e1,则栈的容量至少是(c)
A.6
B.4
C.3
D.2
解析:
2-48
设1、2、…、n–1、n共n个数按顺序入栈,若第一个出栈的元素是n,则第三个出栈的元素是:(B)
A.3
B.n-2
C.n-3
D.任何元素均可能
2-49
对空栈 S 进行 Push 和 Pop 操作,入栈序列为 a, b, c, d, e,经过 Push, Push, Pop, Push, Pop, Push, Push, Pop 操作后,得到的出栈序列是:(D)
A.b, a, c
B.b, a, e
C.b, c, a
D.b, c, e
解析:
2-51
若一个栈以向量V[1…n]存储,初始栈顶指针top设为n+1,则元素x进栈的正确操作是©
A.top++; V[top]=x;
B.V[top]=x; top++;
C.top–; V[top]=x;
D.V[top]=x; top–;
解析:
初始栈顶指针top为n+1,说明元素从数组向量的高端地址进栈,又因为元素存储在向量空间V[1…n]中,所以进栈时top指针先下移变为n,之后将元素x存储在V[n]。
2-52
为解决计算机主机与打印机间速度不匹配问题,通常设一个打印数据缓冲区。主机
将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是(A)
A.队列
B .栈
C.线性表
D.有序表
解析:
解决缓冲区问题应利用一种先进先出的线性表,而队列正是一种先进先出的线性表。
2-53
若已知一队列用单向链表表示,该单向链表的当前状态(含3个对象)是:1->2->3,其中x->y表示x的下一节点是y。此时,如果将对象4入队,然后队列头的对象出队,则单向链表的状态是: (B)
A.1->2->3
B.2->3->4
C.4->1->2
D.答案不唯一
解析:
队尾入列,队头出列
2-55
若用大小为6的数组来实现循环队列,且当前front和rear的值分别为0和4。当从队列中删除两个元素,再加入两个元素后,front和rear的值分别为多少?(A)
A.2和0
B.2和2
C.2和4
D.2和6
解析:
删除一个元素后,队首指针要加1,front=(front+1)%6,结果为4,每加入一个元素队尾指针加一,即rear=(rear+1)%6,加入两个元素后变为2,0
2-58
在一个不带头结点的非空链式队列中,假设f和r分别为队头和队尾指针,则插入s所指的结点运算是(B)
A.f->next=s; f=s;
B.r->next=s; r=s;
C.s->next=s; r=s;
D.s->next=f; f=s;
解析:
队尾入列,队头出列
2-59
设一数列的顺序为1,2,3,4,5,6,通过队列操作可以得到(B)的输出序列。
A.3,2,5,6,4,1
B.1,2,3,4,5,6
C.6,5,4,3,2,1
D.4,5,3,2,6,1
解析:
队列先入先出
2-63
用单链表表示的链队的队头在链表的(A)位置。
A.链头
B.链尾
C.链中
D.均可以
解析:
队头插入,队尾删除。 所以队头对应链表的表头,队尾对应链表的表尾。
2-65
(neuDS)在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的判空条件是(A)。
A.front==rear
B.front!=rear
C.front==rear+1
D.front==(rear+1)% maxSize
解析:
当队列为空时条件:rear == front
当队列满时条件为:(rear+1)% maxsize == front
2-67
(neuDS)在循环顺序队列中,假设以少用一个存储单元的方法来区分队列判满和判空的条件,front和rear分别为队首和队尾指针,它们分别指向队首元素和队尾元素的下一个存储单元,队列的最大存储容量为maxSize,则队列的长度是(C)
A.rear-front
B.rear-front+1
C.(rear-front+maxSize)%maxSize
D.(rear-front+1)%maxSize
解析:
不明白
2-69
依次在初始为空的队列中插入元素a,b,c,d以后,紧接着做了两次删除操作,此时的队头元素是(C)。
A.a
B.b
C.c
D.d
解析:
这是队列不是栈 别看错了
2-72
循环队列存储在数组A[0…m]中,其头尾指针分别为front和rear,头指针front总是指向队头元素,尾指针rear总是指向队尾元素的下一个位置,则入队时的操作为(D)。
A.rear=rear+1
B.rear=(rear+1)%(m-1)
C.rear=(rear+1)%m
D.rear=(rear+1)%(m+1)
解析:
注意数组A[0…m]共存储(m+1)个元素。
循环队列,头指针font,尾指针rear,再数组中增加一个元素,尾指针加1,想要达到循环的效果,就让rear+1对整个队列空间取余即可,将数再次放入这个队列中。
2-76
循环队列存储在数组A[0…n-1]中,其头尾指针分别为f和r,头指针f总是指向队头元素,尾指针r总是指向队尾元素的下一个位置,假设队列不空,元素出队时头尾指针的操作为(A)
A.f=(f+1)%n
B.f=f+1
C.r=(r+1)%n
D.f=(f+1)%(n-1)
解析:
首先,我们需要知道循环队列的头尾指针是怎样变化的。当有元素入队时,尾指针r向后移动一位,并将新元素存储在a[r]中;当有元素出队时,头指针f向后移动一位,并将a[f]置为无效值。
因此,元素出队时头尾指针的操作是:
1.获取队头元素a[f]的值;
2.将a[f]置为无效值;
3.头指针f向后移动一位,即f = (f + 1) % n。
其中,(f + 1) % n的含义是将指针f向后移动一位,当f达到n-1时,下一位应指向a[0]而非a[n],因此需要取模操作。
2-78
用链接方式存储的队列,在进行删除运算时( D )
A. 仅修改头指针
B. 仅修改尾指针
C. 头、尾指针都要修改
D. 头、尾指针可能都要修改
解析:
一般情况下只修改头指针,但是,当删除的是队列中最后一个元素时,队尾指针也会丢失,因此需对队尾指针重新赋值。
2-80
已知循环队列的存储空间为数组A[21],front 指向队头元案的前一一个位置,rear 指
向队尾元素,假设当前front和rear的值分别为8和3,则该队列的长度为©.
A.5
B.6
C.16
D.17
解析:
“front指向队头元素的前一个位置”“front…的值…为8…” ----- 起始是位置9;
“rear指向队尾元素”“…rear的值…为…3” ----- 终止位置3。
也就是 [9,20]并上[0,3],一共16个。
填空题
4-1
栈的运算遵循 (先进后出) 的原则
4-2
设栈S和队列Q的初始状态均为空,元素{1, 2, 3, 4, 5, 6, 7}依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是{2, 6, 5, 4, 7, 3, 1},则栈S的容量至少是:(5)
4-5
后缀式(postfix expression,也叫逆波兰式, reverse Polish notation)1 2 3 4 5 6 - + / * +的值是:(3)
解析:
根据给定的后缀表达式 “1 2 3 4 5 6 - + / * +”,我们可以使用栈来计算其值。
遍历后缀表达式的每个元素:
- 如果当前元素是数字,将其入栈。
- 如果当前元素是运算符,从栈中弹出两个数字进行运算,并将结果入栈。
根据上述算法,我们可以计算后缀表达式的值如下:
- 遍历后缀表达式的第一个元素 “1”,将其入栈。
- 遍历下一个元素 “2”,将其入栈。
- 遍历下一个元素 “3”,将其入栈。
- 遍历下一个元素 “4”,将其入栈。
- 遍历下一个元素 “5”,将其入栈。
- 遍历下一个元素 “6”,将其入栈。
- 遍历下一个元素 “-”,从栈中弹出两个数字,执行减法运算:5 - 6 = -1,将结果 “-1” 入栈。
- 遍历下一个元素 “+”,从栈中弹出两个数字,执行加法运算:4 + (-1) = 3,将结果 “3” 入栈。
- 遍历下一个元素 “/”,从栈中弹出两个数字,执行除法运算:3 / 3 = 1,将结果 “1” 入栈。
- 遍历下一个元素 “*”,从栈中弹出两个数字,执行乘法运算:2 * 1 = 2,将结果 “2” 入栈。
- 遍历下一个元素 “+”,从栈中弹出两个数字,执行加法运算:1 + 2 = 3,将结果 “3” 入栈。
最终,栈中的唯一元素 “3” 即为后缀表达式的值。
4-6
4-3
(队列)又称为先进先出的线性表。
4-4
为了解决队列的假溢出现象,应采用 (循环)队列
4-10
设栈S和队列Q的初始状态都为空,元素a,b,c,d,e,f依次通过栈S,一个元素出栈后即进入队列,若6个元素出队序列是bedfca,则栈S的容量至少应有能够存放 ( 4 ) 个元素的空间。
4-11
第四章 广义表
关于广义表的深度和长度 可以看一看 BV1MF411X7D4
关于所有本章出现的(nueDS_C++),把它去掉做题也没有影响,所以直接忽略
判断题
1-1
(nueDS_C++)如果一个串中的所有字符均在另一串中出现,则说前者是后者的子串。(F)
解析:
还和字符的顺序有关
1-2
(neuDS_C++)空串与空格串是相同的。(F)
解析:
零个字符的串称为空串,其长度为零。
1-3
串是一种特殊的线性表,其特殊性体现在数据元素是一个字符(T)
1-4
广义表是一种多层次的数据结构,其元素可以是单原子也可以是子表。(T)
选择题
2-1
广义表 ( (a, b), c, d, e) 的表头和表尾分别是(D)
A.a和e
B.a和 (c, d, e)
C.(a, b) 和e
D.(a, b) 和 (c, d, e)
解析:
该广义表的长度:4
当广义表LS非空时,称第一个元素为表头,称其他元素组成的表为表尾
广义表的深度:广义表中括弧的重数
2-2
广义表是一种()数据结构。 (B)
A.非递归的
B.递归的
C.树型
D.图状
解析:
显然,广义表的定义是一个递归的定义,因为在描述广义表时又用到了广义表的概念
2-3
一个广义表为 ( a, (b, c), d, (), ((f, g), h) ),则该广义表的长度与深度分别为()。 (D)
A.4和6
B.6和3
C.3和5
D.5和3
解析:
2-21
对广义表,通常采用的存储结构是(B)
A.数组
B.链表
C.三元组
D.Hash表
解析:
2-10
设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储,a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为(B)
A.13
B.33
C.18
D.40
解析:
对称矩阵转为数组存储,第i行第j列元素位于 i(i-1)/2+j,注意第一元素下标
关于矩阵的压缩存储,对称矩阵,三对角,上下三角矩阵 BV1QV4y1s7Nn
2-11
(neuDS)有一个二维数组A[6][8] ,每个数组元素用相邻的6个字节存储,存储器按字节编址,那么这个数组占用的存储空间大小是( )个字节。()
A.48
B.96
C.252
D.288
解析:
6 * 8 * 6 = 288
2-12
(neuDS_C++)二维数组A中,每个元素的长度为3个字节,行下标i从0到7,列下标j从0到9,从首地址SA开始连续存放在存储器内,存放该数组至少需要的字节数是©。
A.80
B.100
C.240
D.270
解析:
( 7 + 1 ) * ( 9 + 1 ) * 3 = 240
2-13
(neuDS_C++)二维数组A中,每个元素A的长度为3个字节,行下标i从0到7,列下标j从0到9,从首地址SA开始连续存放在存储器内,该数组按行存放时,数组元素A[7][4]的起始地址为( )。
A.SA+141
B.SA+144
C.SA+222
D.SA+225
解析:
(7 * 10 + 4 ) * 3 = 222
2-18
一个稀疏矩阵采用压缩后,和直接采用二维数组存储相比会失去_____特性。(B)
A.顺序存储
B.随机存取
C.输入输出
D.以上都不对
解析:
稀疏矩阵在采用压缩存储后将会失去随机存储的功能。因为在这种矩阵中,非零元素的分布是没有规律的,为了压缩存储,就将每一个非零元素的值和它所在的行、列号做为一个结点存放在一起,这样的结点组成的线性表中叫三元组表,它已不是简单的向量,所以无法用下标直接存取矩阵中的元素。
2-19
设某二维数组a[10][20]采用顺序存储方式,每个数组元素占用1个存储单元,a[0][0]的存储地址为200,a[6][2]的存储地址是322,则该数组 (B) 。
A.只能按列优先存储
B.只能按行优先存储
C.按行优先存储或按列优先存储均可
D.以上都不对
解析:
关于按行存储和按列存储可以看 BV1Fv4y1R73s
- 每个元素占用1个存储单元,即每个元素的存储地址相差1。
- a[6][2]的存储地址比a[0][0]的存储地址大122(322 - 200 = 122)。
- a[6][2]是a[0][0]向下移动6行,向右移动2列得到的。
根据这些结论,我们可以推断出该二维数组是按行优先存储的。也就是说,数组中相邻的元素在内存中的存储地址也是相邻的。因此,正确答案是B. 只能按行优先存储。
2-20
设某二维数组a[10][20]采用顺序存储方式,每个数组元素占用1个存储单元,a[0][0]的存储地址为200,a[6][2]的存储地址是226,则该数组 (A) 。
A.只能按列优先存储
B.只能按行优先存储
C.按行优先存储或按列优先存储均可
D.以上都不对
解析:
关于按行存储和按列存储可以看 BV1Fv4y1R73s
LOC(i,j) = LOC(0,0) + (i*n + j) * L
2-22
假设以行序为主序存储二维数组A=array[1…100,1…100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=(B)
A.808
B.818
C.1010
D.1020
解析:
因为下标从1开始,所以行列都要 -1
( 5 - 1 ) * 100 + ( 5 - 1 ) = 404
注意别忘了加上基地址,要不然就错啦
404 * 2 + 10 = 818
2-23
设有数组A[i,j],数组的每个元素长度为3字节, i的值为1到 8,j的值为1到10 ,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为( B)
A.BA+141
B.BA+180
C.BA+222
D.BA+225
解析:
以列序为主,则 LOC [5,8] = [( 8 - 1) * 8 + ( 5 - 1) ] * 3 + BA = BA + 180
因为下标从1开始,所以行和列都要-1
2-24
解析:
关于上下三角矩阵 可以看 BV1QV4y1s7Nn
2-25
二维数组A的每个元素是由10个字符组成的串,其行下标 i=0~8, 列下标 j=1~10。若A按行先存储,元素A[8,5]的起始地址与当A按列先存储时的元素( )的起始地址相同。设每个字符占一个字节。(B)
A.A[8,5]
B.A[3,10]
C. A[5,8]
D.A[0,9]
解析:
设数组从内存首地址M开始顺序存放,
若数组按行先存储, 元素 A[8,5]的起始地址为:M+[(8-0) *10+( 5-1)]*1=M+84;
若数组按列先存储,元素 A[3,10]的起始地址为:M+[ (10-1)*9+(3-0)]*1=M+84。
2-26
数组A[0…4,-1…-3,5…7]中含有元素的个数(B)。
A.55
B.45
C.36
D.16
解析:
数组 A[0…4, -1…-3, 5…7] 中含有的元素个数可以通过计算每个维度的长度相乘得到。每个维度的长度可以通过上限减去下限再加 1 来计算。
对于第一个维度,长度为 4 - 0 + 1 = 5。
对于第二个维度,长度为 -3 - (-1) + 1 = 3。
对于第三个维度,长度为 7 - 5 + 1 = 3。
因此,数组 A[0…4, -1…-3, 5…7] 中含有的元素个数为 5 * 3 * 3 = 45。
2-30
设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到8 ,j的值为1 到10,数组从内存首地址BA开始顺序存放,当用以行为主存放时,元素A[5,8]的存储首地址为()
A.BA+141
B.BA+180
C.BA+222
D.BA+225
解析:
2-31
对特殊矩阵采用压缩存储的主要目的是(D)。
A.表达变得简单
B.对矩阵元素的存取变得简单
C.去掉矩阵中的多余元素
D.减少不必要的存储空间
解析:
在特殊矩阵中,有很多值相同的元素并且他们的分布有规律,没有必要为值相同的元素重复存储。
2-32
对n阶对称矩阵压缩存储时,需要表长为( )的顺序表。(C)
A.n/2
B.n×n/2
C.n(n+1)/2
D.n(n-1)/2
解析:
就是对1到n等差数列求和
2-33
有一个n×n的对称矩阵A,将其下三角部分按行存放在一维数组B中,而A[0][0]存放于B[0]中,则第i行的对角元素A[i][i]存放于B中的( )处。(A)
A.(i+3)i/2
B.(i+1)i/2
C.(2n-i+1)i/2
D.(2n-i-1)i/2
解析:
最好的方法就是代数
A[0][0]存放于B[0]中,所以A[1][1]存放于B[2]中,带入i = 1 ,只有A结果是2
2-34
设矩阵A是一个对称矩阵,为了节省存储空间,将其下三角部分按照行优先存放在一维数组B[0…n(n+1)/2-1]中,对于下三角部分的任一元素a_{i,j} (i>=j,i和j从0开始取值),在一维数组B中的下标k的值是(B)
A.i(i-1)/2+j-1
B.i(i+1)/2+j
C.i(i+1)/2+j-1
D.i(i-1)/2+j
解析:
最好的方法还是代数
A[0][0]存放于B[0]中,所以A[1][1]存放于B[2]中,带入i = 1 ,j = 1,只有B结果是2
2-6
(neuDS_C++)串是一种特殊的线性表,其特殊性体现在(B)。
A.可以顺序存储
B.数据元素是一个字符
C.可以链接存储
D.数据元素可以是多个字符
解析:
串又称为字符串,是一种特殊的线性表,其特殊性体现在数据元素是一个字符,也就是说串是一种内容受限的线性表。(栈和队列是操作受限的线性表)
2-7
(neuDS)串的长度是指(A)
A.串中包含的字符个数
B.串中包含的不同字符个数
C.串中除空格以外的字符个数
D.串中包含的不同字母个数
解析:
B不对,空格也会被算入到串长当中去;
C不对,不是指字母的种类数;
D不对,不是指字符的种类数。
C、D都忽视了即使种类数相同的字母/字符也会被多次记录到串长中。
2-8
(neuDS)设有两个串p和q,其中q是p的子串,求q在p中首次出现的位置的算法称为(C)
A.求子串
B.联接
C.模式匹配
D.求串长
解析:
KMP算法是模式匹配的一种
2-9
(neuDS)串也是一种线性表,只不过(A)。
A.数据元素均为字符
B.数据元素是子串
C.数据元素数据类型不受限制
D.表长受到限制
2-16
串下面关于串的的叙述中,(B)是不正确的。
A.串是字符的有限序列
B.空串是由空格构成的串
C.模式匹配是串的一种重要运算
D .串既可以采用顺序存储,也可以采用链式存储
解析:
零个字符的串称为空串,其长度为零。
空格是串的字符集合中的一个元素。
2-36
若串S=“software”,则其子串数目是____,其中空串和S串本身这两个字符串也算作S的字串。(B)
A.8
B.37
C.36
D.9
解析:
字符串“software”有8个字符,可是设置间隔的位置有9个,使用C(9,2)=36即可求得字符串“software”的所有子串。因为题目标明空串也是子串,故还需要加上1,总共37个子串。所以答案选B。
software的子串可以为1个字母到8个字母不等,但字母顺序不变,则子串数量为8+7+6+5+4+3+2+1=36.再加上自己本身37。所以答案选B。
字串: n(n+1)/2 + 1
非空子串:n(n+1)/2
非空真子串:n(n+1)/2 - 1
填空题
4-1
设目标串text=“abccdcdccbaa”,模式串pattern=“cdcc”,若采用BF(Brute Force)算法,则在第(6)趟匹配成功。
4-2
若n为主串长度,m为模式串长度,采用BF(Brute Force)模式匹配算法,在最好情况下需要的字符比较次数为(m)
解析:
如果比较次数是n还匹配个毛线
4-3
字符串I LOVE GUANGZHOU!的长度是(17)
解析:
空格也算哦
4-3
设二维数组a[10][20],每个数组元素占用1个存储单元,若按列优先顺序存放数组元素,a[0][0]的存储地址为200,则a[6][2]的存储地址是多少?(226)
解析:
按列存储:200 + (2 * 10 + 6 )
4-5
数组A中,每个元素的长度为3个字节,行下标i从1到8,列下标j从1到10,从首地址SA开始连续存放的存储器内,该数组按行存放,元素A[8][5]的起始地址为(222+SA)
解析:
按行存储:SA + [ ( 8 - 1 ) * 10 + ( 5 - 1) ] * 3 = 222+SA
因为下标从1开始,所以要-1
注意注意注意这里一定要222在前,SA在后,没有空格
4-6
广义表 (1,(2,3,(4,(5)),6),((7),8,9)) 的长度为
第五章 二叉树
判断题
1-15
某二叉树的前序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无左孩子。 (T)
解析:
二叉树的前序是先根再左再右,中序是先左再根再右;若相同,则没有左;
根左右(先序), 左根右(中序),左右根(后序)
1-17
某二叉树的后序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无右孩子。(T)
解析:
左右根(后序),左根右(中序),若相同,则没有右;
1-18
某二叉树的前序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无右孩子。(F)
解析:
根左右(前序),左根右(中序),若相同,则没有左;
1-19
某二叉树的后序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无左孩子。(F)
解析:
左右根(后序),左根右(中序),若相同,则没有右;
1-20
若A和B都是一棵二叉树的叶子结点,则存在这样的二叉树,其前序遍历序列为…A…B…,而中序遍历序列为…B…A…。(F)
解析:
因为都是叶子节点,所以A肯定在B的左面,根左右(前序),左根右(中序),左根肯定在右根的左面,所以遍历的时候顺序不会改变
1-21
若一个结点是某二叉树的中序遍历序列的最后一个结点,则它必是该树的前序遍历序列中的最后一个结点。(F)
解析:
中序遍历序列的最后一个结点可能是根或右子树,而前序遍历的最后一个结点可能是左子树和根;
举反例:
前序遍历:1 2 3 4
中序遍历:2 1 4 3
1-22
将一棵完全二叉树存于数组中(根结点的下标为 1)。则下标为 23 和 24 的两个结点是兄弟。(F)
解析:
首先,找到节点23的父节点:
23除以2得到11.5,向下取整得到11,所以节点23的父节点是节点11。
然后,找到节点24的父节点:
24除以2得到12,所以节点24的父节点是节点12。
由于节点23的父节点是节点11,而节点24的父节点是节点12,它们的父节点不同,因此节点23和节点24不是兄弟节点。
下面是一个简化的图示,展示了节点23和节点24在完全二叉树中的位置,以及它们的父节点:
1-26
树的后根序遍历序列等同于它所对应二叉树的中序遍历序列。(T)
解析:
1-27
二叉树可以用二叉链表存储,树无法用二叉链表存储。(F)
解析:
二叉树与树都可以用二叉链表作为存储结构,二者的关系是一棵树可以唯一对应一棵二叉树。
1-28
将一棵树转成二叉树,根结点没有左子树。(F)
解析:
左孩子右兄弟,应该是没有右兄弟,是没有右子树。
关于树、森林、二叉树的转换可以看一下这篇视频 BV1Sq4y1M7cs
1-4
一棵有124个结点的完全二叉树,其叶结点个数是确定的。(T)
解析:
若设二叉树的深度为h 除第 h 层外 其它各层 1~(h-1) 的结点数都达到最大个数(即1~(h-1)层为一个满二叉树) 第 h 层所有的结点都连续集中在最左边 就是完全二叉树
124 = 1 + 2 + 4 + 8 + 16 + 32 + 61
1-5
对于一个有N个结点、K条边的森林,不能确定它共有几棵树。(F)
解析:
由一颗树的性质:结点等于边+1【n= k+ 1】。
等价于 n - k =1。
故共有 n - k 棵树。
1-6
对N(≥2)个权值均不相同的字符构造哈夫曼树,则树中任一非叶结点的权值一定不小于下一层任一结点的权值。(F)
解析:
从图中可以看出,树中任一非叶节点的权值(A + B + C)不小于下一层任一节点的权值(C)(A+B)。这符合我们的结论。
1-7
存在一棵总共有2016个结点的二叉树,其中有16个结点只有一个孩子。(F)
解析:
假设没有孩子的结点(叶结点)个数为n₀,只有一个孩子的结点(度为1的结点)个数为n₁,有两个孩子的结点(度为2的结点)个数为n₂。
则n₀+n₁+n₂=2016 ∵n₀=n₂+1(二叉树的性质:叶结点个数等于度为2的结点个数加1) ∴n₀+n₁+n₂=2016
⇨n₂+1+16+n₂=2016 ⇨2n₂=1999 n₂除不尽,所以答案错误。
公式在课本P118;
1-8
二叉树通常有顺序存储结构和链式存储结构。(T)
解析:
1-9
设只包含根结点的二叉树高度为 0,则高度为 k 的二叉树最小结点数为 k+1(T)
解析:
1-10
二叉树是度为 2 的树。(F)
解析:
二叉树不是树;
1-11
具有10个叶结点的二叉树中,有9个度为2的结点(T)
解析:
n0=n2+1(二叉树的性质:叶结点个数等于度为2的结点个数加1),则n2=9
1-12
在含有n个结点的树中,边数只能是n-1条。 ( T )
解析:
树中 边数+1=结点数
1-25
完全二叉树中,若一个结点没有左孩子,则它必是树叶。(T)
解析:
"树叶"指的是没有子节点的节点,也被称为叶节点或叶子节点。
当二叉树结点数大于1时,根据完全二叉树特点(度为1的结点只有一个,而该结点只有左孩子没有右孩子),所以当一个结点没有左孩子时,它一定是树叶(第三行最后一个)
1-14
在任意一棵二叉树中,分支结点的数目一定少于叶结点的数目。(F)
解析:
只有一个结点 不满足
选择题
2-2
设树T的度为4,其中度为1、2、3、4的结点个数分别为4、2、1、1。则T中有多少个叶子结点?(C)
A.4
B.6
C.8
D.10
解析:
分支方程:一棵含有n个结点的树,有n-1个分支,
即 n = 1 * 4 + 2 * 2 + 3 * 1 + 4 * 1 + 1 = 16;
节点方程: n = n0 + n1 + n2 + n3 + n4 = n0 + 4 + 2 + 1 + 1;
联立解方程的 n0 = 8 , 所有叶子结点个数为8
2-6
给定二叉树如下图所示。设N代表二叉树的根,L代表根结点的左子树,R代表根结点的右子树。若遍历后的结点序列为3、1、7、5、6、2、4,则其遍历方式是:(B)
A.NRL
B.RNL
C.LRN
D.RLN
解析:
直接找到第一棵树312 遍历右根左
2-7
下列线索二叉树中(用虚线表示线索),符合后序线索树定义的是:(B)
A.
B.
C.
D.
解析:
请看视频 BV15o4y127Kq 讲的很明白
2-11
对N(N≥2)个权值均不相同的字符构造哈夫曼树。下列关于该哈夫曼树的叙述中,错误的是: (D)
A.树中一定没有度为1的结点
B.树中两个权值最小的结点一定是兄弟结点
C.树中任一非叶结点的权值一定不小于下一层任一结点的权值
D.该树一定是一棵完全二叉树
解析:
A对,哈夫曼树中只有度为2的结点和度为0的叶子结点
B哈夫曼树的构造是从底到上,从小到大,所以最小权的两个点一定用于底部,是兄弟结点
C根据哈夫曼树的定义,一棵树要使其WPL值最小,必须使权值最大的叶子结点越靠近根节点,而权值越小的叶子结点越远离根节点。
D哈夫曼树不一定是完全二叉树
2-12
设一段文本中包含字符{a, b, c, d, e},其出现频率相应为{3, 2, 5, 1, 1}。则经过哈夫曼编码后,文本所占字节数为: (C)
A.40
B.36
C.25
D.12
解析:
2-13
由分别带权为9、2、5、7的四个叶子结点构成一棵哈夫曼树,该树的带权路径长度为:
A.23
B.37
C.44
D.46
解析:
2-14
有一个四叉树,度2的结点数为2,度3的结点数为3,度4的结点数为4。问该树的叶结点个数是多少?(D)
A.10
B.12
C.20
D.21
解析:
一棵含有n个结点的树,有n-1个分支,
分支方程: n - 1 = 2 * 2 + 3 * 3 + 4 * 4 + 4 所以 n = 30
节点方程: n = n0 + n1 + n2 + n3 + n4 = n0 + 2 + 3 + 4 所以 n0 = 21
2-15
若一棵二叉树的前序遍历序列是{ 4, 2, 1, 3, 6, 5, 7 },中序遍历序列是{ 1, 2, 3, 4, 5, 6, 7 },则下列哪句是错的?(C)
A.这是一棵完全二叉树
B.所有的奇数都在叶子结点上
C.6是3的父结点
D.这是一棵二叉搜索树
解析:
6 不是 3 的父节点,而是 3 的右子节点
关于已知先/后序遍历与中序遍历,求后/先序遍历(超级简单) BV1Xu411d7qf
2-16
若一棵二叉树的后序遍历序列是{ 1, 3, 2, 6, 5, 7, 4 },中序遍历序列是{ 1, 2, 3, 4, 5, 6, 7 },则下列哪句是错的?(A)
A.这是一棵完全二叉树
B.2是1和3的父结点
C.这是一棵二叉搜索树
D.7是5的父结点
解析:
这个可以依然沿用上面的方法,只不过需要把后序反过来写
A. 这是一棵完全二叉树 - 错误。根据重建的二叉树结构,不是每个节点都有两个孩子,因此这不是一棵完全二叉树。
B. 2是1和3的父结点 - 正确。根据重建的二叉树,2是1和3的父节点。
C. 这是一棵二叉搜索树 - 正确。中序遍历的结果是有序的,这是二叉搜索树的一个特征。
D. 7是5的父结点 -正确。由图可得
2-18
已知一棵二叉树的树形如下图所示,其后序序列为{ e, a, c, b, d, g, f }。树中与结点a同层的结点是:(B)
A.c
B.d
C.f
D.g
解析:
关于简单遍历二叉树 学不会举报我! BV1Ub4y147Zv
2-20
在一棵度为 3 的树中,度为 2 的结点个数是 1,度为 0 的结点个数是 6,则度为 3 的结点个数是 (A)
A.2
B.3
C.4
D.不确定
解析:
看好哪个是节点个数!看好哪个是节点个数!!看好哪个是节点个数!!!
设总节点数为n,单分支节点数为x,叶子节点数为y,有:
一棵含有n个结点的树,有n-1个分支,
分支方程: n − 1 = 3 ∗ 2 + 2 ∗ 1 + 1 ∗ x
节点方程: n = 2 + 1 + x + y
解得 : y = 6
2-24
在一棵度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶结点个数是:(B)
A.41
B.82
C.113
D.122
解析:
看好哪个是节点个数!看好哪个是节点个数!!看好哪个是节点个数!!!
一棵含有n个结点的树,有n-1个分支,
分支方程: n − 1 = 20 ∗ 4 + 10 ∗ 3 + 1 ∗ 2 + 10 * 1
节点方程: n = 20 + 10 + 10 + 1 + n0
解得: n0 = 82
2-25
有一个四叉树,度2的结点数为4,度3的结点数为2,度4的结点数为1。问该树的叶结点个数是多少?(B)
A.8
B.12
C.18
D.20
解析:
做法跟2-20一样 不多bb
2-26
三叉树中,度为1的结点有5个,度为2的结点3个,度为3的结点2个,问该树含有几个叶结点?
A.8
B.10
C.12
D.13
解析:
做法跟2-20一样 就是少设一个未知数 不多bb
2-34
具有1102个结点的完全二叉树一定有__个叶子结点。(B)
A.79
B.551
C.1063
D.不确定
解析:
根据完全二叉树的定义我们可以知道度为1的节点最多有1个,可以没有。
于是我们假设度为0的节点数为n0,度为1的节点数为n1,度为2的节点数为n2.
一棵含有n个结点的树,有n-1个分支,
分支方程:1102 - 1 = 2 * n2 + n1
节点方程:n2 + n1 + n0 = 1102
因此n1=1,并且n2 = 550,n0=551
2-38
如果二叉树的后序遍历结果是FDEBGCA,中序遍历结果是FDBEACG,那么该二叉树的前序遍历结果是什么?
A.ABCDEFG
B.ABDFEGC
C.ABDFECG
D.ABDEFCG
解析:
配合使用 BV1Xu411d7qf 和 BV1eT4y1N7tV 的技巧
2-39
任何一棵二叉树的叶结点在先序、中序和后序遍历序列中的相对次序(B)
A.发生改变
B.不发生改变
C.不能确定
D.以上都不对
解析:
前序:根左右。中序:左根右。后续:左右根。左叶子永远都在右叶子的左边,相对位置没有发生改变。
2-40
按照二叉树的定义,具有3个结点的二叉树有几种?()
A.3
B.4
C.5
D.6
解析:
2-41
二叉树中第5层(根的层号为1)上的结点个数最多为:©
A. 8
B. 15
C. 16
D. 32
解析:
第n层上的节点个数可以通过2^(n-1)来计算。
所以,第5层上的节点个数最多为2^(5-1) = 16
2-45
设 T 是非空二叉树,若 T 的先序遍历和中序遍历序列相同,则 T 的形态是 (D)
A.只有一个根结点
B.没有度为 1 的结点
C.所有结点只有左孩子
D.所有结点只有右孩子
解析:
先序:根左右 ;中序:左根右
去掉"左孩子"先序才能和中序一样
2-46
设 T 是非空二叉树,若 T 的先序遍历和后序遍历序列相同,则 T 的形态是 (D)
A.只有一个根结点
B.没有度为 1 的结点
C.所有结点只有左孩子
D.所有结点只有右孩子
解析:
先序:根左右 ;后序:左右根
去掉"根"先序才能和后序一样,但是不能去掉根,只能去掉"左右孩子"
2-47
设 T 是非空二叉树,若 T 的后序遍历和中序遍历序列相同,则 T 的形态是 (C)
A.只有一个根结点
B.没有度为 1 的结点
C.所有结点只有左孩子
D.所有结点只有右孩子
解析:
后序:左右根 ;中序:左根右
去掉"右孩子"后序才能和中序一样
2-48
以二叉链表作为二叉树的存储结构,在具有 n 个结点的二叉链表中(n>0),空链域的个数为 (A)
A.n+1
B.n
C.n−1
D.无法确定
解析:
当使用二叉链表作为二叉树的存储结构时,每个节点都有两个指针,一个指向左子节点,一个指向右子节点。如果一个节点没有左子节点或右子节点,那么对应的指针将为空。
对于一棵具有 n 个节点的二叉树,每个节点都有两个指针,除了根节点外,每个节点的左子节点和右子节点各占用一个指针。因此,除了根节点的两个指针外,还有 n-1 个节点的指针为空。
此外,根节点的两个指针都被占用,所以还需要额外加1。因此,空链域的个数为 n+1。
所以,空链域的个数为 n+1。选项 A 正确地表示了空链域的个数。
2-52
如果二叉树的前序遍历结果是12345,后序遍历结果是32541,那么该二叉树的中序遍历结果是什么?(D)
A.23145
B.23154
C.24135
D.无法确定
解析:
就像 BV1Xu411d7qf 标题所写 “已知先/后序遍历与中序遍历,求后/先序遍历”
不能已知先序和后序求中序
2-54
一棵二叉树中,双分支结点数为15,单分支结点数为30,则叶子结点数为(B)
A.15
B.16
C.17
D.47
解析:
一棵含有n个结点的树,有n-1个分支,
分支方程:n - 1 = 2 * 15 + 30
节点方程:n = 15 + 30 + n0
解得n0 = 16
2-57
已知一棵完全二叉树的第 6 层(设根为第 1 层)有 8 个叶结点,则完全二叉树的
结点个数最多是 ©
A.39
B.52
C.111
D.119
解析:
这题有点脑筋急转弯,有两种情况,因为求最多,所以第一种情况不考虑
1.这棵树最大层次是6.前五层为满二叉树,第六层剩余8个叶子节点。sum=31+8=39
2.这棵树最大层次为7,前六层为满二叉树,第六层里有8个节点没有子树,
这时候 前6层节点数为32+16+…+1 =63
第7层节点数:(32-8)*2=48 ——第6层节点数共32个,减去8个叶节点数,每个再带有两个子节点,相加sum=63+48=111.
2-58
在一个用数组表示的完全二叉树中,如果根结点下标为1,那么下标为17和19这两个结点的最近公共祖先结点在哪里(数组下标)? (B)
(注:两个结点的“公共祖先结点”是指同时都是这两个结点祖先的结点)
解析:
17的父结点下标是17/2 = 8, 19的父结点下标是9,因为他们父结点不同,继续求父结点的父结点得到4
2-59
具有65个结点的完全二叉树其深度为(根的深度为1):
A.8
B.7
C.6
D.5
解析:
假设深度为d,则该完全二叉树的节点数应为2^d - 1。根据题目中给出的节点数为65,我们可以得到以下等式:
2^d - 1 = 65
d肯定大于6,证明前六层就是满二叉树,多出来的就是叶子节点在第七层
2-60
已知一棵完全二叉树的第9层(设根为第1层)有100个叶结点,则该完全二叉树的结点个数最多是:(B)
A.311
B.823
C.1847
D.无法确定
解析;
跟2-57一个套路 公式 2^9 - 1 + (2^8 - 100) * 2 = 823
2-63
设n、m为一棵二叉树上的两个结点,在中序遍历时,n在m前的条件是(A)
A.n在m左方
B.n在m右方
C.n是m祖先
D.n是m子孙
解析:
中序遍历:左根右 n是左根 m是右根 才能保证n在m前
2-64
设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中最少结点数和最多结点数分别为(B)
解析:
结点最少的情况为:除根结点层只有一个结点外,其他h-1层均有两个结点,结点总数为2(h-1)+1=2h-1。
节点最多就是满二叉树
2-35
若将一棵树 T 转化为对应的二叉树 BT,则下列对 BT 的遍历中,其遍历序列与 T 的后根遍历序列相同的是:(B)
A.先序遍历
B.中序遍历
C.后序遍历
D.按层遍历
解析:
2-36
某二叉树的中序序列和后序序列正好相反,则该二叉树一定是(C)
A.空或只有一个结点
B.高度等于其结点数
C.任一结点无左孩子
D.任一结点无右孩子
解析:
中序反过来:右根左 后序:左右根
相同则无左孩子
2-37
在下述结论中,正确的是:(A)
①只有一个结点的二叉树的度为0;
②二叉树的度为2;
③二叉树的左右子树可任意交换;
④深度为K的完全二叉树的结点个数小于或等于深度相同的满二叉树。
A.①④
B.②④
C.①②③
D.②③④
解析:
二叉树只是最大度数为2的树。
二叉树是有序树,所以不能左右子树互换。
2-43
下面的函数PreOrderPrintLeaves(BinTree BT)按前序遍历的顺序打印出二叉树BT的所有叶子结点。则下列哪条表达式应被填在空中?(D)
void PreOrderPrintLeaves( BinTree BT )
{ if (BT) {
if (___________________) printf(" %d", BT->Data);
PreOrderPrintLeaves( BT->Left );
PreOrderPrintLeaves( BT->Right );
}
}
A.BT->Data != 0
B.!BT->Right
C.!BT->Left
D.!(BT->Left || BT->Right)
解析:
答案是D. !(BT->Left || BT->Right)。
因为它表示当前节点既没有左子树也没有右子树,即当前节点是叶子节点。只有在当前节点既没有左子树也没有右子树时,我们才打印出该节点的数据。这样我们就可以按前序遍历的顺序打印出所有叶子节点。
2-44
已知一棵二叉树的先序遍历结果是ABC,则以下哪个序列是不可能的中序遍历结果:(D)
A.ABC
B.BAC
C.CBA
D.CAB
解析:
用之前的方法把二叉树写出来,然后再读一遍先序,发现D的先序是ACB
填空题
4-9
一棵二叉树的前序遍历序列是ABDFECGHK,中序遍历序列是DBEFAGHCK,则它的后序遍历序列是 (DEFBHGKCA)
解析:
4-10
一棵二叉树的后序遍历序列是DEFBHGKCA,中序遍历序列是DBEFAGHCK,则它的前序遍历序列是(ABDFECGHK)
解析:
4-11
如果一棵二叉树有20个度为2的结点,则它的叶结点数量为:(21)个。
解析:
n = n0 + n1 + n2
n - 1 = n1 + 2 * n2
n2 = 20
解得 n0 = 21
4-12
若以{4,5,6,7,8}作为叶子结点的权值构造哈夫曼树,则其带权路径长度是(69)
解析:
4-1
已知二叉树的先序遍历序列为DAGICJBFHE,中序遍历序列为GACIDFBHJE
则后序遍历序列为(GCIAFHBEJD)
解析:
4-3
在含有n个结点的树中,边数只能是(n-1)
4-4
在一棵度为4的树T中,10个度为1的结点,1个度为2的结点,10个度为3的结点,20个度为4的结点,则树T的叶结点个数是:(82)
解析:
4-5
如果二叉树的后序遍历结果是FDEBGCA,中序遍历结果是FDBEACG,那么该二叉树的前序遍历结果是:(ABDFECG)
解析:
4-6
已知一棵完全二叉树的第5层(设根为第1层)有8个叶结点,则该完全二叉树的结点个数最多是:(47)
解析:
这棵树最大层次为6,前5层为满二叉树,第5层里有8个节点没有子树,
这时候 前5层节点数为16+…+1 =31
第6层节点数:(16-8)*2=16 ——第5层节点数共16个,减去8个叶节点数,每个再带有两个子节点,相加sum = 16 + 31 = 47
4-7
一棵二叉树的先序序列: abdfcegh,中序序列:bfdagehc。后序遍历序列为(fdbgheca)
解析:
4-8
假设二叉树的存储结构为二叉链表,在具有n个结点的二叉链表中(n>0),左孩子指针域和右孩子指针域的个数为(2n),空指针域的个数为(n+1)
第六章 图
判断题
1-1
无向连通图所有顶点的度之和为偶数。(T)
解析:
无向连通图的特性。
Ⅰ.每条边都连接了两个结点,则在计算顶点的度之时,这条边都被计算了两次,故所有顶点的度之和为边数的两倍,显然必为偶数。
Ⅱ.边数大于等于顶点个数减1,如果定点数为3,则边数为2,边数=定点个数减1;
Ⅲ.在顶点数n≥3的完全有向图中,没有度为1的节点,并且边数与顶点数的差要大于等于0。
1-2
用邻接表法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关。(F)
1-3
在一个有向图中,所有顶点的入度与出度之和等于所有边之和的2倍。(T)
解析:
1-4
如果无向图G必须进行两次广度优先搜索才能访问其所有顶点,则G中一定有回路。(F)
解析:
1-5
若图G为连通图且不存在拓扑排序序列,则图G必有环。(T)
解析:
关于什么是拓扑排序 BV1HL411E7TE
有向无环图(拓扑图) 一定存在一个拓扑序列,
有环图,一定不存在拓扑序列
有拓扑排序就一定是无环的,有环就一定没有拓扑排序。因此可以通过拓扑排序来判断一个有向图是否有环。
1-6
用邻接矩阵法存储图,占用的存储空间数只与图中结点个数有关,而与边数无关。(T)
解析:
设结点数为n,边数m,空间复杂度O(n+m)。如图,节点个数为V0~V5,边数用箭头表示,故只要两个节点之间有边相连,就会分配存储空间
1-7
在任一有向图中,所有顶点的入度之和等于所有顶点的出度之和。(T)
解析:
1-8
如果无向图G必须进行两次广度优先搜索才能访问其所有顶点,则G一定有2个连通分量。(T)
解析:
1-11
Prim 算法是维护一个森林,每一步把两棵树合并成一棵。(F)
解析:
是Kruskal算法
关于Kruskal算法和Prim算法 BV16J411b7ar 43min
1-12
Kruskal 算法是通过每步添加一条边及其相连的顶点到一棵树,从而逐步生成最小生成树。
解析:
是Prim算法
1-13
无向连通图边数一定大于顶点个数减1(F)
解析:
三个顶点,两条边
1-14
无向连通图至少有一个顶点的度为1。(F)
解析:
无向连通图:每条边连接两个顶点。特殊的无向连通图模型:
1-17
若图G有环,则G不存在拓扑排序序列。(T)
解析:
有向无环图(拓扑图) 一定存在一个拓扑序列,
有环图,一定不存在拓扑序列
有拓扑排序就一定是无环的,有环就一定没有拓扑排序。因此可以通过拓扑排序来判断一个有向图是否有环。
1-18
如果 e 是有权无向图 G 唯一的一条最短边,那么边 e 一定会在该图的最小生成树上(T)
解析:
在有权无向图中,最小生成树(Minimum Spanning Tree,MST)是一个无环的子图,它包括图中的所有顶点,并且边的权重之和尽可能小。构造最小生成树的常用算法有Kruskal算法和Prim算法。
如果边 e 是有权无向图 G 中唯一的一条最短边,那么边 e 必然会出现在图的任何最小生成树中。原因如下:
-
Kruskal算法:该算法从权重最小的边开始,逐步添加边到生成树中,但只有在添加这条边不会形成环路时才添加。因为 e 是最短边,所以它会是Kruskal算法考虑的第一条边。由于这时生成树为空,添加 e 不会形成环路,因此 e 会被加入到最小生成树中。
-
Prim算法:该算法从任意一个顶点开始,逐步添加连接已选顶点和未选顶点的最小权重边,直到所有顶点都被包含在内。在算法的任何步骤中,如果边 e 连接了一个已选顶点和一个未选顶点,由于它是权重最小的边,因此它会被选为添加到生成树的边。
在两种算法中,边 e 都将是构成最小生成树的第一条边或者在某一步骤中是连接已选顶点和未选顶点的最小权重边,因此 e 必然会在最小生成树中。
1-17
AOE图的权值最大的边(活动)一定是关键活动。(F)
解析:
即使某个活动的持续时间是所有活动中最长的,如果它不在关键路径上,那么它就不是关键活动。
反之,即使某个活动的持续时间不是最长的,但如果它位于关键路径上,它就是关键活动。
1-18
在关键路径上的活动都是关键活动,而关键活动也必在关键路径上。(T)
1-19
关键路径是AOE网中从源点到汇点的最短路径。(F)
解析:
在AOE网络中,从源点到汇点具有最大长度的路径称为关键路径。
1-20
在AOE网络中,从源点到汇点具有最大长度的路径称为关键路径。完成AOE所表示的整个工程所需要的时间取决于关键路径的路径长度(T)
1-21 + 1-22
在AOE图中,关键路径上某个活动的时间缩短,整个工程的时间也就必定缩短。(F)
在AOE图中,关键路径上活动的时间延长多少,整个工程的时间也就随之延长多少。(T)
解析:
关键路径取决于最长的路径,而不是最短的
选择题
2-1
若一个有向图用邻接矩阵表示,则第i个结点的入度就是:(C)
A.第i行的元素个数
B.第i行的非零元素个数
C.第i列的非零元素个数
D.第i列的零元素个数
解析:
2-2
在任一有向图中,所有顶点的入度之和与所有顶点的出度之和的关系是:(A)
A.相等
B.大于等于
C.小于等于
D.不确定
2-3
图的深度优先遍历类似于二叉树的:(A)
A.先序遍历
B.中序遍历
C.后序遍历
D.层次遍历
解析:
2-4
给定一有向图的邻接表如下。从顶点V1出发按广度优先搜索法进行遍历,则得到的一种顶点序列为:(C)
A.V1,V2,V3,V4,V5
B.V1,V2,V3,V5,V4
C.V1,V3,V2,V4,V5
D.V1,V4,V3,V5,V2
解析:
这里的2 不是指的2号顶点,而是下标
即V1指向V3,V2,V4
2-6
我们用一个有向图来表示航空公司所有航班的航线。下列哪种算法最适合解决找给定两城市间最经济的飞行路线问题?(D)
A.深度优先搜索
B.Kruskal算法
C.拓扑排序算法
D.Dijkstra算法
解析:
A图的遍历算法;B构造最小生成树;C拓补排序
2-7
下图为一个AOV网,其可能的拓扑有序序列为:
A.ACBDEF
B.ABCEFD
C.ABCDFE
D.ABCEDF
解析:
拓扑排序只输出没有入度的点,输出后删除点,从删除A开始。B选项,DE出错;C选项,DE出错;D选项FD出错
关于拓扑排序 BV1HL411E7TE
2-10
给定有权无向图如下。关于其最小生成树,下列哪句是对的?
A.最小生成树不唯一,其总权重为23
B.最小生成树唯一,其总权重为20
C.边(B, F)一定在树中,树的总权重为23
D.边(H, G)一定在树中,树的总权重为20
解析:
2-11
解析:
C选项遍历完是 1 4 3 0 2
2-13
在一个有向图中,所有顶点的入度与出度之和等于所有边之和的多少倍?
A.1/2
B.1
C.2
D.4
2-14
下列说法不正确的是:(D)
A.图的遍历是从给定的源点出发每一个顶点仅被访问一次
B.遍历的基本算法有两种:深度遍历和广度遍历
C.图的深度遍历是一个递归过程
D.图的深度遍历不适用于有向图
2-15
在图中自a点开始进行深度优先遍历算法可能得到的结果为:(D)
A.a, b, e, c, d, f
B.a, c, f, e, b, d
C.a, e, b, c, f, d
D.a, e, d, f, c, b
解析:
为什么不选C,我觉得是因为遍历完E应该接着往下走
2-16
在图中自a点开始进行深度优先遍历算法可能得到的结果为:©
A.d,a,c,f,e,b
B.d,a,e,b,c,f
C.d,e,a,c,f,b
D.d,f,c,e,a,b
2-17
给定无向图G,从V0出发进行深度优先遍历访问的边集合为: {(V0,V1), (V0,V4), (V1,V2), (V1,V3), (V4,V5), (V5,V6)}。则下面哪条边不可能出现在G中?(C)
A.(V0,V2)
B.(V0,V6)
C.(V1,V5)
D.(V4,V6)
解析:
2-18
已知一个图的邻接矩阵如下,则从顶点V1出发按深度优先搜索法进行遍历,可能得到的一种顶点序列为:(B)
A.V1,V2,V3,V4,V5,V6
B.V1,V2,V4,V5,V6,V3
C.V1,V3,V5,V2,V4,V6
D.V1,V3,V5,V6,V2,V4
解析:
2-19
给定一有向图的邻接表如下。从顶点V1出发按深度优先搜索法进行遍历,则得到的一种顶点序列为:(C)
A.V1,V5,V4,V7,V6,V2,V3
B.V1,V2,V3,V4,V7,V6,V5
C.V1,V5,V4,V7,V6,V3,V2
D.V1,V5,V6,V4,V7,V2,V3
解析:
关于邻接链表的深度优先和广度优先遍历 BV1Df4y1w74P
2-23
如果G是一个有28条边的非连通无向图,那么该图顶点个数最少为多少?(C)
A.7
B.8
C.9
D.10
解析:
由于G是一个非连通图,在边数固定时,顶点数最少的情况是该图由两个连通分量构成,且其中之一只含一个顶点(没有边),另一个为完全无向图。设该完全无向图的顶点数为n,其边数为n(n-1)/2,即n(n-1)/2=28,得n=8。所以,这样的非连通图至少有1+8=9个顶点。
2-24
下面给出的有向图中,各个顶点的入度和出度分别是:(A)
A.入度: 0, 2, 3, 1, 2; 出度: 3, 2, 1, 1, 1
B.入度: 3, 2, 1, 1, 1; 出度: 0, 2, 3, 1, 2
C.入度: 3, 4, 4, 2, 3; 出度: 3, 4, 4, 2, 3
D.入度: 0, 1, 2, 1, 1; 出度: 3, 2, 1, 1, 1
解析:
2-25
给定有向图的邻接矩阵如下:
顶点2(编号从0开始)的出度和入度分别是:(C)
A. 3, 1
B. 1, 3
C. 0, 2
D. 2, 0
解析:
2-26
设无向图为 G=(V,E),其中 V={v1,v2,v3,v4},E={(v1,v2),(v3,v4),(v4,v1),(v2,v3),(v1,v3)}。则每个顶点的度依次为:
A.2, 1, 1, 1
B.1, 1, 2, 1
C.3, 2, 3, 2
D.2, 3, 2, 3
解析:
2-27
对于给定的有向图如下,其邻接矩阵为:()
解析:
建议 边画矩阵 边把图上连过的线 标记出来
2-28
对于给定的有向图如下,其逆邻接表为:
解析:
2-29
以下哪个是给定无向带权图的邻接矩阵?()
解析:
2-30
具有5个顶点的有向完全图有多少条弧?©
A.10
B.16
C.20
D.25
解析:
画得好丑
2-31
如果从无向图的任一顶点出发进行一次深度优先搜索可访问所有顶点,则该图一定是:(A)
A.连通图
B.完全图
C.有回路的图
D.一棵树
2-32
在图中自c点开始进行广度优先遍历算法可能得到的结果为:(C)
A.c,a,b,e,f,d
B.c,a,f,d,e,b
C.c,f,a,d,e,b
D.c,f,a,b,d,e
解析:
2-34
图的广度优先遍历类似于二叉树的:(D)
A.先序遍历
B.中序遍历
C.后序遍历
D.层次遍历
解析:
一层一层搜索,类似层次遍历。
2-35
关于图的邻接矩阵,下列哪个结论是正确的?(B)
A.有向图的邻接矩阵总是不对称的
B.有向图的邻接矩阵可以是对称的,也可以是不对称的
C.无向图的邻接矩阵总是不对称的
D.无向图的邻接矩阵可以是不对称的,也可以是对称的
解析:
有向图的邻接矩阵可以是对称的,也可以是不对称的
无向图的邻接矩阵总是对称的
2-8
在AOE网中,什么是关键路径?(D)
A.最短回路
B.最长回路
C.从第一个事件到最后一个事件的最短路径
D.从第一个事件到最后一个事件的最长路径
2-30
求如图所示的AOE-网的关键路径。(B)
A.<1,2><2,4><4,6>
B.<1, 3><3, 2><2, 5><5, 6>
C.<1,3><3,5><5,6>
D.<1,2><2,5><5.6>
2-31
'下面不正确的说法是(A).
(1)在AOE-网工程中,减少任一关键活动上的权值后,整个工期也就相应的减小
(2)AOE-网工程工期为关键活动上的权之和
(3)在关键路径上的活动都是关键活动,而关键活动也必在关键路径上。
A.(1)
B.(2)
C.(3)
D.(1)(3)
解析:
(1)如果增大权值,则工期增加,反过来不行
2-32
关键路径是事件结点网络中(A)。
A.从源点到汇点的最长路径
B.从源点到汇点的最短路径
C.最长回路
D.最短回路
填空题
4-1
图的深度优先搜索(DFS)使用了一种数据结构,这种数据结构是(栈)
4-2
在有n个顶点的有向图中,若要使任意两点间可以互相到达,则至少需要(n)条弧
解析:
4-3
如果含n个顶点的图形形成一个环,则它有(n)棵生成树
解析:
n个顶点形成一个环,则有n条边。每断一条边,这个环都构不成,整个图可以被看出一棵树,有n条不同的边可以断,则对应有n种生成树。
4-4
在有n个顶点的有向图中,每个顶点的度最大可达( 2(n-1) )
解析:
有向图度等于出度+入度。度最大为一个顶点连接剩余所有顶点的情况,且和每个顶点既有出度又有入度。则出度为n-1,入度为n-1。则度max=2(n-1)
4-5
对于给定的有向图如下,则每个顶点的入度和出度顺次为:(3/0 2/2 1/2 1/3 2/1 2/3)
4-6
如图所示的AOE-网,求这个工程最早可能在什么时间结束?(18)
第七章 查找
判断题
1-2
(neuDS)由顺序表和单链表表示的有序表均可使用二分查找法来提高查找速度。(F)
解析:
二分查找是不可以用链表存储;
1-3
折半查找与二分查找树的时间性能在最坏情况下是相同的。(F)
解析:
折半查找的查找长度至多为㏒n+1,二元查找树最坏时需查找n次(数列有序,树只有左孩子或只有右孩子,退化为线性表)
1-4
用向量和单链表表示的有序表均可使用折半查找方法来提高查找速度(F)
解析:
折半查找属于随机访问特性,链表不行
堆排序也不能用链表,因为调整堆时没法随机访问底层节点
快速排序可以链表
归并排序可以链表
基数排序可以链表
插入排序链表比数组要块一些,减少移动次数
1-5
折半查找法的查找速度一定比顺序查找法快。(F)
1-9
二叉排序树的后序遍历序列必然是递增的(F)
1-10
在二叉排序树中插入一个新结点,总是插入到叶子结点下面。(F)
1-1
在散列中,函数“插入”和“查找”具有同样的时间复杂度。(T)
1-11
在散列表中,所谓同义词就是具有相同散列地址的两个元素。 (T)
解析:
具有相同函数值的关键字对该散列函数来说称作同义词。
1-12
若用平方探测法解决冲突,则插入新元素时,若散列表容量为质数,插入就一定可以成功(F)
1-7
在散列表中,所谓同义词就是被不同散列函数映射到同一地址的两个元素 (F)
解析:
具有相同函数值的关键字对该散列函数来说称作同义词。
1-6
将M个元素存入用长度为S的数组表示的散列表,则该表的装填因子为M/S。(T)
解析:
课本P226:散列表的装填因子 α 定义为 =表中填入的记录数 / 散列表的长度;
选择题
2-1
有一个有序表为{1, 3, 9, 12, 32, 41,45, 62, 75, 77, 82, 95, 100},当用二分法查找值82的结点时,()次比较后查找成功。()
A.8
B.1
C.4
D.2
解析:
2-2
解析:
如果数组有 n 个元素,那么第一次比较后,搜索范围减少到 n/2。第二次比较后减少到 n/4,第三次比较后减少到 n/8,以此类推。总的比较次数 k 可以表示为 n/(2^k) = 1,当搜索范围缩小到只剩一个元素时。解这个方程可以得到 k = log₂n。这意味着二分查找的时间复杂度是 O(log₂n)。
2-3
不适合在链式存储结构上实现的查找方法是(B)。
A.顺序查找
B.折半查找
C.二叉排序树查找
D.哈希查找
解析:
折半查找 - 也称为二分查找,这种方法要求数据必须在连续的存储空间中,以便能够通过索引直接访问中间的元素。在链式存储结构中,不能直接访问中间的元素,因此不适合实现折半查找。
2-4
已知有序表(5,16,20,27,30,36,44,55,60,67,71)进行折半查找,在表内各元素等概率情况下查找成功所需的平均查找长度为(C)
A.33/12
B.30/11
C.3
D.2
解析:
关于折半查找的成功(失败)平均查找次数:BV1kg411w7j1
2-5
对N个元素的表做顺序查找时,若查找每个元素的概率相同,则平均查找长度为( A )
A.(N+1)/2
B. N/2
C. N
D.[(1+N)*N ]/2
解析:
第一个数的比较次数为1,第二个数的比较次数为2,第三个数的比较次数为3……以此类推第N个数的比较次数为N,所以总的比较次数为1+2+…+N=N(N+1)/2,平均比较次数为(N+1)/2,也即平均查找长度。
2-6
适用于折半查找的表的存储方式及元素排列要求为(D)。
A.链接方式存储,元素无序
B.链接方式存储,元素有序
C.顺序方式存储,元素无序
D.顺序方式存储,元素有序
2-7
已知一个长度为16的顺序表L,其元素按关键字有序排列。若采用二分查找法查找一个L中不存在的元素,则关键字的比较次数最多是。
A.4
B.5
C.6
D.7
解析:
二分查找的最大比较次数是log2(n)+1。
折半查找在查找不成功时,关键字的比较次数最多为树的高度log2(n)+1。
log2( 16 ) + 1 = 4 + 1 = 5
16 8 4 2 1
2-27
对二叉搜索树进行什么遍历可以得到从小到大的排序序列?
A.前序遍历
B.后序遍历
C.中序遍历
D.层次遍历
解析:
想象第一棵树,左根右 中序遍历
2-28
将{ 3, 8, 9, 1, 2, 6 }依次插入初始为空的二叉搜索树。则该树的后序遍历结果是:(C)
A.2, 1, 3, 6, 9, 8
B.1, 2, 8, 6, 9, 3
C.2, 1, 6, 9, 8, 3
D.1, 2, 3, 6, 9, 8
解析:
建立二叉搜索树不需要排序
2-29
将{ 32, 2, 15, 65, 28, 10 }依次插入初始为空的二叉搜索树。则该树的前序遍历结果是:(D)
A.2, 10, 15, 28, 32, 65
B.32, 2, 10, 15, 28, 65
C.10, 28, 15, 2, 65, 32
D.32, 2, 15, 10, 28, 65
解析:
建立二叉搜索树不需要排序
2-30
已知二叉排序树如下图所示,元素之间应满足的大小关系是(C)
A. x1 < x2 < x5
B. x1 < x4 < x5
C. x3 < x5 < x4
D. x4 < x3 < x5
解析:
2-32
已知由(60,30,56,78,12,45)序列构成的二叉排序树,其等概率成功查找的平均查找长度为。
A.21/7
B.28/7
C.15/6
D.21/6
解析:
2-8
在下列查找的方法中,平均查找长度与结点个数无关的查找方法是:(C)
A.顺序查找
B.二分法
C.利用哈希(散列)表
D.利用二叉搜索树
2-9
对包含n个元素的散列表进行查找,平均查找长度(D)
A:O(1)
B:O(log n)
C:O(log n)
D:不确定
解析:
在散列表中,平均查找长度与装填因子α \alphaα直接相关,表的查找效率不直接依赖于表中已有表项个数n或表长m。若散列表中存放的记录全部是某个地址的同义词,则平均查找长度为O(n)而非O(1)。
2-10
将M个元素存入用长度为S的数组表示的散列表,则该表的装填因子为:(D)
A.S+M
B.M−S
C.M×S
D.M/S
2-11
对哈希(HASH)函数H(k)= k MOD m, 一般来说,m应取(A)
A.素数
B.很大的数
C.偶数
D.奇数
2-12
设有一组记录的关键字为{19,14,23,1,68,20,84,27,55,11,10,79},用链接法构造散列表,散列函数为H(key)=key MOD 13,散列地址为1的链中有(D)个记录。
A.3
B.2
C.1
D.4
解析:
2-14
哈希表的平均查找长度是()的函数。(B)
A.哈希表的长度
B.哈希表的装填因子
C.哈希函数
D.表中元素的多少
2-15
(neuDS)哈希表的地址区间为0~17,哈希函数为h(key)=K%17。采用线性探测法处理冲突,并将关键字序列{26,25,72,38,8,18,59}依次存储到哈希表中,则在哈希表中查找元素59需要搜索的次数为( )。
A.2
B.3
C.4
D.5
解析:
2-16
设哈希表长为14,哈希函数是H(key)=key%11,表中已有数据的关键字为15,38,61,84共四个,现要将关键字为49的元素加到表中,用二次探测法解决冲突,则放入的位置是( )。
A.8
B.3
C.5
D.9
解析:
2-17
解析:
2-18
采用线性探测法处理冲突,可能要探测多个位置,在查找成功的情况下,所探测的这些位置上的关键字(A)
A.不一定都是同义词
B.一定都是同义词
C.一定都不是同义词
D.都相同
2-19
散列冲突可以被描述为:©
A.两个元素除了有不同键值,其它都相同
B.两个有不同数据的元素具有相同的键值
C.两个有不同键值的元素具有相同的散列地址
D.两个有相同键值的元素具有不同的散列地址
2-21
设散列表的地址区间为[0,16],散列函数为H(Key)=Key%17。采用线性探测法处理冲突,并将关键字序列{ 26,25,72,38,8,18,59 }依次存储到散列表中。元素59存放在散列表中的地址是:(D)
A.8
B.9
C.10
D.11
解析:
2-22
将元素序列{18,23,11,20,2,7,27,33,42,15}按顺序插入一个初始为空的、大小为11的散列表中。散列函数为:H(Key)=Key%11,采用线性探测法处理冲突。问:当第一次发现有冲突时,散列表的装填因子大约是多少?(B)
A.0.27
B.0.45
C.0.64
D.0.73
解析:
2-23
解析:
2-24
从一个具有N个结点的单链表中查找其值等于X的结点时,在查找成功的情况下,需平均比较多少个结点?(D)
A.N/2
B.N
C.(N−1)/2
D.(N+1)/2
解析:
第一个数的比较次数为1,第二个数的比较次数为2,第三个数的比较次数为3……以此类推第N个数的比较次数为N,所以总的比较次数为1+2+…+N=N(N+1)/2,平均比较次数为(N+1)/2,也即平均查找长度。
2-25
将元素序列{18, 23, 4, 26, 31, 33, 17, 39}按顺序插入一个初始为空的、大小为13的散列表中。散列函数为:H(Key)=Key%13,采用线性探测法处理冲突。问:当第一次发现有冲突时,散列表的装填因子大约是多少?(C)
A.0.54
B.0.63
C.0.31
D.0.62
解析:
填空题
4-4
关于二分查找算法在下面的有序表中
( 15, 24, 32, 47, 50, 58, 62, 79, 83, 96 )
1.若采用二分查找算法,则查找元素 58 时,需要比较(3)次。
解析: 第一次50 第二次 79 第三次 58
2.若采用顺序查找算法,假设各元素的检索概率相同,则平均查找长度为(5.5)
解析: 顺序查找就是按顺序依次查找 asl = ( 10 + 1 )/ 2 = 5.5
3.若采用顺序查找算法,则查找元素 58 时,需要比较(6)次。
解析: 数数会吧
4.若采用二分查找算法,则最大查找长度为 (4)
解析: log2(N) = 4
5.若采用顺序查找算法,则最大查找长度为(10)
解析: 数数会吧
6.若采用二分查找算法,假设各元素的检索概率相同,则平均查找长度为(2.9)
解析:
4-3
设关键词序列为 {47,7,29,11,9,84,54,20}
1)散列表表长TableSize =13,
2)散列函数为:h(key) = key mod 11。
3)用线性探测法处理冲突,请计算成功查找的ASL(ASLs)和不成功查找的ASL (ASLu)
注意:计算结果保留小数点后两位;或者采用分数形式表示,如: 68/17。
ASLs = (2)
ASLu = (35/11)
解析:
4-9
(直接定址法)法构造的哈希函数肯定不会发生冲突。
4-10
假设有n个关键字,它们具有相同的Hash函数值,用线性探测方法解决冲突,把这n个关键字散列到大小为n的地址空间中,共计需要做( n(n+1)/2 )次插入和探测操作。
解析:
对于第一个关键字,我们不需要探测就可以直接插入,因为我们假设它落在它的哈希函数值指定的槽位上。但是对于第二个关键字,由于第一个槽位已经被占用,我们需要探测一次才能找到下一个空闲的槽位。对于第三个关键字,我们需要探测两次,因为前两个槽位已经被占用,以此类推。
因此,对于第i个关键字,我们需要进行i-1次探测(第一个关键字0次,第二个关键字1次,…,第n个关键字n-1次)。所以,总的探测次数是:
0 + 1 + 2 + … + (n - 1)
但是,这只是探测的次数,每个关键字的插入本身也算作一次操作,所以对于每个关键字,我们有1次插入操作加上探测操作。
因此,总的操作次数(包括插入和探测)为:
0 + 1 + 2 + … + (n - 1) + n = n(n+1)/2
4-11
解析:
4-12
解析:
4-13
解析:
第八章 排序
关于八大排序算法 BV1WP411c7hS
关于排序算法的动图演示及代码 https://www.runoob.com/w3cnote/insertion-sort.html
判断题
1-2
内排序要求数据一定要以顺序方式存储(F)
解析:
还可以用链式存储。
1-3
用希尔(Shell)方法排序时,若关键字的初始排序杂乱无序,则排序效率就低 (F)
解析:
时间复杂度受增量序列的影响明显大于其他因素,最坏的情况是o(n2),好的情况在o(n1.3),与增量序列选择有关
1-4
给定序列{100,86,48,73,35,39,42,57,66,21},按堆结构的定义,它一定是堆。(T)
解析:
根据给定的序列{100, 86, 48, 73, 35, 39, 42, 57, 66, 21},我们可以按照堆的定义来确定它是否是堆。
堆是一个完全二叉树,其中每个节点的值都大于或等于其子节点的值(对于最大堆)或小于或等于其子节点的值(对于最小堆)。
首先,我们将给定的序列表示为一个完全二叉树:
100
/ \
86 48
/ \ / \
73 35 39 42
/ \ /
57 66 21
观察这个二叉树,我们可以发现每个节点的值都大于或等于其子节点的值。因此,给定的序列是一个最大堆。
所以,根据堆的定义,给定的序列{100, 86, 48, 73, 35, 39, 42, 57, 66, 21}是一个堆。
1-5
有一大根堆,堆中任意结点的关键字均大于它的左右孩子关键字,则其具有最小值的结点一定是一个叶子结点并可能在堆的最后两层中。(T)
解析:
满足任意父节点都大于子节点的称作为大堆
满足任意子节点都大于父节点的称作为小堆
1-6
堆排序是稳定的排序算法。(F)
解析:
堆排序是通过反复调整元素位置来完成排序的过程,其中涉及到交换操作。这些交换操作可能导致相同键值元素的相对顺序发生变化,因此堆排序是一个不稳定的排序算法。
1-7
堆是完全二叉树,完全二叉树不一定是堆。(T)
解析:
大部分时间我们是使用完全二叉树来存储堆的,但是堆并不等于完全二叉树,例如二项堆,斐波那契堆,就不属于二叉树。
1-8
排序算法中的比较次数与初始元素序列的排列无关(F)
解析:
那如果无关的为什么还要区分时间复杂度捏
1-9
当待排序记录已经从小到大排序或者已经从大到小排序时,快速排序的执行时间最省(F)
解析:
快速排序和初始数据排列顺序没有关系,可能是选择排序等有序序列时间复杂度为O(N)的排序时间更省一点。
1-10
对于n个记录的集合进行冒泡排序,在最坏情况下需要的时间是O(n^2) (T)
解析:
冒泡排序如1,2,3,4最好的情况是按完全升级排列,最坏就是数字完全按降序排列:
第一次是1:然后1和2,3,4;
第2次是2:比较谁比它小交换,于是2和34交换,答案是3421;
第3次为3:3和4;
最后是4321;这就是最坏情况下的次数3+2+1=6=4*3/2;
其实对于n个的话,你要求降低排列,但是偏偏都是升序的数字;最坏的情况就是如此:次数为:n-1+n-2…+1=n*(n-1)/2。
时间复杂度为O(n^2)
1-11
直接选择排序的时间复杂度为O(n^2),不受数据初始排列的影响(T)
解析:
第一次从1到n-1中选出最小的数,与A[0]交换位置
第二次从2到n-1中选出最小的数,与A[1]交换位置
…
总共比较次数:n-1 + n-2 + … +1 = n(n-1)/2
时间复杂度为O(n^2)
1-12
内排序的快速排序方法,在任何情况下均可得到最快的排序效果。(F)
1-13 + 1-14
堆肯定是一棵平衡二叉树。(F)
堆是满二叉树。(F)
解析:
堆是完全二叉树,完全二叉树不一定是堆。
1-15
起泡排序的排序趟数与参加排序的序列原始状态有关。(T)
解析:
如果直接就是排好的状态下直接遍历一遍就好了
1-16
对n个记录进行简单选择排序,比较次数和移动次数分别为O(n^2)和O(n) (T)
解析:
比较次数分析:
在简单选择排序中,每次遍历未排序的记录时,需要进行 n-1 次比较。第一次遍历需要 n-1 次比较,第二次遍历需要 n-2 次比较,以此类推。总的比较次数可以表示为:
(n-1) + (n-2) + … + 2 + 1 = n * (n-1) / 2 = O(n^2)
移动次数分析:
在简单选择排序中,每次找到最小记录后,需要将其与当前位置的记录进行交换。由于每次遍历只进行一次交换,因此移动次数与记录的数量 n 成正比,即 O(n)。
综上所述,简单选择排序的比较次数为 O(n^2),移动次数为 O(n)。
1-17
(neuDS)排序的稳定性是指排序算法中的比较次数保持不变,且算法能够终止。(F)
解析:
具体来说,如果排序算法是稳定的,那么对于具有相同排序键值的两个元素,它们在排序后的结果中的相对位置应该与它们在排序前的相对位置相同。换句话说,如果有两个相等的元素A和B,且在排序前A出现在B的前面,那么在排序后,A应该仍然出现在B的前面。
1-18
(neuDS)直接插入排序算法在最好情况下的时间复杂度为O(n)(T)
解析:
直接插入与冒泡排序最好都是有序一遍过。
1-19
在堆排序中,若要进行升序排序,则需要建立大根堆。(T)
解析:
关于 堆排序(排升序为啥建大堆,排降序为啥建小堆)
https://blog.csdn.net/Code_beeps/article/details/91488526
1-20
快速排序是稳定的算法。(F)
1-21
由于希尔排序的最后一趟与直接插入排序过程相同,因此前者一定比后者花费的时间更多。(F)
1-23
对 N 个记录进行堆排序,需要的额外空间为 O(N)。(F)
解析:
堆排序不需要额外空间,只通过位置交换进行排序,额外空间为 O(1)
1-24
对N个记录进行快速排序,在最坏的情况下,其时间复杂度是O(NlogN)。(F)
解析:
C(n) = (n-1) + (n-2) + … + 1 = n(n-1)/2
最坏的情况下,快速排序的时间复杂度为O(n^2)
1-25
希尔排序是稳定的算法。(F)
1-27
插入排序算法在每一趟都能选取出一个元素放在其最终的位置上(F)
解析:
插入排序(直接、二分)不一定会位于最终的位置,因为不确定后面插入的元素对于前面的元素是否产生影响。
1-28
直接插入排序是不稳定的排序方法(F)
1-29
直接选择排序算法在最好情况下的时间复杂度为O(N)(F)
解析:
O (n^2)
选择题
2-3
下列排序算法中,哪种算法可能出现:在最后一趟开始之前,所有的元素都不在其最终的位置上?(设待排元素个数N>2)(B)
A.冒泡排序
B.插入排序
C.堆排序
D.快速排序
解析:
冒泡排序 每次有一个位置确定
插入排序 插入插在头结点就全后移
堆排序 每次也就移动一个子树另一个子树不变动
快速排序 扫描的时候最后肯定有一半排好了
2-8
对于序列{ 49,38,65,97,76,13,27,50 },按由小到大进行排序,下面哪一个是初始步长为4的希尔排序法第一趟的结果?(B)
A.13,27,38,49,50,65,76,97
B.49,13,27,50,76,38,65,97
C.49,76,65,13,27,50,97,38
D.97,76,65,50,49,38,27,13
解析:
2-9
选择一个排序算法时,除算法的时空效率外,下列因素中,还需要考虑的是:(D)
I、数据的规模
II、数据的存储方式
III、算法的稳定性
IV、数据的初始状态
A.仅 III
B.仅 I、II
C.仅 II、III、IV
D.I、II、III、IV
2-10
就排序算法所用的辅助空间而言,堆排序、快速排序、归并排序的关系是:
A.堆排序 < 归并排序 < 快速排序
B.堆排序 > 归并排序 > 快速排序
C.堆排序 < 快速排序 < 归并排序
D.堆排序 > 快速排序 > 归并排序
解析:
堆的空间复杂度为1,快速排序为log2(n),归并为n
2-11
有组记录的排序码为{46,79,56,38,40,84 },采用快速排序(以位于最左位置的对象为基准而)得到的第一次划分结果为:(D)
A.{38,46,79,56,40,84}
B.{38,79,56,46,40,84}
C.{38,46,56,79,40,84}
D.{40,38,46,56,79,84}
解析:
2-12
给定初始待排序列{ 15,9,7,8,20,-1,4 }。如果希尔排序第一趟结束后得到序列为{ 15,-1,4,8,20,9,7 },则该趟增量为:(D)
A.1
B.2
C.3
D.4
解析:
初始:15,9,7,8,20,-1,4
结束:15,-1,4,8,20,9,7
发现9,4的位置向后移动了4位,增量为4
2-13
2-14
2-15
2-16
2-17
对大部分元素已有序的数组进行排序时,直接插入排序比简单选择排序效率更高,其原因是:
(I). 直接插入排序过程中元素之间的比较次数更少
(II). 直接插入排序过程中所需要的辅助空间更少
(III). 直接插入排序过程中元素的移动次数更少
A.仅 I
B.仅 III
C.仅 I、II
D.I、II 和 III
解析:
II肯定不对,辅助空间都是O(1)
通常情况下,直接插入排序每趟插入都要依次向后挪位,而简单选择排序只需与找到的最小元素交换位置,后者的移动次数少很多。
2-18
对N个不同的数据采用冒泡算法进行从大到小的排序,下面哪种情况下肯定交换元素次数最多?(A)
A.从小到大排好的
B.从大到小排好的
C.元素无序
D.元素基本有序
2-20
对初始数据序列{ 8, 3, 9, 11, 2, 1, 4, 7, 5, 10, 6 }进行希尔排序。若第一趟排序结果为( 1, 3, 7, 5, 2, 6, 4, 9, 11, 10, 8 ),第二趟排序结果为( 1, 2, 6, 4, 3, 7, 5, 8, 11, 10, 9 ),则两趟排序采用的增量(间隔)依次是:(D)
A.3, 1
B.3, 2
C.5, 2
D.5, 3
解析:
8, 3, 9, 11, 2, 1, 4, 7, 5, 10, 6
1, 3, 7, 5, 2, 6, 4, 9, 11, 10, 8
第一次:9向后移动5格
1, 3, 7, 5, 2, 6, 4, 9, 11, 10, 8
1, 2, 6, 4, 3, 7, 5, 8, 11, 10, 9
第二次:2向后移动3格
2-21
采用初始增量为4的希尔排序法对关键字序列{15,10,4,26,14,2,13,19,17,5, 9,23},按照关键字值递增的次序排序,一趟扫描后的结果为 ( )
A.{14,2,4,19,15,5,9,23,17,10,13,26}
B.{2,9,4,26,14,15,13,19,17,5,10,23}
C.{10,4,15,14,2,13,19,16,5,9,23,26}
D.{10,15,4,2,14,13,19,16,5,9,23,26}
解析:
2-22
快速排序方法在(D)情况下最不利于发挥其长处。
A.排序的数据量太大
B.要排序的数据中含有多个相同值
C.排序的数据个数为奇数
D.要排序的数据已基本有序
2-23
下列关键字序列中,构成大根堆的是(D)。
A.5,8,1,3,9,6,2,7
B.9,8,1,7,5,6,2,3
C.9,8,6,3,5,1,2,7
D.9,8,6,7,5,1,2,3
解析:
A选项根不是最大的,不考虑
2-24
下列四个序列中,哪一个是堆( )。
A.75,65,30,15,25,45,20,10
B.75,65,45,10,30,25,20,15
C.75,45,65,30,15,25,20,10
D.75,45,65,10,25,30,20,15
解析:
2-25
下面的关键字序列中,(C)不是堆。
A.(32,54,43,72,66)
B.(63,24,53,11,20)
C.(11,53,20,24,63)
D.(32,43,54,66,72)
解析:
2-26
从未排序序列中依次取出元素与已排序序列中的元素进行比较,将其放入已排序序列的正确位置上的方法,这种排序方法称为( )。
A.归并排序
B.冒泡排序
C.插入排序
D.选择排序
解析:
2-27
堆是一种(B)排序。
A.插入
B.选择
C.交换
D.归并
解析:
2-28
堆的形状是一棵©。
A.二叉排序树
B.满二叉树
C.完全二叉树
D.平衡二叉树
2-29
数据表中有10000个元素,如果仅要求求出其中最大的10个元素,则采用(D)算法最节省时间。
A.冒泡排序
B.快速排序
C.简单选择排序
D.堆排序
解析:
堆排序的时间复杂度是O(nlogn)
2-31
对于7个数进行冒泡排序,需要进行的比较次数为:©
A.7
B.14
C.21
D.49
解析:
第一个数需要比较6次,第二个数需要比较5次
以此类推:6+5+4+3+2+1=21
2-32
对n个不同的排序码进行冒泡排序,在元素无序的情况下比较的次数最多为(D)。
A.n+1
B.n
C.n-1
D.n(n-1)/2
解析:
比较次数最多时,第一次比较 n-1 次,第二次比较 n-2 次, 最后一次比较 1
次,即 (n-1)+(n-2)+ , +1= n(n-1)/2
填空题
4-3
时间复杂度为O(nlogn)的排序算法有归并排序、堆排序和 (快速)排序
4-4
直接插入排序可以通过设置(哨兵) 来避免在寻找插入位置的过程中数组下标越界
4-5
对包含10个记录的表r[1…10]进行简单选择排序,所需进行的关键字间的比较次数为
(45)
解析:
第一个数需要比较9次,第二次比较8次,以此类推
9 + 8 + 7 +…+ 1 = 45
4-1
若待排序的序列中存在多个记录具有相同的键值,经过排序,这些记录的相对次序仍然保持不变,则称这种排序方法是(稳定) 的,否则称为(不稳定)的
4-2
按照排序过程涉及的存储设备的不同,排序可分为(内) 排序和(外)排序。