首先在竞赛中,计算机1s能执行5*10^8,这也就是说我们所能执行的计算次数在10的8次方以内,超出范围就容易TLE,因此在算法竞赛中我们需要计算出题目范围所给的时间复杂度,排除超出范围的算法,下面先简单计算各个量级的时间复杂度。
(1)O(n)的算法能解决的范围在n<=10^8(KMP字符串查找法,欧拉筛)
(2)O(nlogn)的算法能解决的范围在n<=10^6(线段树)
(3)O(n根号n)的算法能解决的范围在n<=10^5(二层循环,其中一层循环变量呈倍数关系)
(4)O(n^2)的算法能解决的范围在n<=5000(二层for循环,dp)
(5)O(n^3)的算法能解决的范围在n<=300(Floyd用来求多源最短路)
(6)O(2^n)的算法能解决的范围在n<=25(二进制枚举)
(7)O(n!)的算法能解决的范围在n<=11(枚举排列)
时间复杂度大小比较:O(1)<O(log2n)<O(n)<O(nlog2n)<O(n^2)<O(n^3)<......<O(n!)
例题分析:O(n)
for(int i=0;i<n;++i)
第一步:列出t以及每轮i的变化值
i 0 1 2 3 4
t 0 1 2 3 4
第二步:找到t与i的关系 t=i
第三步:确定循环的终止条件 i=n
第四步:联立上述两个方程 t=n
所以它的时间复杂度就为O(n)
二层for循环同理,假设i和j都小于n,那么t=n*n,时间复杂度就为O(n^2)
例题分析:log2n
i=n*n;
while(i!=1)
i/=2;
第一步: i n*n n*n/2 n*n/4 n*n/8
t 0 1 2 3
第二步:i=n*n/2^t
第三步:i=1
第四步: n*n/2^t=1 n^2=2^t即t=2log2n
所以它的时间复杂度就为O(log2n)
以上,就是对算法的时间复杂度基础的分析。