算法基础知识【3】(8-11)

Date: 2019-08-11

1.  算法的空间复杂度是指()。算法空间复杂度指的是算法 执行过程中需要占用多少内存空间资源

回顾:算法的时间复杂度

2.  在索引顺序表中,实现分块查找,在等概率查找情况下,其平均查找长度不仅与表中元素个数有关,而且与每块中元素个数有关。() 正确

解释:在分块查找过程中,先对块间进行顺序查找,然后对每个块内进行查找(有时采用二分查找)

3.  下列排序算法中,已基本有序却反而变得更复杂的排序算法是:( )。 快速排序算法

快排算法实质上是分治算法的应用:

  1. 快排采用分治的思想,第一次循环结束时,它实际上会产生一个轴,轴左边的都小于轴值,右边的都大于轴值,这样通过轴就分成了两个子序列,再对两个子序列递归快排,最终得到排好序的序列。
  2. 快排对越混乱的数据,排序效果越好,现在说一下为什么对一个基本有序的却更复杂,那是因为这样会导致每次轴划分出的两个子序列,一个趋近于1的数量级,一个趋近于n数量级,那么递归快排就近似总是对n做排序,时间复杂度O(n²),而且非常不符合快排的思想。比较好的情况是每次递归大致平分成两个n/2数量级的子序列,时间复杂度O(nlogn)

4.  需要借助于一个队列来实现DFS算法()   错误

解释:

DFS是图的深度优先遍历算法。

例如,图中A节点与B,C节点相连,B节点与D节点相连。从图的顶底A开始,依次访问B,D,C就是图的深度优先遍历。在访问节点D的时候需要保持B的兄弟节点C,需要用到栈;   

即:DFS 深度优先遍历,是先进后出的思想,需要用到栈这一种数据结构! 例如:回溯法便是典型的DFS算法,成为扩展节点的节点可以再次成为活节点。

同理:BFS广度优先遍历,是先进先出的思想,需要用到队列这一中数据结构! 例如:分支界限法便是典型的BFS算法,成为扩展节点的节点不可以再次成为活节点了。

5.  下面的哪个序列可能是二叉搜索树中序遍历的结果?  B

73 8 2 9 4 11
2 3 4 7 8 9 11
11 2 9 3 8 4 7

解释:因为二叉搜索树(Binary Search Tree)满足:针对所有的节点,若有孩子节点,都有:左孩子的值要小于该节点,而右孩子的值都要大于该节点。如果进行中序遍历(左中右),则返回的结果就是一个非递减的序列

6.  在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是()  比较:基数+选择

7.  假设线性表的长度为n,则在最坏情况下,冒泡排序需要的比较次数为多少次?   (n*(n-1)/2)~O(n^2)

8.  在图采用邻接表存储时,求最小生成树的Prim算法的时间复杂度为()  O(n+e)

9.  利用如下递归算法进行x(x(8))的计算时,需要进行多少次的调用x(n)?    18次

int x(int n)
{
 if(n<=3)
     return 1;
 else
     return x(n-2)+x(n-4)+1;
}

解释: 

x(8)=x(6)+x(4)+1  递归计算x(8)第一次调用

x(6)=x(4)+x(2)+1  递归计算x(6)第二次调用

x(4)= x(2)+x(0)+1  递归计算x(4)第三次调用

x(4)= x(2)+x(0)+1   递归计算x(4)第四次调用

之后再调用x()计算黑体部分的结果(5次,加上前面4次,一共9次),最后x(8)返回值为9

 

接着计算x(9)

x(9)=x(7)+x(5)+1  递归计算x(9)第一次调用

x(7)=x(5)+x(3)+1  递归计算x(7)第二次调用

x(5)=x(3)+x(1)+1  递归计算x(5)第三次调用

x(5)=x(3)+x(1)+1  递归计算x(5)第四次调用

之后再调用x()计算黑体部分的结果(5次,加上前面4次,一共9次),最后x(8)返回值为9

 

所以总共调用x()的次数是9+9=18

10.  如果把传输速率定义为单位时间内传送的信息量(以字节计算)多少。关于一下几种典型的数据传输速率:
1.使用USB2.0闪存盘,往USB闪存盘上拷贝文件的数据传输速率
2.使用100M以太网,在局域网内拷贝大文件时网络上的数据传输速率
3.使用一辆卡车拉1000块单块1TB装满数据的硬盘,以100km/h的速度从上海到天津(100km)一趟所等价的数据传输带宽
4.使用电脑播放MP3,电脑的PCI总线到声卡的数据传输速率
在通常情况下,关于这几个传输速率的排序正确的是()      4<1<2<3  【记住吧】

补充常识:

普通U盘写数据的6MB/s,即48Mbps;

100M以太网的速率就是100Mbps;

卡车拉硬盘,1000x1000x8/3600=2222Mbps,这个应该是最快的;

MP3在256kbps码率下也平均只有1分钟2MB,所以不会超过0.3Mbps。

part two:

1.  下面程序段的时间复杂度: O(n^2)

k=1; 
for(i=0;i<n;i++) 
for(j=0;j<n;j++) 
A[i][j]=k++;

2.   排序算法中的比较次数与初始元素序列的排列无关()     错误,,这样的说法太笼统了。选择+基数的比较次数确实与初始序列无关;但是其他排序算法是有关的,尤其是快排 【目前公认的快排是针对混乱序列进行排序的最快排序算法】

3.  对线性表进行折半查找时,要求线性表必须以链式方式存储,且结点按关键字有序排列,这样的说法正确吗?  错误

解释:对线性表进行折半查找,也称作二分查找,需要用到索引,所以需要是顺序存储的线性表,又因为二分法,所以有序。

牛客上的他人的解释:【注意:顺序存储不一定是有序存储】

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。

 

为什么采取顺序存储结构:折半查找需要先对查找的数据集合排序,并且每次要获得数据列表的中间位置,通过数组这种顺序存储结构,只要一次索引就能获得中间值,如果是链式结构,就每次都要从头遍历到中间位置,耗费大量时间。

为什么有序:没有序折半还有什么意义?

4.   若用起泡排序方法对序列{10,14,26,29,41,52}从大到小排序,需进行(15)次比较  O(n*(n-1)/2)

解释:发现本身是一个升序排列的序列,但要将其写成降序排列,即现在是逆序的情况,则利用冒泡需要O(n*(n-1)/2)次比较。

5. 若需在O(nlogn)的时间内完成对数组的排序,且要求排序是稳定的,则可选择的排序方法是()

解释:稳定排序算法有:冒泡+归并+插入+基数,其中时间复杂度为O(logn)的有:归并排序

6.  设一组初始记录关键字序列(5,2,6,3,8),以第一个记录关键字5为基准进行一趟快速排序的结果为() 3,2,5,6,8

上图来源牛客

7.  京东商城plus会员的消费记录金额分别为900,512,613,700,810,若采用选择排序算法对其进行从小到大的排序,第三趟排序结果为:()   512613700900810

解释: 从小到大的选择排序算法,每次需要选择最小的元素放在第一位 第二位 等

8.  设散列表的长度为10,散列函数H(n)=n mod 7,初始关键字序列为 (33,24,8,17,21,10),用链地址法作为解决冲突的方法,平均查找长度是()  1.5  【注意这里的平均查找长度的计算方法:是每一个数字的计算次数之和除以整个数组的长度】

解释:

33/7=5, 查找33需要1次;

24/7=3,查找24需要1次;

8/7=1,查找8需要1次;

17/7=3,查找17需要2次;

21/7=0,查找21需要1次;

10/7=3,查找10需要3次;

ASL=每个关键字查找的次数之和/关键字的个数=(1+1+1+2+3+1)/6=1.5

9.  排序算法中,比较次数与初始序列无关的排序方法有哪些?  选择排序 + 基数排序

算法复杂度与初始序列的状态无关的有(最坏、最好、平均情况下时间复杂度相同):一堆(堆)乌龟(归)选(选)基(基)友

比较次数与初始状态无关的有: 选择+ 基数

总移动次数与初始状态无关的有::归并+基数

10.  以下哪种操作更适合使用排序处理(   )   C

A. 找最大,最小值  (最大值或最小值可以通过一次遍历得到。)
B. 找出现次数最多的值  (可以参考计数排序的思路,用一个数组记录次数。只需一次遍历。)
C. 找中间值   (只有排序后中间下标的值才是中间值。)
D. 求算术平均值  (一次遍历就可以直接计算。)

11.   对长度为n的线性表排序,在最坏情况下,比较次数不是n(n-1)/2的排序方法是(  )。D

A. 快速排序 (逆序情况下,退化为冒泡排序的比较次数)
B. 冒泡排序  (逆序情况下)
C. 直接插入排序  (逆序)
D. 堆排序 (三种情况下的时间复杂度相同,都为O(logn))

12.  具有12个关键字的有序表,折半查找的平均查找长度()   3~4之间的数字,具体而言是log12(直接考虑时间复杂度)

更一般的解释:12个关键字的有序表,折半查找的判定树如下:
         6               (1*1)次      第一层 1个元素 1次
        /  \ 
       3   9            (2*2)次     第二层 2个元素 2次
      / \   / \
     1 4 7 11         (3*4)次    第三层 4个元素 3次
      \  \  \    / \
      2 5 8 10 12   (4*5)次     第四层 5个元素 4次

平均查找长度=1/12*(1*1+2*2+3*4+4*5)=37/12

13.  将两个各有n个元素的有序表归并成一个有序表,最少的比较次数是() n  最多比较次数为2n-1

解释: 把前一个表A中的第一个值与后一个表B相比较,发现最小的值比B的最大的值都要大,所以第一个回答中的次数其实不是1次,而是N次,因为你没办法直接访问到最后一个元素 ;而最多的情况是;两个序列的元素的大小是交错的。

14. 下面程序段的时间复杂度是:O(n^(1/2))

 

解释:由题意k=1+2+3+...+i >n,当执行第i次后,条件不成立才会结束。执行的次数为i,所以i(i+1)/2>n的,省略常数项和低阶项,则i约为n^(1/2)

15.  下列哪个算法是对一个list排序的最快方法?  快速排序

16. 已知数组元素基本有序的情况下,下面采用那个算法对数组排序时间复杂度最低(D)   插入或者冒泡

A. 直接选择排序(不变:O(n^2))
B. 堆排序  (不变:O(logn))
C. 快速排序  (基本有序,则最坏时间复杂度:O(n^2))
D. 插入排序   (O(n))

17.  在二叉排序树(二叉搜索树)中,最小值结点的( )。  左孩子一定为空指针

解释:根据二叉树的性质:节点的左孩子的值小于该节点的值,而右孩子的值大于该节点的值。

18.  快速排序是基于比较的排序算法中平均性能最好的一种排序。( )  正确

补充解释: 快速排序是在比较排序中平均性能最好的,但还有线性时间排序啊,比如:基数排序,计数排序,桶排序

19.  时间复杂度不受数据初始状态影响而恒为O(nlog2n)的是()。  归并+堆排序

20.以下是什么排序算法的应用:A

对数列 (25,84,21,47,15,27,68,35,20) 进行排序,元素序列的变化情况如下:

(1)25,84,21,47,15,27,68,35,20

(2)20,15,21,25,47,27,68,35,84

(3)15,20,21,25,35,27,47,68,84

(4)15,20,21,25,27,35,47,68,84

A. 快速排序
B. 简单选择排序
C. 希尔排序
D. 归并排序

解释:

从(1)到(2):取第一个数25,放到它应该在的位置,25左边的数都比25小,右边的都比25大;

从(2)到(3):对25左边的数列和25右边的数列{20,15,21},{47,27,68,35,84}分别进行快速排序,同样先取各数列的第一个数20和47,使其分别放到应该在的位置,即左边的数都比它小,右边的都比它大;

从(3)到(4):对{15},{21},{35,27},{68,84}四个子序列进行排序,最终排序完成;

从整个过程分析,是一个快速排序的过程。

21. 有一组数据(15,9,7,8,20,-1,7,4),用堆排序的筛选方法降序排序建立的初始堆为()  C

A. -1,4,8,9,20,7,15,7
B. -1,7,15,7,4,8,20,9
C. -1,4,15,9,20,7,7,8

解释: 

堆排序要先建立一个初始堆,这里是小顶堆,根据堆的定义

有父节点 <= 子节点,即 a[k]<=a[2k]  a[k]<=a[2k+1]

代入,只有 C符合

22. 循环队列存储在数组A[0..m]中,则入队时的操作为()   rear=(rear+1)mod(m+1)  注意:[0,m]有m+1个元素

23. 用常规的非递归方法遍历一个平衡二叉树,所需的时间复杂度和空间复杂度是?() O(n),O(n)

解释:树的深度最坏情况下为n,所以空间复杂度为O(n)。  遍历一次,访问一遍所有节点,并做记录,空间和时间复杂度一样

24.  

以下函数的时间复杂度和空间复杂度为()  T(n)=O(2^n), S(n)= O(n)

解释:

每个节点都会分裂为两个子节点,因此树高为n。

每次执行需要访问f(n-1)和f(n-2),2次;程序共执行n次。时间复杂度为O(2^n)

空间复杂度为递归深度,即为树高O(n),每次都要return一个值,需要占用一个存储空间

25.  以下关于算法特性的描述中, (  2  ) 是正确的。
( 1 )算法至少有一个输入和一个输出
( 2 )算法至少有一个输出但是可以没有输入
( 3 )算法可以永远运行下去

补充解释: 

”算法的五大特性:

1.有穷性;算法必须在执行有限次之后停止;

2.确切性,算法的每一步必须有确切的意义;

3.输入项:0项或多项;

4.输出项:至少一项,没有输出的算法是没有意义的;

5.可行性。

26.  已知广义表: A=(a,b), B=(A,A), C=(a,(b,A),B), 求下列运算的结果:   tail(head(tail(C))) =(  )  (A)

解释:

head() 返回列表的第一个元素;head返回的是元素(去掉最外层括号)

tail() 返回列表的删去第一个元素之后的剩余列表;tail返回的是集合(保留括号)

所以,

tail(C)=((b,A),B);

head(tail(C))=head(   ((b,A),B)   )=(b,A)

tail(head(tail(C)))=tail((b,A))=(A)

27.  分支限界法与回溯法都是在问题的解空间树T上搜索问题的解,关于二者说法中正确的是()  求解目标不同,搜素方式也不同

区分回溯法与分支界限法:

  • 回溯法
    1)(求解目标)回溯法的求解目标是找出解空间中满足约束条件的一个解或所有解。
    2)(搜索方式:深度优先)回溯法会搜索整个解空间,当不满条件时,丢弃,继续搜索下一个儿子结点,如果所有儿子结点都不满足,向上回溯到它的父节点。
  • 分支限界法
    1)(求解目标)分支限界法的目标一般是在满足约束条件的解中找出在某种意义下的最优解,也有找出满足约束条件的一个解。
    2)(搜索方式:广度优先)分支限界法以广度优先或以最小损耗优先的方式搜索解空间。

28.  在含有10个结点的二叉排序树上,查找关键字为20的结点,则依次比较的关键字有可能是( ) ABCD

A. 25,10,15,20
B. 25,10,15,18,20
C. 10,30,20
D. 10,30,25,20

解释:A:首先根节点为25,20比25小搜索其左子树,找到10比25小不矛盾,20比10大搜索其右子树,找到15比10大不矛盾,20比15大搜索其右子树找到20,正确 B:首先根节点25,20比25小搜索其左子树,找到10比25小不矛盾,20比10大搜索其右子树,找到15比10大不矛盾, 20比15大搜索其右子树,找到18比15大不矛盾, 20比18大搜索其右子树,找到20,正确 C:首先根节点为10,20比10大搜索其右子树,找到30比10大不矛盾,20比30小搜索其左子树,找到20,正确 D:首先根节点为10, 20比10大搜索其右子树,找到30比10大不矛盾,20比30小搜索其左子树,找到25比30小不矛盾,20比25小搜索其左子树找到20,正确

29.  区分一个算法时,主要看它具有()等特点  AC

A. 可行性
B. 至少有一个输入量
C. 确定性  (确定性是算法的分类方法,)
D. 健壮性  (健壮性是算法的评定方式。)

解释:

算法的特性:输入输出、有穷性、确定性、可执行性

设计需要:正确性、底耦合高效率低存储、可读性、健壮性

具体定义:
算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制。也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出。如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题。不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。
一个算法应该具有以下五个重要的特征:
1.有穷性(Finiteness)
算法的有穷性是指算法必须能在执行有限个步骤之后终止;
2.确切性(Definiteness)
算法的每一步骤必须有确切的定义;
3.输入项(Input)
一个算法有0个或多个输入,以刻画运算对象的初始情况,所谓0个输入是指算法本身定出了初始条件;
4.输出项(Output)
一个算法有一个或多个输出,以反映对输入数据加工后的结果。没有输出的算法是毫无意义的;
5.可行性(Effectiveness)
算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步,即每个计算步都可以在有限时间内完成(也称之为有效性)。

part  three 

1. 程序一定是算法()  错误,程序 = 算法+数据结构

算法的5个特性:有限性+确定性+输入+输出+可行性

2. 折半查找算法的算法复杂度是多少?  O(logn)

3.  下列程序对x的赋值语句频度是()? O(n^2)

for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
        x+=1;

4.  二分查找的时间复杂度( )O(log(N))

5.  有一个有序表位{1,3,9,12,32,41,45,62,75,77,82,95,99},当采用二分查找法查找关键字为82的元素时,(4)次比较后查找成功。

注意:再具体使用二分查找算法进行查找时,,当比较的mid元素和target不同是,要么左移一位,要么右移一位!

分析如下:

  1. len = 13, low = 0, high = 12, mid = (0 + 12) >>> 1 = 6, 45 < target = 82。
  2. low = mid + 1, low => 7, high = 12, mid = (low + high) >>> 1 = 9, 77 < target = 82。
  3. low = mid + 1, low => 10, high = 12, mid = (low + high) >>> 1 = 11, 95 > target = 82。
  4. high = mid - 1 = 10, mid = (low + high) >>> 1 = 10, find 82。

6.  冒泡排序算法在非有序的序列中时间复杂度是?( ) O(N^2)

7.  算法的时间复杂度取决于 ( )  C

A. 问题的规模
B. 待处理数据的初态
C. A和B

解释: 问题规模是指算法复杂程度,n级别,logn级别,n平方级别。初态指的就是初始数据是如何的。例如在排序算法中的初始序列是否有序这种信息?会对算法的时间复杂度产生一定的影响程度!

8.   对一个无向图进行先深搜索时,得到的先深序列是唯一的()  不唯一的;起点、以及这个无向图的存储结构都会导致先深搜索序列不同

即:DFS ,先进后出,使用栈实现,例如回溯法,可以再次称为活节点,不唯一

       BFS,先进先出,使用队列实现,例如分支界限法,不可以再次称为活节点,不唯一

9.  已知一个有序表为(12,18,24,35,47,50,62,83,90,115,134),当折半查找值为90的元素时,经过()次比较后查找成功。  2次

10. 一个排序算法的时间复杂度与()有关    所需比较关键字的次数

解释;排序过程就是进行比较和交换过程,而时间复杂度就与比较和交换的次数相关

11.  下列序排算法中最坏复杂度不是n(n-1)/2的是? D 堆排序算法三种情况下的时间复杂度都是O(nlogn)

A. 快速排序
B. 冒泡排序
C. 直接插入排序
D.堆排序

12. 【思考】对于关键字序列(16,10,20,12,18,7,14,13,5,19),不可能构成其二叉排序树中一条查找路径的序列是(    C )

A. 16,10,7,5
B. 16,20,18,19
C. 16,10,7,12,14
D. 16,10,12,14

分析:要构成一条二叉排序树的一条查找路径:前面的节点,或者比后面的节点都大,或者比后面的节点都小。C选项 中

10>7 ,但是10<12,14  所以C不可能构成其二叉排序树中一条查找路径的序列

13.  下列算法段中,时间复杂度为()   O(n^3)   三层循环,每层最多都是n,所以一共的时间复杂度为n^3

for(i=1;i<=n;i++)
{
    for(j=1;j<=i;j++)
    {
        x=0;
        for(k=1;k<=n;k++)
            x+=a*b;
    }
}

14.  设被排序的结点序列共有N个结点,在该序列中的结点已十分接近排序的情况下,用直接插入法,归并法和一般的快速排序法对其排序,这些算法的时间复杂性为()    O(N),O(N*log2N),O(N2)

15.  下列说法中错误的是:() C

A. 插入排序某些情况下复杂度为O(n)  (有序情况下)
B. 排序二叉树元素查找的复杂度可能为O(n)  (只有右孩子结点的树 )
C. 对于有序列表的排序最快的是快速排序    (快排是在无序的情况下排序比较快)
D. 在有序列表中通过二分查找的复杂度一定是O(log2n)

16.  幼儿园老师挑一组同样花色的扑克牌,让小朋友按牌面数字大小排成一列,小朋友依次从左到右找到合适位置放入扑克牌、这种方法类似以下哪种算法() D

快速排序
冒泡排序
归并排序
插入排序

解释:

1.快速排序:

思想:1.在待排序的元素任取一个元素作为基准(通常选第一个元素,但最的选择方法是从待排序元素中随机选取一个作为基准),称为基准元素;

       2.将待排序的元素进行分区,比基准元素大的元素放在它的右边,比其小的放在它的左边;

       3.对左右两个分区重复以上步骤直到所有元素都是有序的

 

2.冒泡排序:

1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3.针对所有的元素重复以上的步骤,除了最后一个。

4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

 

3.归并排序:

第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置

第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针超出序列尾

将另一序列剩下的所有元素直接复制到合并序列尾

 

4.插入排序:

⒈从有序数列和无序数列{a2,a3,…,an}开始进行排序;

⒉处理第i个元素时(i=2,3,…,n),数列{a1,a2,…,ai-1}是已有序的,而数列{ai,ai+1,…,an}是无序的。用ai与ai-1,a i-2,…,a1进行比较,找出合适的位置将ai插入;

⒊重复第二步,共进行n-i次插入处理,数列全部有序。

17.  下面程序的结果是:8

#include 
int main() {
    int a, b;
    for (a = 1, b = 1; a <= 100; a++) { if (b >= 20)
            break;
        if (b % 3 == 1) {
            b += 3;
            continue;
        }
        b -= 5;
    }
    printf("%d\n", a);
    return 0;
}

解释: 

a2345678
b471013161922

18.  希尔排序的组内排序采用的是 。直接插入排序,上面的图;希尔排序是对直接插入排序算法的改进!

补充:希尔排序的思想是:先将待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成),分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。

19. 若一组记录的排序码为(5 9 , 46, 79, 38, 40, 84),则利用堆排序方法建立的初始大顶堆为()。  84, 46, 79, 38, 40, 59

 

图片来自牛客

20.  希尔排序每的最后一趟排序的地址增量一定是(      )。  1

补充:增量gap=length/2,缩小增量继续以gap = gap/2的方式,这种增量选择我们可以用一个序列来表示,{n/2,(n/2)/2...1},称为增量序列

21.  对递归程序的优化的一般的手段为()   尾递归优化方法

解释;尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。 尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。 遗憾的是,大多数编程语言没有针对尾递归做优化,

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

23.  下列选项给出的是从根分别到达两个叶结点路径上的权值序列,能属于同一棵哈夫曼树的是 。 D(该题直接每个选项分析)

A. 24,10,5和24,10,7
B. 24,10,5和24,12,
C. 24,10,10和24,14,11
D. 24,10,5和24,14,6

解释:

AB选项都存在父节点不等于字节点和的问题。 c选项,14下面除了11,还有3,但这个3不可能跟11在一起,因为哈夫曼树构造的过程是选取两个最小权值节点相加的

24.  拓扑排序算法把一个无向图中的顶点排成一个有序序列。( )  错误,有向无环图才可以进行拓扑排序,而且可用作检测是否有环!

25. 在排序算法中每一项都与其他各项进行比较,计算出小于该项的项的个数,以确定该项的位置叫()  枚举排序

解释:  枚举排序,通常也被叫做秩排序,算法基本思想是:对每一个要排序的元素,统计小于它的所有元素的个数,从而得到该元素在整个序列中的位置,时间复杂度为O(n^2)

26.  两分法插入排序所需比较次数与待排序记录的初始排列状态相关()  错误

解释:该题有点坑,二分插入法的重点不在二分法,而是插入法。二分的体现在于:在前面已经排好序的部分,查找合适的位置进行放置元素时,采用二分的方法。但是无论怎样查找都是基于前面已经排好序的。

27.  某地电信局要对业务号码进行梳理,需要检测开通的市话号码是否存在某一个是另一个的前缀的情况,以简化电话交换机的逻辑。例如:某用户号码是“11001100”,但与"110"报警电话产生前缀配对。已知市话号码最长8位,最短3位,并且所有3位的电话号码都以1开头。由于市话号码众多,长度也未必一直,高效的算法可以用O(n)的时间复杂度完成检测(n为开通市话号码个数,数量是千万级的)。那么,该算法最坏情况下需要耗费大约________内存空间。  50MB

解释:  

最长 8 位, 最短 3 共6种情况:

  • 三位都是 1 开头 ,因此有 10^2=100 种
  • 四位: 10^4=10,000 种
  • 五位: 10^5=100,000 种
  • 六位: 10^6=1,000,000 种
  • 七位: 10^7=10,000,000 种
  • 八位: 10^8=100,000,000种

相加一共为111,110,100种,因为电话号码唯一,所有号码最后1位不用判断,总数除以10  = 11,111,010种

 一位号码  4bit(号码 从  0-9  ,所以至少用  个  bit 位才能表示 ),8位的号码占 32bit 即 4字节/byte(其实可以只存前7位,3.5byte)

最后:11,111,010 * 4 / 1024 / 1024 = 42.4 Mb

28.  不稳定算法:选择+希尔+堆排序+快速排序

         稳定算法:冒泡+归并+插入+基数

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值