之前我们讨论了渐进分析,最佳最坏平均情况的分析以及渐进符号。在这一篇中我们分析一下迭代的简单程序。

1. O(1):

如果程序中没有包含任何的循环,递归或者任何的非常数时间的函数,我们就说这个程序的时间复杂度为O(1)。例如简单的swap()函数就是O(1)

   // Here c is a constant
for (int i = ; i <= c; i++) {
// some O(1) expressions
}

这个程序也是O(1)因为C是常数。所以整个程序可以再常数时间内完成。

2.O(n):

如果循环计数器用一个常数来减少或增加。那我们就说这个循环的时间复杂度是O(n)

   // Here c is a positive integer constant
for (int i = ; i <= n; i += c) {
// some O(1) expressions
} for (int i = n; i > ; i -= c) {
// some O(1) expressions
}

(如果C=1,每个for loop要运行n次O(1) expressions)

3.O(nc):

嵌套循环的时间复杂度等于最里面的程序的运行次数。

   for (int i = ; i <=n; i += c) {
for (int j = ; j <=n; j += c) {
// some O(1) expressions
}
} for (int i = n; i > ; i += c) {
for (int j = i+; j <=n; j += c) {
// some O(1) expressions
}

这两个嵌套循环的时间复杂度都是O(n2).选择排序和插入排序的时间复杂度都是O(n2)。

4.O(logN):

如果循环计数器乘以或除以一个常数来减少或增加。那我们就说这个循环的时间复杂度是O(logn)

   for (int i = ; i <=n; i *= c) {
// some O(1) expressions
}
for (int i = n; i > ; i /= c) {
// some O(1) expressions
}

二分查找就是O(logn) 的时间复杂度。

5.O(loglogn)

如果循环计数器用一个指数来减少或增加。那我们就说这个循环的时间复杂度是O(loglogn)

   // Here c is a constant greater than 1
for (int i = ; i <=n; i = pow(i, c)) {
// some O(1) expressions
}
//Here fun is sqrt or cuberoot or any other constant root
for (int i = n; i > ; i = fun(i)) {
// some O(1) expressions
}

如何求一些循环组合的时间复杂度?

当出现一些连续的循环时,我们通过把每一个循环的时间复杂度加到一起来求总体的时间复杂度。

for (int i = ; i <=m; i += c) {
// some O(1) expressions
}
for (int i = ; i <=n; i += c) {
// some O(1) expressions
}
Time complexity of above code is O(m) + O(n) which is O(m+n)
If m == n, the time complexity becomes O(2n) which is O(n).

当循环中有很多if else 的语句时,怎么计算时间复杂度?

我们之前讨论过,最坏的时间复杂度才是最有用的信息。所以我们要考虑最坏的情况,也是就if-else的条件下,最多的语句会执行。例如线性搜索,我们会主要考虑要找的元素在最后一个或者不在数组中。(这样就会执行最多次数的语句)

如果程序有太多的if-else 语句,我们可以通过忽略if - else 语句或者其他的复杂句子来找到上限。

原文链接:

http://www.geeksforgeeks.org/analysis-of-algorithms-set-4-analysis-of-loops/

翻译:

Rui

分析循环 Analysis of Loops-------geeksforgeeks 翻译的更多相关文章

  1. x264源代码简单分析:宏块分析(Analysis)部分-帧间宏块(Inter)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  2. x264源代码简单分析:宏块分析(Analysis)部分-帧内宏块(Intra)

    ===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...

  3. 数据关联分析 association analysis (Aprior算法,python代码)

    1基本概念 购物篮事务(market basket transaction),如下表,表中每一行对应一个事务,包含唯一标识TID,和购买的商品集合.本文介绍一种成为关联分析(association a ...

  4. C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)

    3.空指针(nullptr) 早在 1972 年,C语言诞生的初期,常数0带有常数及空指针的双重身分. C 使用 preprocessor macroNULL 表示空指针, 让 NULL 及 0 分别 ...

  5. Spring IOC 容器源码分析 - 循环依赖的解决办法

    1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...

  6. 生存分析(survival analysis)

    一.生存分析(survival analysis)的定义 生存分析:对一个或多个非负随机变量进行统计推断,研究生存现象和响应时间数据及其统计规律的一门学科. 生存分析:既考虑结果又考虑生存时间的一种统 ...

  7. 平摊分析 Amortized Analysis ------geeksforgeeks翻译

    当偶尔一切操作很花的时间很慢,而大多数操作的时间都很快的时候,平摊分析的方法就很很好用了.在平摊分析中,我们分析一串操作并且可以得到最坏情况下的平均时间复杂度.例如hash table, disjoi ...

  8. 算法最坏,平均和最佳情况(Worst, Average and Best Cases)-------geeksforgeeks 翻译

    最坏,平均和最佳运行时间(Worst, Average and Best Cases) 在上一篇文章中,我们讨论到了渐进分析可以解决分析算法的问题,那么在这一篇中,我们用线性搜索来举例说明一下如何用渐 ...

  9. 算法分析 Analysis of Algorithms -------GeekforGeeker 翻译

    算法分析 Analysis of Algorithms 为什么要做性能分析?Why performance analysis? 在计算机领域有很多重要的因素我们要考虑 比如用户友好度,模块化, 安全性 ...

随机推荐

  1. IOC容器中bean的生命周期

    一.Bean的生命周期 Spring IOC容器可以管理Bean的生命周期,允许在Bean生命周期的特定点执行定制的任务. Spring IOC容器对Bean的生命周期进行管理的过程如下: (1).通 ...

  2. [moka同学笔记]yii表单dropdownlist样式

    <?= $form->field($modelUser,'name') ?> <div class="form-group field-community-mobil ...

  3. 我见过的几门语言中的hello world

    1.Java public class hello { public static void main(String[] args){ System.out.println("hello w ...

  4. HTML5的新特性

    HTML5 中的一些有趣的新特性: 用于绘画的 canvas 元素 用于媒介回放的 video 和 audio 元素 对本地离线存储的更好的支持 新的特殊内容元素,比如 article.footer. ...

  5. Asp.net发布的CheckList

         Asp.net Web 应用程序正式发布前,我们还是做一些检查,所以需要这个CheckList,如下图今天的Asp.net 已演化这样的了:   但不管是什么组件,目前的Web最终还得通过H ...

  6. windbg定位死锁

    操作系统对死锁的描述如下: 所谓死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去. 那么为什么会产生死锁呢? 1.因为系统资源不足. ...

  7. java微信开发框架wechat4j入门教程

    wechat4j What is wechat4j? wechat develop framework for java(微信开发框架JAVA版,最简单易用微信开发框架) wechat4j可以用来干什 ...

  8. jQuery中的效果函数方法整理

    注:以下所有的speed 参数可选,规定效果的时长.它可以取以下值:"slow"."fast" 或毫秒. 以下所有的callback 参数可选,是效果完成后所执 ...

  9. Mybatis学习记录(三)----理解SqlMapConfig.xml文件

    SqlMapConfig.xml mybatis的全局配置文件SqlMapConfig.xml,配置内容如下: properties(属性) settings(全局配置参数) typeAliases( ...

  10. [android] 短信发送器

    /*****************2016年4月23日 更新********************************/ 知乎:什么是 7 位元的字符? 英文字符难道不是 8 bit 是一个字 ...