面试中发现很多同学一股脑优化、润色项目经历,但聊到基本的算法,反而会一脸懵X,得空整理下算法题给大家,希望对你有帮助。
1. tail(head(tail(C))) =( ) 已知广义表: A=(a,b), B=(A,A), C=(a,(b,A),B), 求下列运算的结果:()
A 1000种量级
B 10000种量级
C 100000种量级
D 500000种以上
正确答案: C
不考虑失效的方式(就是不连贯的情况),那么如果9个点的话,排列组合有9!(362880)种,比9少的都达不到9的量级,在减去失效的也不会跨量级,所以是100000的量级。
2.线性表如果要频繁的执行插入和删除操作,该线性表采取的存储结构应该是()
A 散列
B 顺序
C 链式
D 索引
正确答案: C
解析
D,索引结构,每次插入和删除都需要更新索引,费时 C,链式存储适合插入和删除操作
B,顺序存储插入和删除都需要移动大量元素
A,散列更适合查找,不适合频繁更新
答案:C
3.某段文本中各个字母出现的频率分别是{a:4,b:3,o:12,h:7,i:10},使用哈夫曼编码,则哪种是可能的编码:()
A a(001) b(000) h(01) i(10) o(11)
B a(0000) b(0001) h(001) o(01) i(1)
C a(000) b(001) h(01) i(10) o(00)
D a(0000) b(0001) h(001) o(000) i(1)
正确答案: A
首先:创建一个哈夫曼树
原则如下:
1. 将每个英文字母依照出现频率由小排到大,最小在左,组成一个序列
2. 每个字母都代表一个终端节点(叶节点),比较每个字母的出现频率,将最小的两个字母频率相加合成一个新的节点,将两个字母从序列中删除,将生成的节点加入到字母队列中
3. 重复前面两步,直到序列中没有字母为止
进行编码:
1. 给霍夫曼树的所有左链结'0'与右链结'1'
2. 从树根至树叶依序记录所有字母的编码
好:我们先来构造
v = {b(3),a(4),h(7),i(10),o(12)}
取最小两个权值构成一棵树(如下)
--------(7)
---------/---\
-------/------\
-----b(3)---a(4)
然后将(7)加入序列:(7),h(7),i(10),o(12)
再取最小两个权值构成树:如下
-----------------(14)
--------------/--------\
------------/------------\
--------(7)---------h(7)
---------/---\
-------/------\
-----b(3)---a(4)
将(14)加入权值序列:(14),i(10),o(12)
现在取10跟12构成一颗新数:如下
----------------(14)------------------(22)
--------------/--------\----------------/-----\
------------/------------\ -----------/----------\
--------(7)---------h(7) ---i(10)--------o(12)
---------/---\
-------/------\
-----b(3)---a(4)
最好权值相加:
--------------------------(36)
--------------------/-----------------\
------------------/---------------------\
----------------(14)------------------(22)
--------------/--------\----------------/-----\
------------/------------\ -----------/----------\
--------(7)---------h(7) ---i(10)--------o(12)
---------/---\
-------/------\
-----b(3)---a(4)
现在执行哈夫曼编码:从第二个接点开始:
进行编码:
1. 给霍夫曼树的所有左链结'0'与右链结'1'
2. 从树根至树叶依序记录所有字母的编码
--------------------------(36)
--------------------/-----------------\
------------------/---------------------\
----------------0(14)------------------1(22)
--------------/--------\----------------/-----\
------------/------------\ -----------/----------\
--------0(7)---------1h(7) ---0i(10)--------1o(12)
---------/---\
-------/------\
-----0b(3)---1a(4)
结果:a:001,b000,h01,i10,o11 选A
4.旅行商问题是NP问题吗?
A 否
B 是
正确答案: B
至今尚无定论旅行商问题是否NP问题
旅行商问题(TravelingSalesmanProblem,TSP)是一个经典的组合优化问题。经典的TSP可以描述为:一个商品推销员要去若干个城市推销商品,该推销员从一个城市出发,需要经过所有城市后,回到出发地。应如何选择行进路线,以使总的行程最短。从图论 的角度来看,该问题实质是在一个带权完全无向图 中,找一个权值最小的Hamilton 回路。由于该问题的可行解是所有顶点的全排列 ,随着顶点数的增加,会产生组合爆炸,它是一个NP完全问题 。由于其在交通运输、电路板线路设计以及物流配送等领域内有着广泛的应用,国内外学者对其进行了大量的研究。早期的研究者使用精确算法求解该问题,常用的方法包括:分枝定界 法、线性规划 法、动态规划 法等。但是,随着问题规模的增大,精确算法将变得无能为力,因此,在后来的研究中,国内外学者重点使用近似算法或启发式算法 ,主要有遗传算法 、模拟退火法 、蚁群算法 、禁忌搜索 算法、贪婪算法 和神经网络等 。
5.下述编码中哪一个不是前缀码()
A (00,01,10,11)
B (0,1,00,11)
C (0,10,110,111)
D (1,01,000,001)
正确答案: B
根据定义可知:B中有序列是另一个序列的前缀,可知错误
例如,{0,10,110}就是一个前缀码,而{0,10,101}就不是前缀码。
. 设Q ={a1, a2, …, am}是一个0~1序列集合 . 如果Q中没有一个序列是另一个序列的前缀 , 则称Q为前缀码。
6.一棵哈夫曼树的带权路径长度等于其中所有分支结点的权值之和()
A 对
B 错
正确答案: B
结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。
树的带权路径长度(Weighted Path Length of Tree):定义为树中所有叶结点的带权路径长度之和。
7.下列有关图的说法错误的是()
正确答案: C
A 在有向图中,出度为0的结点称为叶子
B 用邻接矩阵表示图,容易判断任意两个结点之间是否有边相连,并求得各结点的度
C 按深度方向遍历图和前序遍历树类似,得到的结果是唯一的
D 若有向图G中从结点Vi到结点Vj有一条路径,则在图G的结点的线性序列中结点Vi,必在结点Vj之前的话,则称为一个拓扑序
8.下列关于线性表,二叉平衡树,哈希表存储数据的优劣描述错误的是?
正确答案: D
A 哈希表是一个在时间和空间上做出权衡的经典例子。如果没有内存限制,那么可以直接将键 作为数组的索引。那么所有的查找时间复杂度为O(1);
B 线性表实现相对比较简单
C 平衡二叉树的各项操作的时间复杂度为O(logn)
D 平衡二叉树的插入节点比较快
正确答案:D
哈希表是一个在时间和空间上做出权衡的经典例子。如果没有内存限制,那么可以直接将键作为数组的索引。那么所有的查找时间复杂度为O(1);如果没有时间限制,那么我们可以使用无序数组并进行顺序查找,这样只需要很少的内存。
在平衡二叉树中插入结点要随时保证插入后整棵二叉树是平衡的,所以可能需要通过一次或多次树旋转来重新平衡这个树推荐
9.在ASC算法team日常开发中,常常面临一些数据结构的抉择,令人纠结。目前大家在策划一个FBI项目(Fast Binary Indexing),其中用到的词汇有6200条,词汇长度在10-15之间,词汇字符是英文字母,区分大小写。请在下面几个数据结构中选择一个使检索速度最快的()
A 二叉搜索树,比较函数开销:1次运算/每字符
B 哈希表,hash算法开销:10次运算/每字符
C 链表,比较函数开销:1次运算/每字符
D TRIE树,寻找子节点开销:1次运算/每字符
正确答案: D
注解:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。
10.下列陈述错误的是( )
A 数值概率算法一般是求数值计算问题的近似解
B Monte Carlo总能求得问题的一个解,但该解未必正确
C Las Vegas算法的一定能求出问题的正确解
D Sherwood算法的主要作用是减少或是消除好的和坏的实例之间的差别
正确答案: C
数值概率算法(数值问题的求解,最优化问题的近似解)、蒙特罗卡算法(判定问题的准确解,不一定正确)、拉斯维加斯算法(不一定会得到解,但得到的解一定是正确解)、舍伍德算法(总能求得一个解,且一定是正确解)
11.()的遍历仍需要栈的支持
A 前序线索树
B 中序线索树
C 后序线索树
正确答案: C
解析:
后序遍历要稍微复杂一点点,在前序和中序遍历的程序中,当我们准备进入根结点的右子树时,根结点就被扔出栈外了。但在后序遍历时,我们仍需保留它,直到右子树处理完毕。
12.关于 0 - 1 背包问题以下描述正确的是( )。
A 可以使用贪心算法找到最优解
B 能找到多项式时间的有效算法
C 使用教材介绍的动态规划方法可求解任意0-1背包问题
D 对于同一背包与相同的物品,做背包问题取得的总价值一定大于等于做0-1背包问题
正确答案: D
13.线性表若采用链式存储结构时,要求内存中可用存储单元的地址()
A 必须是连续的
B 部分地址必须是联系的
C 一定是不连续的
D 连续或不连续都可以
正确答案: D
链表不需要存储空间连续,只需链表指针记录下一个地址即可。
14.设散列表中有 m 个存储单元,散列函数 H(key)= key % p ,则 p 最好选择( )
A 小于等于m的最大奇数
B 小于等于m的最大素数
C 小于等于m的最大偶数
B 小于等于m的最大素数
正确答案: B
15.已知模式串的 next 数组,使用 KMP 算法进行串匹配,以下空格应填入的语句是( )。
int Index_KMP(SString S, SString T, int pos)
{
// 利用模式串 T 的 next 函数求 T 在主串 S 中第 pos 个字符之后的位置的
// KMP 算法。其中, T 非空, 1 ≤ pos ≤ StrLength(S) 。
int next[255];
int i = pos;
int j = 1;
get_next(T, next);
while (i <= S[0] && j <= T[0]) {
if (j == 0 || S[i] == T[j]) { // 继续比较后继字符
++i; ++j;
} else
________; // 模式串向右移动
}
if (j > T[0]) return i-T[0]; // 匹配成功
else return 0;
} // Index_KMP
}
A j = next[j]
B i = next[j]
C j = i + 1
D i = j + 1
正确答案: A
解析:
KMP的算法流程是如下
假设现在文本串S匹配到 i 位置,模式串P匹配到 j 位置
- 如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),都令i++,j++,继续匹配下一个字符;
- 如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]。此举意味着失配时,模式串P相对于文本串S向右移动了j - next [j] 位。
- 换言之,当匹配失败时,模式串向右移动的位数为:失配字符所在位置 - 失配字符对应的next 值,即移动的实际位数为:j - next[j],且此值大于等于1。
很快,你也会意识到next 数组各值的含义:代表当前字符之前的字符串中,有多大长度的相同前缀后缀。例如如果next [j] = k,代表j 之前的字符串中有最大长度为k 的相同前缀后缀。
此也意味着在某个字符失配时,该字符对应的next 值会告诉你下一步匹配中,模式串应该跳到哪个位置(跳到next [j] 的位置)。如果next [j] 等于0或-1,则跳到模式串的开头字符,若next [j] = k 且 k > 0,代表下次匹配跳到j 之前的某个字符,而不是跳到开头,且具体跳过了k 个字符。
16.采用二叉链表作为存储结构,树的前序遍历和其相应的二叉树的前序遍历的结果是一样的()
A 对
B 错
正确答案: A
解析:
树的二叉链表存储时,一个结点有两个指针域,一个指向它第一个孩子,一个指向它第一个兄弟。而将一般树转换为二叉树时,也是一个结点有一个结点有两个指针域,一个指向它第一个孩子,一个指向它第一个兄弟。
17. 下面关于求关键路径的说法不正确的是()
A 求关键路径是以拓扑排序为基础的
B 一个事件的最早开始时间同以该事件为尾的弧的活动最早开始时间相同
C 一个事件的最迟开始时间为以该事件为尾的弧的活动最迟开始时间与该活动的持续时间的差
D 关键活动一定位于关键路径上
正确答案: C
做这题要注意几点概念:
1)顶点表示事件,弧表示活动
2)如果顶点A->B有弧