复杂度学习目的及相关术语
时间复杂度分析
-
实例1:
1~N 累计求和。假设每行代码执行时间是1个unit_time;第 2、3 行代码分别需要 1 个 unit_time 的执行时间,第 4、5 行都运行了 n 遍,所以需要 2n*unit_time 的执行时间,所以这段代码总的执行时间就是 (2n+2)*unit_time。简称 T(n) = O(2n+2) = 0(n)。 -
实例2:
第 2、3、4 行代码,每行都需要 1 个 unit_time 的执行时间,第 5、6 行代码循环执行了 n 遍,需要 2n * unit_time 的执行时间,第 7、8 行代码循环执行了 n2遍,所以需要 2n2 * unit_time 的执行时间。所以,整段代码总的执行时间 T(n) = O(2n^2+2n+3)
-
实例3
从代码中可以看出,变量 i 的值从 1 开始取,每循环一次就乘以 2。当大于 n 时,循环结束。还记得我们高中学过的等比数列吗?实际上,变量 i 的取值就是一个等比数列。如果我把它一个一个列出来,就应该是这个样子的:
所以,我们只要知道 x 值是多少,就知道这行代码执行的次数了。通过 2x=n 求解 x 这个问题我们想高中应该就学过了,我就不多说了。x=log2n,所以,这段代码的时间复杂度就是 O(log2n)。
其他几种复杂度分析
看下面的代码从一个无需的数组array中找到X的位置,找到返回数据下标,找不到返回-1;
// n 表示数组 array 的长度
int find(int[] array, int n, int x) {
int i = 0;
int pos = -1;
for (; i < n; ++i) {
if (array[i] == x) {
pos = i;
break;
}
}
return pos;
}
- 最好情况时间复杂度
顾名思义就是在最理想的情况下,执行这段代码的时间复杂度。那就是正好第一个元素就是要找的数值。最好情况时间复杂度就是O(1). - 最坏情况时间复杂度
顾名思义就是在最糟糕的情况下执行这段代码的时间复杂度。那就是数组中没有查找到要找的数值。最坏情况时间复杂度就是O(n). - 平均情况时间复杂度
要查找的变量 x 在数组中的位置,有 n+1 种情况:在数组0~n-1位置或者不在数组内。我们把每种情况遍历元素的个数累加起来,再除以n+1种情况得到平均复杂度0(n)。
上面的结论虽然正确,但是计算过程有点问题;每种情况出现的概率都不相同,我们加上概率来分析一下。
1、在数组中和不在数组中,是二分之一的概率。
2、在数组中的概率是n分之一。
总的概率就是2n分之一。
引入概率之后就是下面的计算结果。平均时间复杂度是0(n).
- 均摊时间复杂度
参考文章http://www.cnblogs.com/hardyyao/p/9744427.html