分析循环 Analysis of Loops-------geeksforgeeks 翻译
之前我们讨论了渐进分析,最佳最坏平均情况的分析以及渐进符号。在这一篇中我们分析一下迭代的简单程序。
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 翻译的更多相关文章
- x264源代码简单分析:宏块分析(Analysis)部分-帧间宏块(Inter)
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- x264源代码简单分析:宏块分析(Analysis)部分-帧内宏块(Intra)
===================================================== H.264源代码分析文章列表: [编码 - x264] x264源代码简单分析:概述 x26 ...
- 数据关联分析 association analysis (Aprior算法,python代码)
1基本概念 购物篮事务(market basket transaction),如下表,表中每一行对应一个事务,包含唯一标识TID,和购买的商品集合.本文介绍一种成为关联分析(association a ...
- C++ 11 学习2:空指针(nullptr) 和 基于范围的for循环(Range-based for loops)
3.空指针(nullptr) 早在 1972 年,C语言诞生的初期,常数0带有常数及空指针的双重身分. C 使用 preprocessor macroNULL 表示空指针, 让 NULL 及 0 分别 ...
- Spring IOC 容器源码分析 - 循环依赖的解决办法
1. 简介 本文,我们来看一下 Spring 是如何解决循环依赖问题的.在本篇文章中,我会首先向大家介绍一下什么是循环依赖.然后,进入源码分析阶段.为了更好的说明 Spring 解决循环依赖的办法,我 ...
- 生存分析(survival analysis)
一.生存分析(survival analysis)的定义 生存分析:对一个或多个非负随机变量进行统计推断,研究生存现象和响应时间数据及其统计规律的一门学科. 生存分析:既考虑结果又考虑生存时间的一种统 ...
- 平摊分析 Amortized Analysis ------geeksforgeeks翻译
当偶尔一切操作很花的时间很慢,而大多数操作的时间都很快的时候,平摊分析的方法就很很好用了.在平摊分析中,我们分析一串操作并且可以得到最坏情况下的平均时间复杂度.例如hash table, disjoi ...
- 算法最坏,平均和最佳情况(Worst, Average and Best Cases)-------geeksforgeeks 翻译
最坏,平均和最佳运行时间(Worst, Average and Best Cases) 在上一篇文章中,我们讨论到了渐进分析可以解决分析算法的问题,那么在这一篇中,我们用线性搜索来举例说明一下如何用渐 ...
- 算法分析 Analysis of Algorithms -------GeekforGeeker 翻译
算法分析 Analysis of Algorithms 为什么要做性能分析?Why performance analysis? 在计算机领域有很多重要的因素我们要考虑 比如用户友好度,模块化, 安全性 ...
随机推荐
- android 学习资料
Fragment 事件分发机制 事件分发机制2 NDK JNI ndk { moduleName "mymodule" ldLibs "log" stl &qu ...
- 机器学习实战 - 读书笔记(13) - 利用PCA来简化数据
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第13章 - 利用PCA来简化数据. 这里介绍,机器学习中的降维技术,可简化样品数据. ...
- Math对象常用方法汇总
前几天翻阅<JavaScript权威指南>,看到了Math对象,于是汇总了一下. Math对象不同于其他的对象,它可以说是一个公共数学类,里面有很多数学方法,用于各种数学运算,但是Math ...
- SharePoint 2013 设置自定义布局页
在SharePoint中,我们经常需要自定义登陆页面.错误页面.拒绝访问等:不知道大家如何操作,以前自己经常在原来页面改或者跳转,其实SharePoint为我们提供了PowerShell命令,来修改这 ...
- Spark中的RDD操作简介
map(func) 对数据集中的元素逐一处理,变为新的元素,但一个输入元素只能有一个输出元素 scala> pairData.collect() res6: Array[Int] = Array ...
- GridView总结一:GridView自带分页及与DropDownList结合使用
GridView自带的分页功能实现: 要实现GrdView分页的功能 操作如下: 1.更改GrdView控件的AllowPaging属性为true. 2.更改GrdView控件的PageSize属性为 ...
- Android获取焦点所在控件
View vFocus=getWindow().getDecorView().findFocus(); if(vFocus instanceof EditText) { ((EditText) vFo ...
- TCP/IP协议握手过程详解
1,建立连接 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示. (1)第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SE ...
- EdgesForExtendedLayout
在IOS7 之后viewController有一个新的属性叫做edgesForExtendedLayout,这个属性指定viewController的view边缘延伸的方向,默认情况下是UIRectE ...
- 【读书笔记】iOS-复制的种类
一,你可以使用不同的方法复制对象.大多数对象都引用(即指向)其它对象. 二,浅层复制,不复制引用对象,新复制的对象只指向现有的引用对象.NSArray类的copy方法是浅层复制.当复制一个NSArra ...