【数据结构】【xjtuse】八股文单元小测
渐进分析
-
在定义ADT时,除数据对象和数据关系外,还需说明( )。
A.数据项
B.数据元素
C.基本操作
D.算法 -
在数据结构中,与所使用的计算机无关的是数据的( )结构。
A.存储
B.物理
C.逻辑
D.逻辑和存储 -
在下列算法中,“x=x*2”的执行次数是( )。
int suanfal (int n){int i,j,x=1;for(i=0; i < n; i++)for(j=i;j < n; j++)x = x * 2;return x;
}
-
下列说法中错误的是( )
A.算法的时间复杂度是指获知算法执行时间的复杂程度
B.算法执行时间需通过依据该算法编制的程序在计算机上运行时所消耗的时间来度量
C.算法中描述的操作都是可以通过已经实现的基本运算执行有限次来实现的
D.算法具有可行性、确定性和有穷性等重要特性 -
数据的逻辑结构可以分为( ) 两类。
A.线性结构和非线性结构
B.内部结构和外部结构
C.紧凑结构和非紧凑结构
D.动态结构和静态结构 -
下列说法中,不正确的是( )。
A.数据元素是数据的基本单位
B.数据可由若干个数据元素构成
C.数据项可由若干个数据元素构成
D.数据项是数据中不可分割的最小可标识单位 -
数据结构由3部分组成:( )、( )和( )。
A.存储结构
B.逻辑结构
C.逻辑存储
D.数据映像
E.运算
F.算法 -
某算法的时间复杂度为O(n^2),则表示该算法的()。
A.问题规模与n^2成正比
B.问题规模是n^2
C.执行的时间等于n^2
D.执行时间与n^2成正比 -
在相同的规模n下,复杂度O(n)的算法在时间上总是优于复杂度O(2^n)的算法。
A.是
B.否 -
逻辑结构相同的数据,可采用多种不同的存储方法
A.正确
B.错误
答案:
C C n(n+1)2\frac{n(n+1)}{2}2n(n+1) A A
C BAE D B A
第四题:A. 时间复杂度只能大概估计 不能获知具体的运算时间
排序
-
以下排序算法中,不稳定的是( )。
A. 冒泡排序
B. 直接插入排序
C. 希尔排序
D. 归并排序 -
如果记录序列已经基本有序,这时使用简单选择排序,其时间复杂度是( )。
A. O(n)
B. O(n log n)
C. O(n^2)
D. O(log n) -
选择一个排序算法时,除算法的时空效率外,下列因素中,还需要考虑的是( )。I.数据的规模 Ⅱ.数据的存储方式 Ⅲ.算法的稳定性 IV.数据的初始状态
A. 仅Ⅲ
B. 仅Ⅰ、Ⅱ
C. 仅Ⅰ、Ⅱ和Ⅲ
D. Ⅰ、Ⅱ、Ⅲ和Ⅳ -
快速排序算法在( )情况下最不利于发挥其长处。
A. 要排序的数据量太大
B. 要排序的数据中含有多个相同值
C. 要排序的数据个数为奇数
D. 要排序的数据已基本有序 -
若对 n 个元素进行直接插入排序,在进行第 i 趟排序时,假定元素 r[i]的插入位置为 j,则需要移动元素的次数为( )。
A. j-i
B. i-j-1
C. i-j
D. i-j+1 -
在( )情况下,使用简单选择排序是一个较好的选择。
A. 每个记录对内存空间的需求很小
B. 记录之间交换的代价很大
C. 记录序列中的逆序对很少
D. 以上都不对 -
在对 n 个元素进行直接插入排序的过程中,共需要进行( )趟。
A. n
B. n-1
C. n+1
D. 2n -
排序趟数与序列的原始状态无关的排序算法是( )。 I.直接插入排序 II.简单选择排序 Ⅲ.冒泡排序
A. Ⅰ和Ⅲ
B. Ⅰ和Ⅱ
C. Ⅰ
D. Ⅱ -
快速排序的划分步骤在最坏情形下的时间复杂度是( )。
A. O(n^2)
B. O(log n)
C. O(n log n )
D. O(n) -
假如有100000个数据,其中90%的数据都是有序的,如果将整个数据序列都排好,( )排序算法最合适?
A. 直接插入排序
B. 冒泡排序
C. 简单选择排序
D. 快速排序 -
快速排序的缺点是( )。
A. 需要一个额外的数组空间做为辅助空间。
B. 是稳定排序。
C. 平均情形下的运行时间复杂度是。
D. 最坏情形下的运行时间复杂度是。 -
待排序数据的排列顺序对于使用快速排序时,所需要的比较次数的影响是( )。
A. 有很大的差异,将会影响运行时间的渐进性。
B. 有差异,但只是常数因子。
C. 没有差异。 -
当待排序的记录序列中的所有记录都是相同的,那么使用直接插入排序时,其运行时间的复杂度是( )。
A. O(n)
B. O(n^2)
C. O(n log n)
D. O(log n) -
平均情形下,如果有一个比较好的增量递减序列,Shell排序的时间复杂度是( )。
A. O(n)
B. O(n^2)
C. O(n倍根号n)
D. 以上都不是 -
如果有100000个数据,只想获得前10个最大的数据,( )排序算法最慢?
A. 直接插入排序
B. 冒泡排序
C. 简单选择排序
D. 希尔排序 -
已知数组长度是9,采用Shell排序对其排序,增量序列的第一个值是5,由于某个子序列中只包含一个元素,故位置为( )的元素在Shell排序的第一趟将会被忽略。
A. 0
B. 1
C. 2
D. 3
E. 4
F. 5
G. 6
H. 7
I. 8 -
在对 n 个元素进行冒泡排序的过程中,至少需要( )趟完成。
A. 1
B. n-1
C. n
D. n/2 -
下列各种排序算法中,( )需要的附加存储空间最大。
A. 快速排序
B. 希尔排序
C. 归并排序
D. 简单选择排序 -
在对 n 个元素进行冒泡排序的过程中,第一趟排序至多需要进行( )对相邻元素之间的交换。
A. n-1
B. n
C. n+1
D. n/2 -
从交换次数来看,( )排序算法的复杂度最小?
A. 直接插入排序
B. 冒泡排序
C. 简单选择排序
D. 快速排序
答案:
CCDDC
BBBDA
DAACA
EACAC
线性表
-
n个元素的线性表,其插入位置有()个,其删除位置有()个?
单选题(5分)
A. “n,n”
B. “n+1, n+1”
C. “n+1, n”
D. “n, n+1” -
顺序线性表中,平均情形下将任意位置的元素删除需花费的时间复杂度是()。
单选题(5分)
A. Θ(n log n)
B. Θ(n)
C. Θ(log n)
D. Θ(1) -
假设线性表中的每个元素大小需要占据10个字节,如果用链表实现线性表,那么一个指针需要占据4个字节。已知数组实现线性表时,分配的数组元素个数要大于线性表的实际元素个数。请问这个线性表在用数组实现时,当数组空间的利用率达到 ① 以上时,这个线性表用数组实现比链表实现所需要的空间小。(答案请用最简化的分数形式,比如二分之一:1/2)
填空题(5分) -
链表实现的线性表,平均情形下,删除当前元素的时间复杂度是()。
单选题(5分)
A. Θ(n log n)
B. Θ(log n)
C. Θ(n)
D. Θ(1) -
某个线性表以顺序表形式实现,长度为n,现在按值查找元素,假设线性表中没有该值的概率为p,且要查找的值在线性表中等概率出现。则平均比较次数为:
单选题(5分)
A. pn + (1-p)(n+1)
B. pn + (1-p)(n+1)/2
C. pn + (1-p)(n+1)/4
D. pn + p(n+1)/2 -
栈A中有元素a、b、c(顺序为a在顶部),而栈B初始为空。当从栈A中弹出一个元素时,既可以立即打印该元素,也可以将其推入栈B。当从栈B中弹出一个元素时,只能打印该元素。下列哪个a、b、c的排列是不可能打印出来的?
单选题(5分)
A. c a b
B. b a c
C. a b c
D. b c a -
使用链式存储实现线性表比使用数组实现的优势是()。
单选题(5分)
A. 最有的搜索效率
B. 存储空间的使用率高
C. 可扩展性好
D. 访问任意位置的元素代价低
E. 以上都不是 -
顺序线性表,平均情形下将一个元素插入到任意位置需花费的时间复杂度是()。
单选题(5分)
A. Θ(1)
B. Θ(log n)
C. Θ(n)
D. Θ(n log n) -
线性表采用顺序存储,必须占用一片连续的存储空间。
判断题(5分)
A. 是
B. 否 -
以下术语中,哪一个描述的是逻辑结构,而与存储和运算无关?
单选题(5分)
A. 顺序表
B. 单向链表
C. 双向链表
D. 线性表 -
以下关于线性表的说法不正确的是()。
单选题(5分)
A. 线性表中的数据元素可以是数字、字符、记录等不同类型
B. 线性表中包含的数据元素个数不是任意的
C. 线性表中的每个结点都有且只有一个直接前驱和直接后继
D. 存在这样的线性表:表中各结点都没有直接前驱和直接后继 -
栈和队列的共同点是()。
单选题(5分)
A. 都是先进后出
B. 都是先进先出
C. 只允许在端点处插入和删除元素
D. 没有共同点 -
在n个节点的线性表的顺序实现中,算法的时间复杂度是O(1)的操作是()。
单选题(5分)
A. 访问第i(0 ≤ i < n)
B. 在第i(0 ≤ i < n)插入
C. 删除第i(0 ≤ i < n)
D. 以上都不对 -
假设线性表中的每个元素大小需要占据7个字节,如果用链表实现线性表,那么一个指针需要占据4个字节。已知数组实现线性表时,分配的数组元素个数要大于线性表的实际元素个数。请问这个线性表在用数组实现时,当数组空间的利用率达到 ① 以上时,这个线性表用数组实现比链表实现所需要的空间小。(答案请用最简化的分数形式,比如二分之一:1/2)
填空题(5分) (请按题目中的空缺顺序依次填写答案) -
某线性表用带头结点的通环单链表存储,头指针为 head,当head.next.next ==head成立时,线性表的长度可能是()
单选题(5分)
A. 0
B. 1
C. 2
D. 可能为0或1 -
判定一个顺序栈stack(元素个数最多为maxSize)为栈满的条件是( )。(假设:top指针指示的意义为真正栈顶元素的后继位置)
单选题(5分)
A. top == 0
B. top == -1
C. top == maxSize
D. top == maxSize - 1 -
线性表在顺序存储时,查找第i个元素的时间与i的数值成正比。
判断题(5分)
A. 是
B. 否 -
在一个长度为n的线性表中,删除第i个元素(0 ≤ i < n),那么需要移动的元素个数是( )?
单选题(5分)
A. n - i
B. n - i + 1
C. n - i - 1
D. i -
设线性表中有2n个元素,()在单链表上实现要比在顺序表上实现效率更高。
单选题(5分)
A. 删除所有值为x的元素
B. 在最后一个元素的后面插入一个新元素
C. 顺序输出前k个元素
D. 交换第i个元素和第2n - i - 1个元素的值(i = 0, …, n - 1) -
判定一个用顺序方式实现的循环队列Q,判断队空的条件是( )。(假设实现队列的数组大小为queueSize)
单选题(5分)
A. front == rear
B. front + 1 == rear
C. front == (rear + 1)%queueSize
D. rear == (front + 1)%queueSize
答案:
-
C(n+1, n)
解析:长度为 n 的线性表,有 n+1 个插入“缝”(含表头前、表尾后);删除只能对现有 n 个元素进行。 -
B(Θ(n))
解析:顺序表删除需把被删位置之后的元素整体左移,平均移动约 n/2 个,量级为 Θ(n)。 -
① = 5/7
解析:设元素大小 s=10B,链表结点存储为 s+ptr=10+4=14B。顺序表容量为 m、实际元素 n,空间 m·s;链表空间 n·(s+4)。当
m·s ≤ n·(s+4) ⇔ s ≤ (n/m)(s+4)。令利用率 u = n/m,则需 u ≥ s/(s+4)=10/14=5/7。 -
D(Θ(1))
解析:链表在已知“当前结点及其前驱”的情况下删除为指针改接,时间常数级。 -
B(p·n + (1−p)·(n+1)/2)
解析:顺序查找:不在表中比较 n 次;在表中等概率出现,平均位置比较 (n+1)/2 次,按概率加权即可。 -
A(c a b 不可能)
解析:从 A(自顶 a,b,c)出栈,或打印或压入辅助栈 B,再从 B 只能打印。这等价于“单栈可产生的排列”。n=3 的可行排列为 abc, acb, bac, bca, cba,唯 cab(312) 不可由单栈生成。 -
C(可扩展性好)
解析:链式存储无需预留连续空间,插删灵活;随机访问慢(否 D),查找效率并非最好(否 A),并且有指针额外开销(B 不一定成立)。 -
C(Θ(n))
解析:顺序表任意位置插入需整体右移,平均移动约 n/2 个,量级 Θ(n)。 -
A(是)
解析:顺序存储(顺序表)的定义即占用连续存储空间。 -
D(线性表)
解析:“线性表”是逻辑结构;顺序表、单/双向链表是具体的存储实现。 -
C(不正确)
解析:线性表除首元外各结点有且仅有一个直接前驱;除末元外各结点有且仅有一个直接后继——不是“每个”结点都有两个。
A 正确:元素类型可为数字/字符/记录等;B 可理解为“元素个数是有限的”并非任意无限;D 在表长为 1 时唯一结点既无前驱也无后继,存在。 -
C(只允许在端点处插入和删除元素)
解析:栈在一端操作(后进先出),队列在两端操作但分别是入队与出队;共同点就是“只在端点处操作”。 -
A(访问第 i 个)
解析:顺序表按下标随机访问为 O(1);插删涉及元素移动为 O(n)。 -
① = 7/11
解析:同第 3 题推导,s=7B,阈值 u ≥ s/(s+4)=7/(7+4)=7/11。 -
D(可能为 0 或 1)
解析:带头结点的循环单链表:若空表,则 head.nexthead ⇒ head.next.nexthead;若表长为 1,唯一结点 next 指回 head,同样成立;表长≥2 时不成立。 -
C(top == maxSize)
解析:题设 top 指向“栈顶元素的后继位置”,空栈 top=0,满栈时 top 等于容量 maxSize。 -
B(否)
解析:顺序存储按下标访问为常数时间,与 i 无关。 -
C(n − i − 1)
解析:删除第 i 个(0≤i<n),需要移动其后的所有元素个数 = 尾到位置 i 的元素数 = n−i−1。 -
A(删除所有值为 x 的元素)
解析:单链表删除仅改指针,整体 O(n) 且无大规模搬移;顺序表删除会造成元素搬移(即便做一次性压缩也需大量移动),总体更“重”。 -
A(front == rear)
解析:顺序循环队列的判空条件是 front 与 rear 相等(判满通常另有约定如 (rear+1)%size==front)。
二叉树
1.设高度为h的二叉树上只有度为0和度为2的结点,则此类二叉树中所包含的结点数至少为( )。
单选题 (10 分)
A.2h
B.2h-1
C.2h+1
D.h+1
2.对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左、右孩子中,其左孩子的编号小于其右孩子的编号,可采用( )次序的遍历实现编号。
单选题 (10 分)
A.先序遍历
B.中序遍历
C.后序遍历
D.层序遍历
3.具有n个结点且高度为n的二叉树的数目为( )。
单选题 (10 分)
A.logn\log nlogn
B.n2\frac{n}{2}2n
C.nnn
D.2n−12^{n-1}2n−1
4.一棵二叉树的先序遍历序列为ABCDEF,中序遍历序列为CBAEDF,则后序遍历序列为( )。
单选题 (10 分)
A.CBEFDA
B.FEDCBA
C.CBEDFA
D.不确定
5.如果用O(d)O(d)O(d)描述BST在搜索、插入和删除操作的运行时间复杂度,那么ddd是( )。
单选题 (10 分)
A.这棵树的总结点数。
B.这棵树的深度。
C.这棵树空指针的数量。
6.一棵二叉树的先序遍历序列为EFHIGJK,中序遍历序列为HFIEJKG,则该二叉树根结点的右孩子为( )。
单选题 (10 分)
A.E
B.F
C.G
D.H
7.对一棵二叉树进行层次遍历时,应借助于一个栈。
判断题 (10 分)
A.是
B.否
8.对于任意一棵高度为5且有10个结点的二叉树,若采用顺序存储结构保存,每个结点占1个存储单元(仅存放结点的数据信息),则存放该二叉树需要的存储单元数量至少是( )。
单选题 (10 分)
A.31
B.16
C.15
D.10
9.下列关于二叉树的说法中,正确的是( )。
单选题 (10 分)
A.度为2的树就是二叉树
B.含有n个结点的二叉树的高度为+1
C.在完全二叉树中,若一个结点没有左孩子,则它必是叶结点
D.含有n个结点的完全二叉树的高度为
10.某二叉树中的结点x,它在先序、中序、后序遍历序列中的编号分别为pre(x)、in(x)、post(x)(按遍历的先后顺序,越早遍历的结点编号越大),a和b是树中任意两个结点,下列选项中错误的是( )。
单选题 (10 分)
A.a是b的后代且pre(a)<pre(b)
B.a是b的祖先且post(a)>post(b)
C.a是b的后代且in(a)<in(b)
D.a在b的左边且in(a)>in(b)
答案
BCDAB CBACB
-
对于高度为h且只有度为0(叶子)和度为2(有两个孩子)的二叉树,要使结点数最少,需让除最后一层外的所有结点均为度2(确保每层仅新增必要结点)。规律为:h=1时1个结点,h=2时3个结点,h=3时7个结点,符合公式2h-1。故答案为B。
-
要求结点编号大于左右孩子且左孩子编号小于右孩子,对应遍历顺序需先访问左右孩子再访问根(根编号最大),且左孩子先于右孩子访问(左编号小)。后序遍历(左-右-根)满足此条件。故答案为C。
-
高度为n的n个结点二叉树,只有一条主路径(从根到叶),其余结点均为该路径上结点的单个孩子(左或右)。除根外的n-1个结点,每个有2种选择(左/右孩子),共2^(n-1)种。故答案为D。
-
先序ABCDEF(根A),中序CBAEDF(A左为CB,右为EDF)。左子树:先序BC、中序CB→B为根,C为左孩子,后序CB;右子树:先序DEF、中序EDF→D为根,E左、F右,后序EFD;整体后序CB+EFD+A→CBEFDA。故答案为A。
-
BST的搜索、插入、删除操作需从根遍历到目标结点,路径长度取决于树的深度d,故时间复杂度O(d)中d为树的深度。故答案为B。
-
先序EFHIGJK(根E),中序HFIEJKG(E左为HFI,右为JKG)。右子树先序为GJK(E后左子树遍历完后是G),中序JKG→G为右子树根,即E的右孩子是G。故答案为C。
-
层次遍历按层访问结点,需借助队列(先进先出)记录当前层结点以访问下一层,栈用于深度优先遍历。故答案为B。
-
顺序存储二叉树需按完全二叉树结构预留位置(否则无法确定结点关系),高度5的二叉树最多需2^5-1=31个单元,任意此类树均需至少31个单元。故答案为A。
-
A错误(二叉树是有序树,度2的树未必有序);B、D描述不完整;C正确(完全二叉树按层序排列,无左孩子则必无右孩子,为叶结点)。故答案为C。
-
A正确(祖先先于后代先序遍历,pre(祖先)>pre(后代));B错误(后序遍历后代先于祖先,post(祖先)<post(后代));C正确(后代在祖先左/右子树,中序可能更小);D正确(左边结点中序早于右边,in(左)<in(右),选项说in(a)>in(b)错误,但B更明显错误)。故答案为B。
图
-
对有向图G,如果从任意顶点出发进行一次深度优先或广度优先搜索能访问到每个顶点,则该图一定是完全图。
A. 正确
B. 错误 -
设图G采用邻接表存储,则拓扑排序算法的时间复杂度为( )。
A. ( O(|V|) )
B. ( O(|V|+|E|) )
C. ( O(|V| \times |V|) )
D. ( O(|V| \times |E|) ) -
在图的邻接表存储结构上执行深度优先搜索遍历类似于二叉树上的( )。
A. 先序遍历
B. 中序遍历
C. 后序遍历
D. 层序遍历 -
以下叙述中,正确的是()。
A. 只要无向连通图中没有权值相同的边,则其最小生成树唯一
B. 只要无向图中有权值相同的边,则其最小生成树一定不唯一
C. 从n个顶点的连通图中选取n-1条权值最小的边,即可构成最小生成树
D. 设连通图G含有n个顶点,则含有n个顶点、n-1条边的子图一定是G的生成树 -
含n个顶点的连通图中的任意一条简单路径,其长度最大为( )。
A. 1
B. ( n/2 )
C. ( n-1 )
D. ( n ) -
邻接表只能用于有向图的存储,而相邻矩阵对于有向图和无向图的存储都适用。
A. 正确
B. 错误 -
在图的邻接表存储结构上执行广度优先搜索遍历类似于二叉树上的( )。
A. 先序遍历
B. 中序遍历
C. 后序遍历
D. 层序遍历 -
在无向图中,所有顶点的度数之和是所有边数的( )倍。
A. 0.5
B. 1
C. 2
D. 4 -
在n个结点的无向图中,若边数大于n-1,则该图必是连通图。
A. 是
B. 否 -
n个顶点的无向图的邻接表最多有( )个边表结点。
A. ( n^2 )
B. ( n(n-1) )
C. ( n(n+1) )
D. ( \frac{n(n-1)}{2} )
答案
以下是各题的解答:
-
答案:B(错误)
分析:从任意顶点出发能遍历所有顶点的有向图是强连通图,但不一定是完全图。例如有向环(n个顶点构成环)是强连通图,但不是完全图(完全有向图要求每对顶点间有双向边)。 -
答案:B(( O(|V|+|E|) ))
分析:拓扑排序过程中,需要遍历所有顶点(统计入度、入队出队)和所有边(处理邻接顶点的入度),因此时间复杂度为 ( O(|V|+|E|) )。 -
答案:A(先序遍历)
分析:图的邻接表DFS遍历是“先访问顶点,再递归访问邻接顶点”,这与二叉树的先序遍历(先访问根节点,再递归访问左右子树)逻辑一致。 -
答案:A
分析:- 选项A:无向连通图中无相同权值的边时,Kruskal/Prim算法选边无歧义,最小生成树唯一,正确。
- 选项B:有权值相同的边,若这些边未被选中,最小生成树仍可能唯一,错误。
- 选项C:选n-1条权值最小的边可能形成环,无法构成生成树,错误。
- 选项D:n个顶点n-1条边的子图需连通才是生成树,否则不是,错误。
-
答案:C(( n-1 ))
分析:简单路径的顶点不重复,n个顶点的简单路径最多包含n个顶点,边数为 ( n-1 ),因此长度最大为 ( n-1 )。 -
答案:B(错误)
分析:邻接表可存储有向图和无向图(无向图邻接表每条边存两次);邻接矩阵也适用于有向图和无向图。因此题目描述错误。 -
答案:D(层序遍历)
分析:图的邻接表BFS遍历是“按层访问顶点,先访问当前层再访问下一层”,这与二叉树的层序遍历逻辑一致。 -
答案:C(2)
分析:无向图中每条边连接两个顶点,因此每条边对“所有顶点度数之和”贡献2(两个顶点各加1度),故度数之和是边数的2倍。 -
答案:B(否)
分析:n个结点的无向图,边数大于( n-1 )不一定连通。例如两个连通分量(一个是( n-1 )个顶点的完全图,另一个是1个顶点),总边数可能大于( n-1 )但图不连通。 -
答案:B(( n(n-1) ))
分析:n个顶点的无向图最多有( \frac{n(n-1)}{2} )条边(完全无向图)。邻接表中每条无向边对应两个边表结点(因为无向图邻接表每条边存两次),因此边表结点数为 ( 2 \times \frac{n(n-1)}{2} = n(n-1) )。
