目录

一.什么是算法的时间复杂度

二.如何分析一个算法的时间复杂度

1.有确定次数的算法

2.次数不确定的算法


一.什么是算法的时间复杂度

        时间复杂度是一个函数 ,定性描述一个算法(程序)的运行时间。它可以是渐近的,亦即考察输入值大小趋近无穷时的情况。正常情况下,完成相同的任务的时间复杂度越低,算法越优。

比如 求从1到100的和的两种方法 的时间复杂度:

int i,sum = 0, n = 100;
for (i = 1; i <=n; i++){sum += i;
}
printf ("%d", sum);

-时间复杂度为O(n)-

int sum = 0, n = 100;
sum = (1 + n) * n/2;
printf ("%d", sum);

-时间复杂度为O(1)-

        大O记法:用大写O()来体现算法时间复杂度的记法叫大O记法。

二.如何分析一个算法的时间复杂度

大O阶推推导法三个步骤:

(1).用常数1取代运行时间中所有加法常数。

(2).在修改后的运行次数函数中,只保留最高阶项。

(3).如果最高阶项存在且其系数不是1,则去除与这个项相乘的系数。

-得到的结果就是大O阶。(只看文字有些难以理解,可以先看看后面的实例)

针对时间复杂度,我将算法分为有确定次数次数不确定的算法。

下面从两个方面分析几个实例:( f(n)表示程序运行的次数 )

1.有确定次数的算法

-常数阶-

int sum = 0, n = 100;
sum = (1 + n) * n/2;
printf ("%d", sum);

这个算法的f(n)为3,根据法(1)其时间复杂度为O(1)。

常数项对函数的增长速度影响并不大,所以当 f(n) = c,c 为一个常数的时候,我们说这个算法的时间复杂度为 O(1);如果 T(n) 不等于一个常数项时,直接将常数项省略。

-线性阶-

int i;
for (i = 0; i < n; i++){/*时间复杂度为O(1)的程序*/
}

这个算法的f(n)为n,故其时间复杂度为O(n)。

-对数阶-

int count = 1;
while (count < n)
{count = count * 2;/*时间复杂度为O(1)的程序*/
}

由于2^x=n得到x=(log2)n。所以f(n)为(log2)n,其时间复杂度为O(logn)。

-平方阶-

int i,j;
for (i = 0; i < n; i++)
{for (j = 0; j < n; j++){/*时间复杂度为O(1)的程序*/    }
}

这是个嵌套循环,可以成将时间复杂度为O(n)的语句执行了n次。故其时间复杂度为(n^2)。

若外循环次数改为m,则时间复杂度变为(m*n)。

int i,j;
for (i = 0; i < n; i++)
{for (j = i; j < n; j++) /*此处0换成i*/ {/*时间复杂度为O(1)的程序*/    }
}

而对于这个算法,其f(n)=n+(n-1)+(n-2)...+1=n(n+1)/2=(n^2)/2+n/2。

我们知道高次项对于函数的增长速度的影响是最大的。n^2 的增长速度是远超 n的,因为要求的精度不高,所以直接忽略较低项n/2。

又因为函数的阶数对函数的增长速度的影响是最显著的,所以忽略与最高阶相乘的常数1/2。

方法(1):没有加法常数不予考虑;(2):只保留最高项,故保留(n^2)/2;(3):去除项的系数1/2。

故其时间复杂度为O(n^2)。

-再举例,若一个算法的f(n)=(n^3)*3/2+(n^2)*3/2+n+5时,根据推导大O阶法其时间复杂度为O(n^3)。

-其他情况-

int i, j, sum = 0, n = 100;
for (i = 1; i <=n; i++){sum += i;
}
printf ("%d\n", sum);
for (i = 1; i <=n; i++){for(j = 1; j <=n; j++){sum+=i*j;}
} 

对于顺序执行的语句或者算法,总的时间复杂度等于其中最大的时间复杂度。

此时时间复杂度为 max(O(n^2), O(n)),即 O(n^2)。

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

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

2.次数不确定的算法

最坏情况与平均情况:若要查找一个有n个随机数字数组中的某个数字,最好的情况第一个数字就是,那么算法的时间复杂度为O(1),最坏的情况是最后一个,则时间复杂度为O(n)。而平均运行时间为查找n/2次后发现目标元素。平均运行时间是所有情况中最有意义的,因为它是期望的运行时间。但现实是平均运行时间很难通过分析得到,所以在没有特殊说明的情况下,提到的时间复杂度都指最坏时间复杂度

-冒泡排序-

int a[n] = {};
for (int i = 0; i < n - 1; i++)
{for (int j; j < n-i-1; j++){if (a[j] > a[j+1]) swap(a[j],a[j+1]);  /*swap已定义好*/}
}

最坏的情况即待排序列为逆序时,f(n)=1+2+3...+(n-1)=n*(n-1)/2次,故其时间复杂度为O(n^2)。

简单分析算法的时间复杂度相关推荐

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

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

  2. 对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

    对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的 边.说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度

  3. 设A和B是两个按元素值递增有序的单链表,写一算法将A和B归并为按按元素值递减有序的单链表C,试分析算法的时间复杂度。(利用上篇带有头结点的线性链表操作)...

    #include <stdio.h> #include <malloc.h> typedef int DataType; #include "LinList.h&qu ...

  4. 算法的时间复杂度和空间复杂度评估

    通常,对于一个给定的算法,我们要做 两项分析.第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式.数学归纳法等.而在证明算法是正确的基础上,第二部就是分析算法的 ...

  5. 【数据结构与算法 10】算法的时间复杂度和空间复杂度

    最近在研究数据结构与算法,在B站中找到了小甲鱼的<数据结构与算法课程>,挺有意思的! 尚硅谷Java数据结构与java算法,韩顺平数据结构与算法 对于一个算法来说,分析有两步,第一是从数学 ...

  6. [算法基础]--时间复杂度和空间复杂度

    感谢原文作者:https://blog.csdn.net/zolalad/article/details/11848739 算法的时间复杂度和空间复杂度-总结 通常,对于一个给定的算法,我们要做 两项 ...

  7. 计算算法的时间复杂度和空间复杂度

    算法的时间复杂度和空间复杂度-总结 通常,对于一个给定的算法,我们要做 两项分析.第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式.数学归纳法等.而在证明算法 ...

  8. 算法的时间复杂度-总结

    文章目录 前言 一.什么是时间复杂度? 一种简单粗暴衡量算法时间复杂度的方法(事后统计) 通过预先估算来得到算法复杂度的方法(事前分析) 时间复杂度概念[1] 二.时间复杂度求解具体步骤 常见法则 总 ...

  9. 简单排序算法时间空间复杂度分析及应用(4)-二分插入排序

    简单排序算法时间空间复杂度分析及应用(4)-二分插入排序 背景: 顾名思义,这个二分插入排序是直接插入排序的进化版,主要变化的地方就是在内循环部分,即外循环的循环节点在确定区域的位置查询方式由原来的直 ...

最新文章

  1. ajax怎样发变量,使用jQuery Ajax发送多个变量
  2. Vue + ElementUI 如何优雅的上传文件到七牛OSS
  3. python表白程序-用Python做一个表白小姐姐的程序
  4. 中间件系列「三」netty之NIO基础
  5. centos 安装 redmine 2.6.0.stable
  6. eplan单线原理图多线原理图_【原创分享】西门子PLC电路图高效设计——基于EPLAN与TIA Selection...
  7. vue源码学习--vue源码学习入门
  8. 基于.NET下的人工智能系列专题|.NET下的人工智能系列专题|用Keras.NET 做一个图像识别的训练...
  9. 系统架构设计师-软件水平考试(高级)-理论-操作系统
  10. 2018年全国《程序员高考》真题试卷
  11. java文件复制(可过滤)
  12. 趣谈 JOIN 操作
  13. 解决企业人力短缺难题?且看RPA如何大展身手!
  14. 错题分析--ASP.NET
  15. Java之美[从菜鸟到高手演变]之设计模式四
  16. 智能硬件市场与产品概况整理
  17. 微信小程序使用Canvas给图片加水印
  18. [操作系统] elementary os系统美化插件
  19. 易优CMS插件易优CMS智能改写插件
  20. PAT 1072 开学寄语

热门文章

  1. Ubuntu 下查看CUDA和cuDNN 版本
  2. mysql 建立联合索引
  3. 成语json_cocos creator实战(2)成语小秀才ts版
  4. pandas 知识点补充:绘图plot
  5. pytorch笔记:搭建简易CNN
  6. MATLAB实战系列(二十九)-头脑风暴优化(BSO)算法求解旅行商问题(TSP)-交叉算子
  7. 如何迅速成长成为一名数据分析师(都是干货)?
  8. Python入门100题 | 第055题
  9. Python入门100题 | 第006题
  10. LeetCode-数组-54. 螺旋矩阵