复杂度分析--时间复杂度

  • 概念
  • 判断时间复杂度准则
    • <1>只关注循环执行次数最多的一段代码
    • <2>加法法则:总复杂度等于量级最大的那段代码的复杂度
    • <3>乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积
  • 几种常见时间复杂度实例分析
    • O(1):常数型时间复杂度
    • O(log n): 对数复杂度
    • O(n^2):平方复杂度
    • O(n^2):指数复杂度
    • O(n!):阶乘
  • 各时间复杂度曲线

概念

算法的执行时间与数据规模之间的增长关系
时间复杂度不是代码的执行时间,而是一种随着数据规模不断增长的一种变化趋势
假设一行代码的执行速度是恒定值10,那么代码执行时间time和代码执行次数x公式为:

即:T(n)=O(f(n))
所以:“算法的执行时间与数据规模之间的增长关系”可以等价的看作为“算法的执行次数与数据规模之间的增长关系

判断时间复杂度准则

<1>只关注循环执行次数最多的一段代码

通常会忽略掉公式中的常量、低阶、系数,只需要记录一个最大阶的量级

 int cal(int n) {int sum = 0;   //执行1次for (int i=1; i <= n; ++i) {       //执行n次sum = sum + i;      //执行n次}return sum;  //执行1次}

套用公式为:T(n)=O f(1+2n+1) =>忽略常量1,系数2 转化为T(n)=O f(n)
最后这段代码的时间复杂度为:O(n)

<2>加法法则:总复杂度等于量级最大的那段代码的复杂度

如果 T1(n)=O(f(n)),T2(n)=O(g(n));那么 T(n)=T1(n)+T2(n)=max(O(f(n)), O(g(n))) =O(max(f(n), g(n))).

int cal(int n) {int sum_1 = 0;  //1次int p = 1;     //1次for (; p < 100; ++p) { //100次sum_1 = sum_1 + p;      //100次}int sum_2 = 0;  //1次int q = 1;     //1次for (; q < n; ++q) {       //n次sum_2 = sum_2 + q;        //n次}int sum_3 = 0;    //1次int i = 1;     //1次int j = 1;     //1次for (; i <= n; ++i) {     //n次j = 1;                     //n次for (; j <= n; ++j) {     //n^2次sum_3 = sum_3 +  i * j; //n^2次}}return sum_1 + sum_2 + sum_3; //1次}

取最大阶量级:n^2 即为:T(n)=O f(n^2)

int sum_1 = 0;  //1次
int p = 1;     //1次
for (; p < 100; ++p) { //100次
sum_1 = sum_1 + p;        //100次
}

注:不管n增长到多大,这段代码执行的时间都是100,不管n增长到多大,这段代码执行时间是一定的,不会影响整体的执行效率的变化趋势。

<3>乘法法则:嵌套代码的复杂度等于嵌套内外代码复杂度的乘积

如果 T1(n)=O(f(n)),T2(n)=O(g(n));那么 T(n)=T1(n)*T2(n)=O(f(n))*O(g(n))=O(f(n)*g(n)).


int cal(int n) {int ret = 0; int i = 1;for (; i < n; ++i) {      //执行n次  T1(n) ret = ret + f(i);       } } int f(int n) {int sum = 0;int i = 1;for (; i < n; ++i) {sum = sum + i; //执行n次  T2(n)} return sum;}

f 方法的时间复杂度为O(n),cal的时间复杂度为 T(n) = T1(n) * T2(n) = O(n*n) = O(n2)。

几种常见时间复杂度实例分析

O(1):常数型时间复杂度

int n=10;
System.out.printLn("hi you input is"+n);

常数型时间复杂度,程序代码执行次数和“n”的大小没有关系

一般情况下,只要算法中不存在循环语句、递归语句,即使有成千上万行的代码,其时间复杂度也是Ο(1)

O(log n): 对数复杂度

for(int i=1;i<=n;i=i*2){System.out.printLn("hi you input is"+i);
}
n的值 输出语句次数
1 1
2 2
4 3
8 4
16 5
32 6
n


即:时间复杂度约等于:O(logn)

O(n^2):平方复杂度

//O(N^2) 代码执行N^2次
for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){System.out.printLn("hi you input is"+j);}
}

乘法法则

O(n^2):指数复杂度

O(n!):阶乘

各时间复杂度曲线

随着N的增大,对时间复杂度的影响层度
O(1)<O(log n)<O(n)<O(n2)<O(2n)<O(n!)

复杂度分析--时间复杂度相关推荐

  1. 【排序综合】直接插入排序,希尔排序,快速排序,堆排序,冒泡排序,简单选择排序的简介,实现和算法复杂度分析

    目录 1. 直接插入排序 1.1 直接插入排序简介 1. 什么是直接插入排序 2. 排序思想 1.2 排序实现 1. 排序代码 2. 复杂度分析: 3. 运行结果: 1.3 学习链接 2. 希尔排序( ...

  2. 算法复杂度分析(下):最好、最坏、平均、均摊等时间复杂度概述

    细化时间复杂度分析 代码千千万,有些代码逻辑会很复杂,所以为了更细化的分析算法的复杂度,再复杂度分析方面引入了4个知识点: 1.最好情况时间复杂度(best case time complexity) ...

  3. 【数据结构与算法-java实现】二 复杂度分析(下):最好、最坏、平均、均摊时间复杂度的概念

    上一篇文章学习了:如何分析.统计算法的执行效率和资源消耗? 点击链接查看上一篇文章:复杂度分析上 今天的文章学习以下内容: 最好情况时间复杂度 最坏情况时间复杂度 平均情况时间复杂度 均摊时间复杂度 ...

  4. 第3课:算法复杂度分析(下):最好、最坏、平均、均摊时间复杂度

    目录 最好.最坏时间复杂度 平均情况时间复杂度 均摊时间复杂度 小结 最好.最坏时间复杂度 我们先看一个例子: /*例1:查找x在数组中出现的位置,如果没有找到,返回-1.n表示数组array的长度 ...

  5. 【每日一学】复杂度分析

    文章目录 目标 什么是数据结构 复杂度分析 目标 建立时间复杂度.空间复杂度意识,写出高质量的代码 能够设计基础架构 提高编程技能 训练逻辑思维 什么是数据结构 广义:一组数据的存储结构 | 操作数据 ...

  6. 卷积神经网络的复杂度分析

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 作者 | Michael Yuan@知乎(已授权) 来源 | htt ...

  7. 算法录 之 复杂度分析。

    一个算法的复杂度可以说也就是一个算法的效率,一般来说分为时间复杂度和空间复杂度... 注意接下来说的均是比较YY的,适用与ACM等不需严格分析只需要大致范围的地方,至于严格的算法复杂度分析的那些数学证 ...

  8. 算法之如何进行算法复杂度分析

    一.什么是复杂度分析? 1.数据结构和算法解决是"如何让计算机更快时间.更省空间的解决问题". 2.因此需从执行时间和占用空间两个维度来评估数据结构和算法的性能. 3.分别用时间复 ...

  9. 怎么算matlab算法复杂度,算法复杂度分析

    1. 何为数据结构?何为算法? 简单来说,数据结构就是数据的存储方式,比如数组就是把数据存在一段连续的内存上,而链表则是通过指针的关联将数据存在任意可用的内存上:栈是先进后出,队列是先进先出. 而算法 ...

最新文章

  1. 『笔记』常用命名规则
  2. linux ping策略打开_Linux禁止ping以及开启ping的方法
  3. #2002 Cannot log in to the MySQL server, PHPMyAdmin/MySQL
  4. Java注释 link_开源代码中注释中的那些a link p @ 是给什么编辑器用的????
  5. Khadas VIM3 (Amlogic A311D) uboot去掉烦人的乱七八糟的打印1——BL2 BL3x
  6. java之NIO(Channel,Buffer,Selector)
  7. 文件夹错误 分配句柄_重启数据库遇到错误ORA27154,ORA27300,ORA27301,ORA27302
  8. gradle 编译java配置文件_Andriod(三):配置文件build.gradle与AndroidManifest.xml
  9. 数据:以太坊矿工收入中的交易手续费占比达56%
  10. 大量的数据做字符串匹配_【重学数据结构与算法(JS)】字符串匹配算法(三)——BM算法...
  11. java私聊_【转帖】实现了视频私聊功能
  12. php之form,PHP之表单处理
  13. latex里图片大小如何调整_怎样用latex修改插入图形的大小,使图形大小一致。...
  14. 计算机类国企门槛,大学生想进“国家电网”,3个条件缺一不可,少一个将与国企无缘...
  15. Hive 的SQL基本操作
  16. 用计算机画对称图形,人教小学美术五下《第17课电脑美术 对称图形》word教案...
  17. 数据分析案例分析:日化公司社群营销场景,产品SKU,用户转化率,用户流转地图
  18. Oralce数据库ASM存储管理-存储IO故障,disk未及时offline分析,故障分析模板
  19. 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序
  20. 【概率图与随机过程】06 朴素贝叶斯:基于条件独立性假设

热门文章

  1. [应用模板]HTML5电子相册
  2. python下载谷歌地图瓦片_python抓取天地图瓦片
  3. matlab创新开放性实验,基于MATLAB 的自动控制原理实验仿真系统的设计
  4. HTML静态网页作业——我的家乡安庆
  5. C++ 主函数几种语法
  6. QQ个人账号/QQ群 链接如何分享
  7. APP的9种商业模式图解
  8. Java ~ Reference
  9. python实现求解完美立方等式
  10. Node与namespace