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

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. 老外还是喜欢Ubuntu的

    有图为证? 开效果应该是Ubuntu的界面了,当然,不知是不是backtrack. 这里面的Hacker用的电脑都不是水果.是没有给钱么.

  2. ahjesus C# Flags 位域略说

    class Program { [Flags] public enum Week { [Description("星期一")] Monday = << , [Descr ...

  3. RabbitMQ与AMQP协议详解

    1. 消息队列的历史 了解一件事情的来龙去脉,将不会对它感到神秘.让我们来看看消息队列(Message Queue)这项技术的发展历史. Message Queue的需求由来已久,80年代最早在金融交 ...

  4. nodejs连接mysql并进行简单的增删查改

    最近在入门nodejs,正好学习到了如何使用nodejs进行数据库的连接,觉得比较重要,便写一下随笔,简单地记录一下 使用在安装好node之后,我们可以使用npm命令,在项目的根目录,安装nodejs ...

  5. IE浏览器中ajax使用缓存数据的问题

    今天做了一个小功能:点击鼠标实时更新系统时间,采用ajax,过程很顺利,没遇到啥差错,谷歌,火狐,欧鹏一律通过,怀着忐忑的心情点开了IE8,果然,IE要对得起前端杀手的称号:更新不了时间. 查了一下这 ...

  6. Atitit.视频文件加密的方法大的总结 java c# php

    Atitit.视频文件加密的方法大的总结 java c# php 1. 加密的算法  aes  3des  des xor等.1 2. 性能1 3. 解密1 4. 播放器的事件扩展1 5. 自定义格式 ...

  7. Mac下Apache Tomcat安装配置

    Java Web如果稍微知道一点,一般对Tomcat都不会陌生,Apache是普通服务器,本身只支持html即普通网页,可以通过插件支持PHP,还可以与Tomcat连通(单向Apache连接Tomca ...

  8. 如何在自己的Windows系统上 架设服务器并开发网站,然后连入外网供外界访问?(JDK+Tomcat+花生壳)

    <目前百度谷歌上都木有我这么完整的笔记,虽然各个部分都是来自百度的,然后自己实践,自己做截图笔记,嘻嘻 Made By HeYang> 环境:Windows 7 工具:JDK,Apache ...

  9. Swift中的类和结构体的相同点与不同点

     相同点: 1.都是有内部变量和函数 2.都可以有内部下标方式去取属性 3.都可以有初始化函数 4.都可以用协议   不同点: 1.类有继承 2.类可以多重引用 3.类有析构  

  10. 关于IOS应用程序视图

    积累英语词汇: assemble [ə'semb(ə)l] vt. 集合,聚集:装配:收集 assembled [ə'sembəld] adj. 组合的:安装的 v. 装配(assemble的过去分词 ...