算法时间复杂度的计算
2016-12-28 10:25
183 查看
在这篇文章中,我们用简单的循环程序进行分析讨论时间复杂度。
1) O(1)
一个函数调用或是一组语句都认为是O(1)的复杂度(如果没有调用不包含循环,递归或其他非常量复杂度的函数)。
例如函数 swap()是 O(1)的时间复杂度. 如果循环的次数是一个常量,则也认为是 O(1)
2) O(n)
如果在一个大小为n循环中,循环变量按照一个常量C递增或递减,这个循环的复杂度就为O(n).
3) O(nc)
嵌套循环的时间复杂度等于行最内层语句执行的次数。例如,下面的示例循环具有为O(n 2)的时间复杂度
例如选择排序和插入排序具有为O(n 2)的时间复杂度。
4) O(Log n)
如果在一个大小为n循环中,循环变量按照一个常量C的进行倍数的递增或递减,这个循环的复杂度就为O(Logn).
5) O(Log Log n)
如果在一个大小为n循环中,循环变量是指数级的递增或递减,这个循环的复杂度就为O(Log log n).
如何计算连续循环的复杂性?
当有连续的循环,我们计算时间复杂度为时间各个循环的复杂总和。
如果循环中有许多if …else [b]如何计算时间复杂度?[/b]
一般情况我们只考虑最快情况下的复杂度。例如考虑线性搜索函数,我们只考虑元素出现在最后或没有该元素。
如何计算时间的递归函数的复杂性?
递归函数一般可以写成一个数学递推关系。为了计算时间复杂度,我们必须知道如何解决递归公式,这个问题将在后面讨论。
参考:http://www.geeksforgeeks.org/analysis-of-algorithms-set-4-analysis-of-loops/
1) O(1)
一个函数调用或是一组语句都认为是O(1)的复杂度(如果没有调用不包含循环,递归或其他非常量复杂度的函数)。
1 | // set of non-recursive and non-loop statements |
1 | //这里C为常数 |
2 | for ( int i = 1; i <= n; i += c) { |
3 | //一些 O(1) 的语句 |
4 | } |
5 | for ( int i = n; i > 0; i -= c) { |
6 | //一些 O(1) 的语句 |
7 | } |
如果在一个大小为n循环中,循环变量按照一个常量C递增或递减,这个循环的复杂度就为O(n).
1 | // c是常量 |
2 | for ( int i = 1; i <= n; i += c) { |
3 | // some O(1) expressions |
4 | } |
5 |
6 | for ( int i = n; i > 0; i -= c) { |
7 | // some O(1) expressions |
8 | } |
嵌套循环的时间复杂度等于行最内层语句执行的次数。例如,下面的示例循环具有为O(n 2)的时间复杂度
01 | for ( int i = 1; i <=n; i += c) { |
02 | for ( int j = 1; j <=n; j += c) { |
03 | // some O(1) expressions |
04 | } |
05 | } |
06 |
07 | for ( int i = n; i > 0; i += c) { |
08 | for ( int j = i+1; j <=n; j += c) { |
09 | // some O(1) expressions |
10 | } |
4) O(Log n)
如果在一个大小为n循环中,循环变量按照一个常量C的进行倍数的递增或递减,这个循环的复杂度就为O(Logn).
1 | for ( int i = 1; i <=n; i *= c) { |
2 | // some O(1) expressions |
3 | } |
4 | for ( int i = n; i > 0; i /= c) { |
5 | // some O(1) expressions |
6 | } |
如果在一个大小为n循环中,循环变量是指数级的递增或递减,这个循环的复杂度就为O(Log log n).
1 | // c为比1大的常量 |
2 | for ( int i = 2; i <=n; i = pow (i, c)) { |
3 | // some O(1) expressions |
4 | } |
5 | //这里的 fun 函数可以是sqrt 或 cuberoot 或任何其他恒定的根 |
6 | for ( int i = n; i > 0; i = fun(i)) { |
7 | // some O(1) expressions |
8 | } |
当有连续的循环,我们计算时间复杂度为时间各个循环的复杂总和。
1 | for ( int i = 1; i <=m; i += c) { |
2 | // some O(1) expressions |
3 | } |
4 | for ( int i = 1; i <=n; i += c) { |
5 | // some O(1) expressions |
6 | } |
7 | 上面的时间复杂度 O(m) + O(n) = O(m+n) |
8 | 如果 m == n 就是 O(2n),也可缩写为 O(n) 常量可以忽略不计 |
一般情况我们只考虑最快情况下的复杂度。例如考虑线性搜索函数,我们只考虑元素出现在最后或没有该元素。
如何计算时间的递归函数的复杂性?
递归函数一般可以写成一个数学递推关系。为了计算时间复杂度,我们必须知道如何解决递归公式,这个问题将在后面讨论。
参考:http://www.geeksforgeeks.org/analysis-of-algorithms-set-4-analysis-of-loops/
相关文章推荐
- 算法的时间复杂度(计算实例)
- 算法的时间复杂度(计算实例)
- 【算法与数据结构】关于代码运行时间复杂度的计算方法
- 第14话:如何计算算法的时间复杂度
- 【算法数据结构Java实现】递归的简单剖析及时间复杂度计算
- 计算一个算法的时间复杂度
- 计算算法时间复杂度的主方法的一种较为简洁的记忆方法
- 【算法导论学习-008】算法时间复杂度的计算
- 《转》算法时间复杂度的计算 [整理]
- 算法时间复杂度的计算 [整理]
- 算法时间复杂度的计算------转
- 计算算法的时间和空间复杂度
- 计算算法时间复杂度的主方法的一种较为简洁的记忆方法
- 算法的时间复杂度(计算实例)
- 算法的时间复杂度(计算实例)
- 算法的时间复杂度(计算实例)
- 算法的时间复杂度计算
- 算法的时间复杂度(计算实例)
- 算法的时间复杂度(计算实例)
- 算法的时间复杂度(计算实例)