Date: 2019-08-12
1. 算法的时间复杂度与空间复杂度没有直接关系
因为:算法的时间复杂度是指执行算法所需要的计算工作量,可以用执行算法过程中所需基本运算的执行次数来度量;算法的空间复杂度是指执行这个算法所需要的内存空间。由此可知,算法的时间复杂度与空间复杂度并不相关
2.冒泡排序算法在非有序的序列中时间复杂度是?() O(n^2),在基本有序的情况下是o(n)
3. 线性表就是顺序存储的表() 错误的说法
解释:线性表可以分为顺序存储结构和链式存储结构,其中顺序存储结构的逻辑顺序和存储顺序是一致的;而链式存储的并不是一致的。
另外:线性结构与非线性结构,主要看元素之间的关系,如果是一对一的关系则是线性表,如果不是一对一的关系则是非线性表。如:树,图。栈和队列就是用线性结构实现的,它本身就是一中种结构。可以把栈和队列归在线性结构中 ,线性表自然是属于线性结构的。
4. 设有序顺序表中有n个数据元素,则利用二分查找法查找数据元素X的最多比较次数不超过()。 一般情况是logn的向上取整,则一般化之后 就是O(logn)+1
5.
用Prim算法求解下图以1为起始点的最小生成树的权值之和(17)依次选择最小的边,往最生成树集中加边,使边数之和等于n-1,且是连通无环,则就构成了最小生成树
6. int main(){fork()||fork();}共创建几个进程:_____ 3个进程
牛客上的解释:
fork()给子进程返回一个零值,而给父进程返回一个非零值;
在main这个主进程中,首先执行 fork() || fork(), 左边的fork()返回一个非零值,根据||的短路原则,前面的表达式为真时,后面的表达式不执行,故包含main的这个主进程创建了一个子进程,
由于子进程会复制父进程,而且子进程会根据其返回值继续执行,就是说,在子进程中, fork() ||fork()这条语句左边表达式的返回值是0, 所以||右边的表达式要执行,这时在子进程中又创建了一个进程,
即main进程->子进程->子进程,一共创建了3个进程。
7. 已知待排序的n个元素可分为n/k个组,每个组包含k个元素,且任一组内的各元素均分别大于前一组内的所有元素和小于后一组内的所有元素,若采用基于比较的排序,其时间下界应为()O(nlogk)
解释:整体的k个组的元素是有序的,只是每个内部元素是无序的,内部元素的排序平均时间复杂度是O(klogk),然后一共有n/k个组,则整合后的时间复杂度是O(nlogk)
8. 假设包含t个非零元素的稀疏矩阵A含有m行n列,并采用三元组顺序表压缩存储,其快速转置算法的时间复杂度为( )
对于系数矩阵的三元组存储方法:首先最原始的时间复杂度是O(m*n),然后改进:基于每一行的初始位置,首先要计算行数,然后进行存储,这种情况需要O(m+n);这里的算法是采用三元组顺序表压缩,转置算法的时间复杂度就是O(n+t)。
具体解释:
快速转置:
1.初始化所有列的非零元素的个数统计为0(n)
2.统计每一列的非零元素个数(t)
3.接着求每一列第一个非零元素的首位置(n)
4.最后对每一个非零个数转置(t)。
总共时间:2*(n+t)
于是,时间复杂度:O(n+t)
9. 排序算法不稳定的有? 冒泡+归并+基数+插入排序法是稳定排序算法。 快速+选择+堆排序+希尔排序时不稳定算法!
part two
1. 下列关于 排序算法中的说法中,错误的有() D
A.在待排序的元素序列基本有序的前提下,效率最高的排序方法是插入排序 (补充:对于改进后的冒泡排序,其也是同样效率)
B. 堆排序的时间复杂度为O(nlogn) (堆排序的时间复杂度与初始状态无关,恒定, 还有的是堆+归并+选择+基数)
C.关键字比较的次数与激励的初始排列次序无关的是冒泡排序 (冒泡是无关的,但是改进后的冒泡排序算法是有关的)
D. 快速排序是一种稳定的排序算法 【错,不稳定,稳定的有:冒,归 ,插,基】
解释:
- 对于选项A,插入排序原理每次从待插入组中取出一个元素,与有序组的元素进行比较,并找到合适的位置,将该元素插到有序组当中。所以有序元素越多,待排序的就相对越少,效率也就最高,所以A正确。
- 对于选项B,堆排序原理将待排序序列构造成一个大顶堆(小顶堆),整个序列的最大值(最小值)就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,重复操作。这种数据结构而设计的一种排序算法,堆排序是一种选择排序,其最坏,最好,平均时间复杂度均为O(nlogn)。所以B正确。
- 对于选项C,冒泡排序原理是相邻元素一次比较,不符条件的就交换位置,每一对相邻元素作同样的工作,所以和初始排序无关,C正确。
- 对于选项D</