1-1
数据结构概念包括数据之间的逻辑结构、数据在计算机中的存储方式和数据的运算三个方面。
1-2
NlogN^2和NlogN具有相同的增长速度。
NlogN^2=2NlogN
Ο(1)<Ο(logn)<Ο(n)<Ο(nlogn)<Ο(n²)<Ο(n³)<…<Ο(2^n)<Ο(n!)<O(n^n)
1-4
所谓“循环队列”是指用单向循环链表或者循环数组表示的队列。
F
循环队列指的是用数组表示的队列,利用求余数运算使得头尾相接。
循环队列本身是一种顺序存储结构,而循环链表是一种链式存储结构。两者之间是平级关系。
线性链表是线性表的链式存储结构,包括单链表,双链表,循环链表等。
队列的顺序存储结构一般采用循环队列的形式。
1-5
某二叉树的后序和中序遍历序列正好一样,则该二叉树中的任何结点一定都无左孩子。
F
中序遍历:左 根 右
先序遍历:根 左 右
后序遍历:左 右 根
所以:一定都无右孩子
1-6
在一棵二叉搜索树上查找63,序列39、101、25、80、70、59、63是一种可能的查找时的结点值比较序列。
F
从前三个数据看该查找均不为三种遍历中的一种:先序(根左右)39 25 101;中序(左根右)25 39 101;后序(左右根)25 101 39
二叉搜索树的性质:非空左子树的所有键值小于其根结点的键值;右子树的大于根结点的键值
1-7
将一棵完全二叉树存于数组中(根结点的下标为1)。则下标为23和24的两个结点是兄弟。
F
完全二叉树第n行的孩子结点个数为2^(n-1)
所以可知x=(1+2^(n-1))*n/2,23,24在第5行,从16-32:22-23,24-25
1-8
对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度分别对应为O(1)和O(N)。
增加结点需要先让部分元素后移后才能插入
1-9
将N个数据按照从小到大顺序组织存放在一个单向链表中。如果采用二分查找,那么查找的平均时间复杂度是O(logN)。
F
二分查找关键是,迅速当前数据的中间值,拿中间值跟需要查找的目的key比较,根据比较的结果,淘汰一半的候选元素。
单向链表不可二分查找,只有按顺序存放的数组/多级链表才可以,这是由链表的特性决定的。链表是很典型的链式存储结构,因为数据在链表中的位置是不确定的,所以只能通过从头到尾的顺序检索得到,因此链表的每一个节点的地址不能在O(1)的时间复杂度内获得。
这和数组有本质的不同。数组中的元素是通过下标来确定的,只要你知道了下标,就可以直接存储整个元素, 比如a[5],是直接的。链表没有这个,所以,折半查找只能在数组上进行。但是二分查找的时间复杂度是为O(logN)
1-10
通过对堆栈S操作:Push(S,1), Push(S,2), Pop(S), Push(S,3), Pop(S), Pop(S)。输出的序列为:123。
F
321
2-1
斐波那契数列FN的定义为:F0=0, F1=1, FN=FN−1+FN−2, N=2, 3, …。用递归函数计算FN的空间复杂度是:
A.O(logN)
B.O(N)
C.O(FN)
D.O(N!)
B 调用了N层空间复杂度
只有二分搜索,大多一般时,才会使O(logN)
2-2
对于顺序存储的长度为N的线性表,访问结点和增加结点的时间复杂度为:
A.O(1), O(1)
B.O(1), O(N)
C.O(N), O(1)
D.O(N), O(N)
B
2-3
设栈S和队列Q的初始状态均为空,元素{1, 2, 3, 4, 5, 6, 7}依次进入栈S。若每个元素出栈后立即进入队列Q,且7个元素出队的顺序是{2, 5, 6, 4, 7, 3, 1},则栈S的容量至少是:
A.1
B.2