VC++ “时间复杂度”需要注意的常见问题

来源:互联网 发布:arrival to earth知乎 编辑:程序博客网 时间:2024/04/24 10:34

1、以下程序运行的调度次数

int n = 10;for (int i = 1; i < n; i++)for (int j = 1; j < n; j = j + n / 2)for (int k = 1; k < n; k = 2 * k)x = x + 1;
时间复杂度:(nlogn)

2、按数量级递增排序,常见的时间复杂度有:

常数阶:O(1)

对数阶:O(log(2)n)

线性阶:O(n)

线性对数阶:O(nlog(2)n)

平方阶:O(n^2)

立方阶:O(n^3)

……

K次方阶:O(n^k)

指数阶:O(2^n)

3、以下哪种节构,平均来讲获取任意一个指定值最快:

A:二叉树序树

B:哈希表

C:栈

D:队列

答案:B

4、辗转相除法的时间复杂度:

欧几里算法,又称为辗转相除法,用于求两个自然数的最大公约数,算法的思想很简单,基于下面的数论等式

gcd(a,b)=gcd(a,a mod b),其时间复杂度为O(logn)

5、算法实现如下的问题:

有20个数组,每个数组里面有500个数,升序排序,求出这10000个数字中最大的500个,同时确定时间复杂度。

算法分析:20个数组的最小元素全部进堆。每次去最小的一个时候,从最小元素对应的数组里取下来一个放到堆里。堆里一直最多有20个数,

充分利用20个数组的有序性。

A:判断20个数组的第一个元素,取出最小的放到堆里面,同时被取出数的数组删除对应的数值,长度减1.

B,判断所有数组元素的个数,是否大于500,若大于则执行A,否则停止并输出所有数组的元素

时间复杂度:500*log(20)


0 0
原创粉丝点击