举个例子
1 //求1-n这个数的和
2 int cal(n){
3 int sum = 0 ;
4 int i = 1 ;
5 for (;i<=n;i++){
6 sum = sum+i;
7 }
8 return sum;
9 }
在上面这个例子中,第 3 ,第 4 ,代码都执行了一次,他们执行的时间我们定义为一个unit_time,
这样的话,第 3 ,第 4 行代码就是执行了2*unit_time。那么第 5 和第 6 行代码则各执行了n次。
所以这段代码一共执行了嗯(2n+2)*unit_time时间。所以代码执行时间和带行执行次数成正比。
再来看一段代码
1 int cal(n){
2 int sum = 0 ;
3 int i = 1 ;
4 int j = 1 ;
5 for (;i<=n;i++){
6 j = 1 ;
7 for (;j<=n){
8 sum = sum + i*j;
9 }
10 }
11 return sum;
12 }
这段代码的执行时间我们可以来算下。
2 , 3 , 4 行代码的时间共为3unit_time,
5 , 6 行的代码执行时间为2nunit_time,
7 , 8 行的代码执行时间为2n²*unit_time,
所以总的执行时间为(2n²+2n+3)*unit_time.
可以总结为一个公式
T(n) = O(f(n));
T(n)为所有代码执行时间。
n表示为数据规模的大小。
f(n)为每行代码的执行总和。
公式重的O表示代码执行时间T(n)与f(n)成正比。
在看上面两端代码可以表示成
T(n) = O(2n+2);
T(n) = O(2n²+2n+3);
大O时间复杂度并不真正表示代码的执行时间,而是代码执行时间随代码规模增⻓的变化趋势。
所以叫作渐进时间复杂度,简称时间复杂度。
当n变成 10000 , 100000 时,公式重的低阶,常量,系数都不在左右增⻓趋势,这些都可以忽
略,所以我们留下最大量级。所以上面的两个表达式可以简化为