算法基础知识【1】(8-9)

Date: 2019-08-09

今天开启算法基础知识的复习,算法的基础知识主要包括:查找+ 排序 +递归+ 复杂度+高级算法这五部分的知识。

排序:

1.  下列各种排序算法中平均时间复杂度为O(n2)是()。D

A.快速排序(O(nlong))

B.堆排序  (O(nlong))

C.归并排序  (O(nlong))

D.冒泡排序  (O(n^2))

2.  一组记录的排序码为(46,79,56,38,40,84),一趟排序的结果为(40,38,46,56,79,84),则采用的是()排序算法。C

A.冒泡排序 

B. 直接插入排序

C.快速排序

D.2-路归并排序

解释: 

A选项起泡算法:相邻元素两两比较,一个元素大于右侧相邻元素交换位置,否则位置不变。

  • 一趟排序为:46,56,38,40,79,84

B选项直接插入:每一步将一个待排序的记录,插入到前面已经排好序的有序序列中去,直到插完所有元素为止。

  • 一趟排序为:38,40,46,79,56,84

C选项快速:挑选一个基准元素,大于基准元素的放在其右边,小于基准元素的放在其左边,从而拆分为两部分,以此类推直到不可拆分为止。

以源数据第一个元素46为基准,采用双边循环法设置left和right两个指针指向数组最左和最右两端,从右指针开始,如果大于或等于基准元素则指针向左移动,如果小于基准元素则停止。转向left指针向右移动如果小于或等于基准元素则继续向右移动,如果大于基准元素则停止。交换两指针元素后,右指针继续上述操作比较,直到最后把基准元素和两指针重复元素交换位置。第一趟排序结束得出如下排序,所以C正确。

  • 一趟排序为:403846567984

D选项2-路归并:将一个数组分成两个数组,分别对两个数组进行排序,循环第一步,直到划分出来的“小数组”只包含一个元素,只有一个元素的数组默认为已经排好序

  • 一趟排序为:46,56,79合并;38,40,84合并

3.  判断下列说法是否正确:归并排序是稳定的排序方法,在最坏情况下时间复杂度是0(nlogn)。( True)

4.  在一个有N个元素的有序单链表中查找具有给定关键字的结点,平均情况下的时间复杂性为(O(N))

解释:  N个结点的单链表查找结点最好为1,最坏为N,平均为(N+1)/2,所以平均时间复杂度为O(N)

5.  下列排序算法中()排序在一趟结束后不一定能选出一个元素放在其最终位置上 C

A.选择

B.冒泡

C.归并

D.堆

解释:

A,选择排序每次选择一个元素放在其最终位置,直道序列有序为止

B,冒泡排序每一趟都将子序列中最小的元素放在子序列的首位,也就是元素的最终位置

D,堆排序,以最小堆为例,堆顶元素是所有元素中最小的,可以一次性放在最终位置

6.  直接选择排序算法满足:其时间复杂度不受数据的初始特性影响,为O(n^2)。True

7.  堆排序是稳定的排序方法() False

选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序(冒归插基)是稳定的排序算法

8.  将5不同的数据进行交换排序,至多需要比较多少次(10次)   4+3+2+1=(n*(n-1)/2)

9.  将7个不同的数据进行排序,至少需要比较(6) 次 

解释:考虑一个最好的情况,如将1.2.3.4.5.6.7排成升序。采用插入排序,仍然需要6次比较

10.  下列哪个算法是对一个list排序的最快方法()A

A. 快速排序

B.冒泡排序

C.二分插入排序

D.线性排序

11.希望用最快的速度从一个无序数组中挑选出其中前十个最大的元素,在以下的排序方法中()堆排序

解释:  用堆排序最好,因为堆排序不需要等整个排序结束就可挑出前10个最大元素,而快速排序和基数排序都需等待整个排序结束才能知道前10个最大元素。

12.  下列排序算法中,占用辅助空间最多的是()A

A.归并排序

B.快速排序

C.希尔排序

D.堆排序

13.  对关键码序列28,16,32,12,60,2,5,72快速排序(最常用的快速排序,以第一个关键码为基准),使用挖坑法,从小到大一次划分结果为()  

一趟排序结果为5,16,2,12,28,60,32,72。

一趟快速排序的算法是:

1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;

2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];

3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;

4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

5)重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

14.  拓扑排序运算只能用于(    )  C

A. 带权有向图

B. 连通无向图

C.有向无环图

D.无向图

解释:只有有向无环图才可以进行拓扑排序。因此拓扑排序因此能够被用来检测有向图是否有环。

15. 【没懂】 下面的算法段针对不同的自然数 n 作不同的处理,其中函数 odd (n) 当 n 是奇数时返回 true ,否则返回 false ,

while ( n > 1) :
    if ( odd (n) ) :
        n = 3 * n + 1; 
    else :
        n = n / 2; 

请问该算法所需计算时间的下界是( )。 Ω(logn) 解释: 输入是2的k次幂的情况下复杂度最小

16.  图的BFS生成树的树高比DFS生成树的树高()小或者相等

解释: BFS是广度优先遍历,DFS是深度优先遍历。
对于一些特殊的图,比如只有一个顶点的图,其BFS生成树的树高和DFS生成树的树高相等。
一般的图,根据图的BFS生成树和DFS树的算法思想,BFS生成树的树高比DFS生成树的树高小。

17.  若给定的关键字集合为{20,15,14,18,21,36,40,10},一趟快速排序结束时,键值的排序为: 10,15,14,18,20,36,40,21

18. 对n个记录的文件进行堆排序,最坏情况下的执行时间是多少?()    O(nlog2n)

解释:时间复杂度分析,第一步首先建堆需要用时o(n),第二步对大小为n的堆,取出元素放入数组尾部用时o(1),重新进行保持堆特性为o(lgn),因此o(n)+o(nlgn),总体时间时间复杂度为o(nlgn)

19.  当n=5时,下列函数的返回值是:(5)

int foo(int n) {
    if (n < 2)
        return n;
    return foo(n - 1) + foo(n - 2);
}

解释:

f(0)=0;

f(1)=1;

f(2)=f(1)+f(0)=1;

f(3)=f(2)+f(1)=2;

f(4)=f(3)+f(2)=3;

f(5)=f(4)+f(3)=5;

20.  若有序表的关键字序列为(b,c,d,e,f,g,q,r,s,t),则在二分查找关键字b的过程中,先后进行的关键字依次为:  f,c,b

解释:  

这里有一个+1, -1 的操作,在二分查找里面。

如果mid 比 tar 小 就往后找 +1, 反之 往前找-1

即: 

第一次下标是(0 + 9)/2 = 4

第二次下标是(0+3)/2 = 1

最后一次下标是0

21.  希尔排序算法的时间复杂度为 O(n2) 。 (  错误)   

解释:希尔排序在最坏情况下为O(n^2),当n在某个特定范围时,约为O(n^(1.3))

22.  在堆排序算法中我们用一个数组A来模拟二叉树T,如果该A[0]存放的是T的根节点,那么A[K](K>0)的父亲节点是  (K-1)/2

解释:

由于根节点是从0开始存储,因此父节点 i 的左孩子为 2*i+1,右孩子为 2*i+2

    故当孩子节点为k时要分情况讨论,此时设父节点为x

    1)k左孩子

        2*x+1=k 解得:x=(k-1)/2

    2)k右孩子

  2*x+2=k 解得:x=(k-2)/2

23.  排序时,若不采用计数排序的等空间换时间的方法,合并m个长度为n的已排序数组的时间复杂度最优为()  O(mn(logm))

巧妙解释:当n=1时,就成了m个数的归并排序,时间复杂度为O(mlogm)

24.  【没懂KMP算法】已知字符串S为“abaabaabacacaabaabcc”,模式串t为“abaabc”。采用KMP算法进行匹配,第一次出现“失配”(s[i]≠t[j]) 时,i=j=5,则下次开始匹配时,i和j的值分别是 。  i=5,j=2

由题中“失配s[i]≠t[j]时,i=j=5”,可知题中的主串和模式串的位序都是从0开始的(要注意灵活应变)。按照next数组生成算法,对于t有:

编号

0

1

2

3

4

5

t

a

b

a

a

b

c

next

-1

0

0

1

1

2

依据KMP算法“当失配时,i不变,j回退到next[j]的位置并重新比较”,当失配s[i]≠t[j]时,i=j=5,由上表不难得出next[j]=next[5]=2(位序从0开始)。从而最后结果应为:i=5(i保持不变),j=2。

25.  就平均查找长度而言,分块查找最小,折半查找次之,顺序查找最大()    错误

解释:  分快查找,是将顺序表分为若干块,块内元素顺序任意,块间有序,即前一块中的最大值小于后一块中的最小值。并且有一张索引表,每一项存放每一块的最大值和指向该块第一个元素的指针。索引表有序,块内无序。所以,块间查找用二分查找,块内用顺序查找,效率介于顺序和二分之间。

*  

分块查找:

1.将顺序表分为若干块,除最后一块,前面每块元素相等,块间有序,块内无序

2.索引表内元素有序,用二分折半查找,每块内元素无序,用顺序查找

3.所以分块查找介于折半查找和顺序查找之间

26.【有争议】  在图采用邻接表存储时,求最小生成树的Prim算法的时间复杂度为()    O(n^2)

解释:利用邻接表存储是O(n+e),邻接矩阵存储是O(n^2)

27.  如果要求一个线性表既能较快地查找,又能适应动态变化的要求,可以采用下列哪一种查找方法。()  哈希

A. 分块

B.顺序

C.折半

D.哈希

解释: 

A,分块法应该是将整个线性表分成若干块进行保存,若动态变化则可以添加在表的尾部(非顺序结构),时间复杂度是O(1),查找复杂度为O(n);若每个表内部为顺序结构,则可用二分法将查找时间复杂度降至O(logn),但同时动态变化复杂度则变成O(n)

 

B,顺序法是挨个查找,这种方法最容易实现,不过查找时间复杂度都是O(n),动态变化时可将保存值放入线性表尾部,则时间复杂度为O(1),所以不满足要求

 

C,二分法是基于顺序表的一种查找方式,体现的是折半思想,查找的时间复杂度为O(logn),不过要是动态变化的情况,移动次数还是O(n),所以不适合要求

 

D,哈希法,通过哈希函数将值转化成存放该值的目标地址~~这种查找的性能是O(1),对于其动态变化要求,可以进行再次散列,时间复杂度是O(1)

28.  对序列(12,18,22,38,39,49,79,89)进行排序,最不适合的算法是()快速排序

注意注意!!! 快排不适合对基本有序的数据集合进行排序

29.  已知一段文本有1382个字符,使用了1382个字节存储,这段文本全部是由a、b、c、d、e字符组成,a 354次,b 483次,c 227次,d 96次,e 222次,对这5个字符使用哈夫曼编码。则以下说法正确的是? ACD (哈夫曼编码就是构建哈夫曼树)

A. 使用哈夫曼编码后,使用编码值来存储这段文本将花费最少的存储空间、
B. 使用哈夫曼编码后,a b c d e 这5个字符对应的编码值是唯一确定的(错误。不唯一。

对于哈夫曼树的最小权值的两个结点,位置可以互换,从而编码换了,但是编码的效率不变。做题一定要学会举一反三

C. 使用哈夫曼编码后,a b c d e 这5个字符对应的编码值可以有多套,但每个字符的编码位数是确定的

D. b这个字符的编码位数最短,d这个字符的哈夫曼编码位数应该最长

解释:哈夫曼编码的基本思想就是,给使用频度较高的字符编以较短的编码,这同时也是数据压缩技术的最基本思想。数据压缩,顾名思义,不光在时间上压缩,空间利用率上也压缩了

30.  下面哪些使用的是贪心算法 ABC

A. 单源最短路径中的Dijkstra算法
B. 最小生成树的Prim算法
C. 最小生成树的Kruskal算法
D. 计算每对顶点最短路径的Floyd-Warshall算法
E. 字符串匹配中的KMP算法

解释:贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。
A.单源最短路径中的Dijkstra算法:Dijkstra提出按各顶点与源点v间的路径长度的递增次序,生成到各顶点的最短路径的算法。既先求出长度最短的一条最短路径,再参照它求出长度次短的一条最短路径,依次类推,直到从源点v 到其它各顶点的最短路径全部求出为止。

B.最小生成树的Prim算法:Prim算法基于贪心算法设计,其从一个顶点出发,选择这个顶点发出的边中权重最小的一条加入最小生成树中,然后又从当前的树中的所有顶点发出的边中选出权重最小的一条加入树中,以此类推,直到所有顶点都在树中,算法结束。
C.最小生成树的Kruskal算法按照权值从小到大的顺序选择n-1条边,并保证这n-1条边不构成回路。

DE使用动态规划!!!

另外:

单源最短路径中的Dijkstra算法 每次都会选取当前距离最小的点,并且固定住当前距离为源点到这个点的最短距离,然后去更新邻居。 B 每次选取 到当前span tree 各个节点距离最小的一个点,添加到span tree 节点里面 C 每次选取一个长度最小,且不会造成回路的边,添加到span tree里面

 

 

 
 

1.  算法的时间复杂度与(   算法本身)有关。

2.  在用邻接表表示图时,拓扑排序算法时间复杂度为() o(n+e)

3. 下列有关图的说法错误的是()C

在有向图中,出度为0的结点称为叶子
用邻接矩阵表示图,容易判断任意两个结点之间是否有边相连,并求得各结点的度
按深度方向遍历图和前序遍历树类似,得到的结果是唯一的
若有向图G中从结点Vi到结点Vj有一条路径,则在图G的结点的线性序列中结点Vi,必在结点Vj之前的话,则称为一个拓扑序列

4. 有字符序列(Q,H,C,Y,P,A,M,N,R,D,F,X),新序列(M,H,C,D,F,A,Q,N,R,Y,P,X)是下列()排序算法一趟扫描结果。A

希尔排序
快速排序
堆排序
冒泡排序

 

 

 

     

.

 

 

 

 

 

 

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值