复杂度分析
进入正题:复杂度分析
例如:求 1,2,3…n 的累加和
代码:
1 int count(int n){ 2 int sum = 0; //1ms 3 int i = 1; //1ms 4 for(; i < n;i++){ //n ms 5 sum += sum+i; //n ms 6 } 7 return sum; 8 }
为方便估计,这里假设CPU每行代码执行时间都一样 为1ms ,总的执行时间为T(n) , 代码标注时间可获悉:T(n) = 1+1+n+n = 2n+2,
上点难度:
1 int count(int n){ 2 int sum = 0; //1ms 3 int i = 1; //1ms 4 int j = 1; //1ms 5 for(; i < n;i++){ //n ms 6 j = 1; //n ms 7 for(;j<n;j++){ //n ms 8 sum = sum + i*j; //n ms 9 } 10 } 11 }
这段代码总执行时间::T(n) = 1+1+1+2n + 2n^2 = 2n^2+2n+3 ,
可见,似乎T(n) 和 每行代码执行次数n 成正相关关系(书面语称n叫规模),那好像存在着量级(阶)的关系,于是乎,大笔一挥,
以为老人大胆的画了个圈(O),从此诞生了时间复杂度的表示法:

所以,第一个例子中的 T(n) = O(2n+2),第二个例子 的T(n) = O(2n^2+2n+3) 。
当 n 很大时,抓大放小,于是最终 :T(n) = O(n); T(n) = O(n2) 就是时间复杂度表示法
哎??? 有没有发现 大O表示法取决于循环次数最多的代码。。于是我们得到启发或者技巧:
在分析一个算法、一段代码的时间复杂度的时候,也只关注循环执行次数最多的那段代码就行。
二、常见时间复杂度量级:
那么他们在代码中如何体现的,且看下文。。。
浙公网安备 33010602011771号