前言:

算法的分析方式有两种:

  1. 事后分析统计方法:编写算法对应程序,统计其执行时间。
    存在问题:编写程序的语言不同,执行程序的环境不同等因素
  2. 事前估算分析方法:撇开上述因素,认为算法的执行时间是问题规模n的函数。

所以我们引入了时间复杂度的概念来对算法进行分析

分析算法的执行时间

求出算法所有原操作的执行次数(也称为频度),它是问题规模n的函数,用 T(n) 表示。

算法执行大致时间 = 原操作所需的时间 * T(n)
所以算法的执行时间与 T(n) 成正比
为此用 T(n) 表示算法的执行时间

频度的计算

先来看一段代码

for (i = 0; i < n; i++) {                                      //语句 1   频度为 n+1for (j = 0; j < n; j++) {                              //语句 2   频度为 n*(n+1)c[i][j] = 0;                                   //语句 3   频度为 n*n for (k = 0; k < n; k++)                        //语句 4   频度为 n*n*(n+1) c[i][j] = c[i][j] + a[i][k] * b[k][j]; //语句 5   频度为 n*n*n       }
}

来解释一下,每个语句的频度

语句1:

不看内循环,单独看语句 1 ,当i范围在 [0,n-1] 时,它执行了n次,i=n时还执行了一次(判断后跳出循环),所以是n+1次。

语句2:

一样,不看 内循环 和 外循环,单独看语句2,语句2执行了n+1次 ,再看外循环,也就是语句1 循环了 n 次(频度是n+1,但是 循环次数并不是n+1次) 所以语句2 的频度为 n*(n+1)

语句3:

不看外循环,执行一次,再看外循环,执行n*n次 故 频度为n²

语句4和语句5的频度就不做解释了

得出这个段代码的 频数之和

T(n) = 2n³ + 3n² + 2n + 1

算法的执行时间用时间复杂度来表示

T(n) = O(f(n))
记号“O”读作“大O”,它表示随问题规模n的增大算法执行时
间的增长率和f(n)的增长率相同。

T(n)= O(f(n))表示存在一个正的常数M,使得当n≥n0时都满足:
| T(n) | ≤ M | f(n) |
f(n)是 T(n)的上界
这种上界可能很多,通常取最接近的上界,即紧凑上界
大致情况:lim n->∞ T(n) / f(n) = M

是不是觉得很啰嗦,怎么涉及到这种概念 ,没事 看不懂也没事,其实,只要求出T(n) 的最高阶就行了 忽略其他低阶项和常系数
例如
T(n) = 2n³ + 3n² + 2n + 1 = O(n³)
T(n) =2n² + 2n + 1 = O(n²)
T(n) = n + 1 = O(n)
T(n) = 1 = O(1)
一个没有循环的算法的执行时间与问题规模n无关,记作0(1),也称作常数阶。
一个只有一重循环的算法的执行时间与问题规模n的增长呈线性增大关系,记作O(n),也称线性阶。
其余常用的算法时间复杂度还有平方阶O(n²)、 立方阶O(n³)、 对数阶O(log2n)、指数阶O(2^n)等。

对数阶的例子:

int i = 1;
while(i<n)
{i = i*2;
}

执行次数为x次
2^x = n
则 x = log 2 n
时间复杂度为O(log2n)

指数阶的例子

int aFunc(int n) {if (n <= 1) return 1;else return aFunc(n - 1) + aFunc(n - 2);
}

显然运行次数,T(0) = T(1) = 1,同时 T(n) = T(n - 1) + T(n - 2) + 1,这里的 1 是其中的加法算一次执行。显然 T(n) = T(n - 1) + T(n - 2) 是一个斐波那契数列,通过归纳证明法可以证明,当 n >= 1 时 T(n) < (5/3)^n,同时当 n > 4 时 T(n) >= (3/2)^n。所以该方法的时间复杂度可以表示为 O((5/3)^n),简化后为 O(2^n)。

常用的时间复杂度所耗费的时间从小到大依次是

O(1 )< O(logn) < O(n) < O(n*logn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

算法的时间复杂度的计算相关推荐

  1. 关于算法的时间复杂度怎么计算

    参考 [*][https://blog.csdn.net/user11223344abc/article/details/81485842][时间复杂度O(logN),比如二分法就是时间复杂度O(lo ...

  2. KMP算法的时间复杂度

    在对KMP算法的时间复杂度进行计算的时候,发现阮一峰的博客中对KMP算法的核心--next数组的解释和使用时与<大话数据结构>的作者程杰有很大差别: 1.阮:next数组通过遍历子字符串中 ...

  3. 各种排序算法的时间复杂度和空间复杂度-记忆方式

    直选冒,三朴素 (直接插入排序,简单选择排序,冒泡排序是三种朴素算法,一般是o(n)~o(n^2)) 简选排,序无关 (简单选择排序算法与开始序列无关,最好最坏都是o(n^2)) 其余五,数优化 (其 ...

  4. 【计算理论】计算复杂性 ( 小 O 记号 | 严格渐进上界 | 分析算法的时间复杂度 )

    文章目录 一.小 O 记号 ( 严格渐进上界 ) 二.分析算法的时间复杂度 一.小 O 记号 ( 严格渐进上界 ) 如果 g(n)\rm g(n)g(n) 是 f(n)\rm f(n)f(n) 渐进上 ...

  5. 时间复杂度为on的排序算法_排序算法amp;时间复杂度计算

    对于排序算法而言,有几个重要的点: 理解此种排序算法是怎么运行的 理解算法的时间复杂度与空间复杂度计算 递推公式(关乎时间复杂度的计算) 递推公式主要为以下的形式(递归使用的复杂度也这么算): 具体推 ...

  6. 计算算法的时间复杂度

    (一)概念: 时间频度:一个算法中的语句执行次数称为语句频度或时间频度:记为T(n). 时间复杂度:若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f ...

  7. 算法时间复杂度的计算:从几道题目讲起

    引子 最近再来回顾一下算法相关的知识,那自然,首先要学习的就是 时间复杂度的概念,以及其计算方式.下面,我就会简单地介绍下时间复杂度,以及会给出几道典型的时间复杂度计算题. 时间复杂度 将算法中基本操 ...

  8. 算法复杂度(时间频度,时间复杂度介绍计算,空间复杂度)

    算法的时间复杂度 度量一个程序(算法)执行时间的两种方法 事后统计的方法(直接运行看花了多长时间) 这种方法可行, 但是有两个问题:一是要想对设计的算法的运行性能进行评测,需要实际运行该程序:二是所得 ...

  9. java中怎么计算算法的时间复杂度_算法的时间复杂度和空间复杂度计算

    一.算法的时间复杂度定义 在进行算法分析时,语句总的执行次数T(n)是关于问题规模n的函数,进而分析T(n)随n的变化情况并确定T(n)的数量级.算法的时间复杂度,也就是算法的时间量度.记作:T(n) ...

最新文章

  1. 大牛实战归纳——Kafka架构原理
  2. linux中sort命令
  3. Android 70道面试题汇总不再愁面试
  4. 若川知乎问答:做前端感觉很吃力怎么办?
  5. 云服务器加密机,如何选择云服务器密码机
  6. react动态改变选中不选中_reactjs – 如何避免使用重新选择来计算派生状态时React重新渲染...
  7. Android 数据库 在使用 update更新的时候,总是无法更新,还没有异常抛出!
  8. idea报错:Lambda expressions are not supported at language level '7'
  9. Quartz 在线Cron表达式
  10. csdn广告过滤油猴子(Greasemonkey)脚本(同样适用于暴力猴 tampermonkey/Violentmonkey 在浏览器Firefox/chrome都可以用,全部复制粘贴即可)
  11. 微信公众号开发教程java_微信公众号开发java框架:wx4j(入门篇)
  12. 【破解APP抓包限制】Xposed+JustTrustMe关闭SSL证书验证!
  13. 服务器Raid5磁盘阵列数据恢复步骤和数据恢复方法
  14. 学习笔记——MongDB非关系型数据库的脚本代码汇总
  15. 【实战 01】心脏病二分类数据集
  16. 计算机毕业设计 志愿者服务管理系统 志愿者系统 志愿者招募系统 志愿者报名管理系统 志愿者信息管理系统 志愿者管理系统 志愿者管理系统源码 志愿者管理系统java 志愿者信息管理系统
  17. prior 和 priori的区别
  18. TFLite Interpreter
  19. Android安卓毕业设计,SpringBoot+MySQL+Android studio 实现一个二手交易平台APP
  20. 有了自动驾驶和共享无人车,未来出行将会是什么样的体验?

热门文章

  1. cython大白话基础教程
  2. hahabet05-com:大数据与数据科学课程体系--哈哈电竞
  3. linux_系统帮助propos/whatis/which/whereis/man/info/help...)/bashzsh/build-in command帮助/wildcard/regex
  4. vue中关于$emit及propos的用法
  5. tp-link无线路由与android手机无线连接设置指南,苹果手机(iPhone)无线连接TP-LINK路由器解决方案...
  6. 【软件工程】交付和维护
  7. Java-判断回文数
  8. 图像中目标or内容疏密程度判断
  9. Java多线程-Java多线程实现
  10. ResNet网络的改进版:ResNeXt