X32专项练习部分25
哈希表相关概念的深入理解
/*
以下哪个不属于单向哈希表的特征(假设没有冲突)()
正确答案: B
它把任意长度的信息转换成固定的长度输出
它把固定的信息转换成任意长度信息输出
根据特定的哈希值,它可以找到对应的原信息值
不同的信息很难产生一样的哈希值
哈希表(Hash Table)是一种根据关键字
直接访问内存存储位置的数据结构
直接看选项吧
A,hash函数可以把字符串等
任意长度的输入映
射成固定长度的整数,也就是哈希值
哈希值是通过哈希函数得到的
举一个栗子
H(x) = n % 9
哈希存储的长度就是10
哈希值就是1 - 10之间的任意数字
B,与A说法相反,错误
C,哈希表建立了哈希值与原值信息存储之间的联系
可以通过哈希值查找到原值信息
D,不同的信息产生相同的哈希值叫哈希冲突
设计哈希函数应尽量避免哈希冲突
因此一般很难冲突
*/
邻接表广度优先遍历时间复杂度
/*
对有n个结点、e条边且使用邻接表存储的有向图进行广度优先遍历,其算法时间复杂度是()。
正确答案: C
O(n)
O(e)
O(n+e)
O(n*e)
根据我个人的理解画了1张图
就拿该栗子来说
根据我个人的理解画了1张图
我是这么理解的
在我的画的图里面
有4条边,所以按指向的方向查询4次
有4个顶点,所以读取4次节点的值
一共O(n + e) = O(8)
所以时间复杂度是O(n + e)
无向图的查询次数是有向图的2倍
由于没有箭头指向
同一个边会按2个方向分别查询
也就是1条边查询2次
*/
BFS辅助数据结构
/*
从根开始按层序遍历一颗二叉树,需要使用()作为辅助数据结构
正确答案: B
heap
queue
binary tree
stack
层序遍历对应广度优先遍历
广度优先遍历(BFS)用队列
深度优先遍历(DFS)用栈
仔细想一下,先将根结点A入队,再将A出队(遍历到A)
然后将A的所有子结点(假设为B、C)入队
接着,B出队(遍历到B)
将其所有子结点入队,接下来出队的自然是C(遍历到C)
然后将C的所有子结点入队,这样,就遍历了两层
接下来出队的自然是B的第一个子结点(遍历到该节点),开始第三层的遍历
可见我们需要一个先进先出的结构,自然选择队列
*/
归并排序第1趟的结果
/*
设一组初始记录关键字序列为(25,50,15,35,80,85,20,40,36,70)
其中含有5个长度为2的有序子表,则用归并排序的方法对该记录关键字序列进行一趟归并后的结果为
正确答案: A
15,25,35,50,20,40,80,85,36,70
15,25,35,50,80,20,85,40,70,36
15,25,35,50,80,85,20,36,40,70
15,25,35,50,80,20,36,40,70,85
原序列共分成5段有序
第1段:25,50
第2段:15,35
第3段:80,85
第4段:20,40
第5段:36,70
第1段与第2段归并,结果为:15,25,35,50
第3段与第4段归并,结果为:20,40,80,85
第5段落单了,则原样照抄
结果为A
*/
邻接表无向图深度优先遍历
/*
对有n个顶点、e条边且采用邻接表作为存储结构的无向图进行深度优先搜索遍历的时间复杂度为()
正确答案: C
O(n)
O(n2)
O(n+e)
O(e)
如下图,如果按邻接表无向图深度优先遍历
则会是如下遍历过程
首先从v0开始查找,查找到v1
然后又以v1为顶点,查找与v1相连的顶点
先查到v0,但v0已经被访问(v0和v1中间的边已经被扫描过了)
就不在扫码边了
跳过v0,查到v2
同样的步骤,以v2为顶点,查到v3
v3连接的顶点全部被访问过
所以说
每条边扫描1次
每个顶点访问1次
时间复杂度为O(n + e)
*/
最短二进制编码长度
/*
用二进制来编码字符串"adceadaa",需要能够相据编码,解码回原来的字符串
则至少需要二进制字符的长度是
正确答案: B
12
14
18
20
要达到最短的二进制编码长度,要用哈夫曼编码
注意哈夫曼编码的方式方法
构建哈夫曼树,每次拿出最小频率的两个数作为节点连接起来,依次类推
a:4 d:2 c:1 e:1
根据频率构建哈夫曼树
先将c和e作为节点连接起来
他们的根节点(设为x)的值为2
d为剩下最小的节点,但是其值不小于x,则拿d和x连接起来
他们的根节点(设为y)值为4,同理,则拿a和y连接起来形成哈夫曼树
然后就是带权路径长度和编码出现次数的乘积之和
就是至少需要二进制字符的长度
也就是最短二进制编码长度
*/
根据递归公式推断时间复杂度
这道题可以先推倒第k次的原始递推公式,也就是第k次该递归函数返回什么值;
再根据第k次T(Π)内部的表达式 = 递归终止条件
解除k然后回代原式,换掉t
最后再保留高阶,得O(n^2)
完全二叉树适合顺序存取的原因
/*
下面对完全二叉树描述正确的是()
正确答案: B C 你的答案: A B D (错误)
叶子结点可在任一层出现
某些结点有有右子树则必有左子树
适用于顺序结构存储
不一定适合顺序结构存储
直接看选项吧
A选项,完全二叉树叶子节点只能出现在最下层和次下层
不能出现在任意1层,A说法错误
B选项,有左子树不一定有右子树,有右子树一定有左子树
B选项正确
完全二叉树为什么最适合顺序存储结构
一般情况下,如果将树的结点从上到下,每一层从左到右从1开始挨个编号
那么结点 i 的左孩子就是2i,右孩子就是2i+1,将这个规律反映到顺序存储中
我们可以根据数组的下标i也能找到左孩子(2i)和右孩子(2i+1)
前提是数组下标 i=0位丢弃不用,从i=1开始存储树的编号为1的根结点,以此类推
所以,下面这句话是重点
这样即使是将一棵树顺序存储到了一个一维数组中
结点i的左孩子就是2i,右孩子就是2i+1这套公式照样能够使用
所以完全二叉树适合顺序存取
*/