一、时间复杂度

  在进行算法分析时,语句总的执行次数 T(n) 是关于问题的规模n 的函数,进而分析 T(n) 随 n 的变化情况并确定 T(n) 的数量级,算法的时间复杂度,也就是算法的时间度量,记作:T(n) = O(f( ))。它表示随问题的规模 n 的增大,算法的执行时间的增长率 f(n) 的增长率相同,称作算法的渐近时间复杂度,简称为时间的复杂度,其中 f(n) 是问题规模n的某个函数。

这样用大写 [ O( ) ] 来体现算法时间复杂度的记法,我们就称之为大O记法。例如:O(n)、O(1)、O(n2)、O(log n) 等等。一般情况下,随着 n 的增大,T(n) 增长最慢的算法为最优算法。

二、推导大O阶的方法

1,用时间1取代运算时间中的所有加法常数。

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

3,如果最高阶项存在且不是1,则去除与这个项相乘的常数。得到的结果就是大O阶。

例1:时间复杂度为O(1)常数阶的算法

 int sum = 0, n = 100;    /* 执行一次 */
sum = (1+n) *n/2; /* 执行一次 */
printf("the sum is:%d",sum); /* 执行一次 */

  我们可以看出运行次数的函数是 f(n) = 3。根据我们上面的大O阶公式 1 可以得到,把常数项 3 改为 1,在保留最高阶时发现没有最高阶项,所以时间复杂度为大 O(1)。也就是说,无论算法是 3 次还是 30 次,哪怕是 300 次,这些只要是常数项,它的时间复杂度都为大 O(1),而不是O(3)、O(30)、O(300)。即我们称之为常数阶。

例2:时间复杂度为O(n)线性阶的算法

 for(int i = 0; i < n; i++) {
sum += i;
}

  从上面的这段代码我们可以看出,它的时间复杂度为O(n),因为循环体中的代码需要执行n次。

例3:时间复杂度为O(n2)平方阶的算法

1 for(int i = 0; i < n; i++) {
2 for(int j = i; j < n; j++) {
3 //时间复杂度为O(n2)
4 }
5 }

分析:

  当 i = 0时,内循环执行了 n 次,

  当 i = 1时,内循环执行了 n-1 次,

  ......

  当 i = n-1时。执行了 1 次,

  所以总的执行次数为:n = (n-1)+(n-2)+ ··· + 1= n(n+1)/2 = n2/2+n/2。

  由上面的公式可得:第一条代码中没有加法常数项,不考虑;第二条只保留最高阶项,因此保留 n2/2;第三条去除这个项相乘的常数,所以去除了 1/2;最终我们得到的代码段时间复杂度就是 O(n2)。

例4:时间复杂度为O(log n)对数阶的算法

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

  上面代码我们可以看出,count = count * 2 之后就距离 n 更近一步,也就是说,有多少个 2 相乘后大于 n,就退出循环。所以我们可以由 2x = n 推导出 x = log2n ,像这样的循环时间复杂度,我们就称为对数阶的复杂度即为 O(log n)。

三、O阶算法效率排序

   数据结构中我们一般常用的时间复杂度表示有:O(1)、O(n)、O(n2)、O(log n)、O(nlog n)、O(n3)、O(2n)。

  按时间复杂度所耗费的时间从大到小排序依次为:

  O(1) < O(log n) < O(n) < O(nlog n) < O(n2) < O(n3) < O(2n)

算法的时间复杂度O的更多相关文章

  1. C#中常用的排序算法的时间复杂度和空间复杂度

    常用的排序算法的时间复杂度和空间复杂度   常用的排序算法的时间复杂度和空间复杂度 排序法 最差时间分析 平均时间复杂度 稳定度 空间复杂度 冒泡排序 O(n2) O(n2) 稳定 O(1) 快速排序 ...

  2. 算法的时间复杂度(大O表示法)

    定义:如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”. 当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性 ...

  3. 深入浅出数据结构C语言版(2)——简要讨论算法的时间复杂度

    所谓算法的"时间复杂度",你可以将其理解为算法"要花费的时间量".比如说,让你用抹布(看成算法吧--)将家里完完全全打扫一遍大概要5个小时,那么你用抹布打扫家里 ...

  4. php算法基础----时间复杂度和空间复杂度

    算法复杂度分为时间复杂度和空间复杂度. 其作用: 时间复杂度是指执行算法所需要的计算工作量: 而空间复杂度是指执行这个算法所需要的内存空间. (算法的复杂性体现在运行该算法时的计算机所需资源的多少上, ...

  5. 关于算法的时间复杂度O(f(n))

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

  6. KMP算法的时间复杂度与next数组分析

    一.什么是 KMP 算法 KMP 算法是一种改进的字符串匹配算法,用于判断一个字符串是否是另一个字符串的子串 二.KMP 算法的时间复杂度 O(m+n) 三.Next 数组 - KMP 算法的核心 K ...

  7. 算法中时间复杂度概括——o(1)、o(n)、o(logn)、o(nlogn)

    在描述算法复杂度时,经常用到 o(1), o(n), o(logn), o(nlogn) 来表示对应算法的时间复杂度, 这里进行归纳一下它们代表的含义:这是算法的时空复杂度的表示.不仅仅用于表示时间复 ...

  8. 算法的时间复杂度 & 性能对比

    算法的时间复杂度 & 性能对比 累加算法性能对比 // js 累加算法性能对比测试 const n = 10**6; (() => { console.time(`for`); let ...

  9. 常见算法的时间复杂度(大O计数法)

    定义 ​ 对于不同的机器环境而言,确切的单位时间是不同的,但是对于算法进行多少个基本操作(即花费多少时间单位)在规模数量级上却是相同的,由此可以忽略机器环境的影响而客观的反应算法的时间效率. 对于算法 ...

随机推荐

  1. MySQL线程状态详解

    前言: 我们常用 show processlist 或 show full processlist 查看数据库连接状态,其中比较关注的是 State 列,此列表示该连接此刻所在的状态.那么你真的了解不 ...

  2. spark HMM

    Scala实现的: https://github.com/skrusche63/spark-intent/tree/master/src/main/scala/de/kp/scala/hmm http ...

  3. bcb中TParamter传NULL值

    if (status_Desc.IsEmpty()) Queue_Status->Value = Null(); else Queue_Status->Value = status_Des ...

  4. 【转】以Python为例的Async / Await的编程基础

    转, 原文:https://www.cnblogs.com/middleware/p/11996731.html 以Python为例的Async / Await的编程基础 -------------- ...

  5. 牛客NOIP暑期七天营-普及组1 解题报告

    A 对于\(100\%\),直接开个桶统计即可.入门题目. 代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=41 ...

  6. Django之路——3 Django的路由层

    django不得不说是个很强大的框架,当前端给了我们一堆网页的时候,我们在考虑怎么去让这些页面与调用视图的函数配对的时候,而django则给我们提供了强大路由分发功能,让我们不在花时间浪费在这些事情上 ...

  7. 织梦CMS5.7主动推送二次开发

    今天一个朋友叫我写个织梦的百度主动推送插件,实现的功能是:每发表或者更新一篇文章,都会触动主动推送,达到资源最新提交给百度进行抓取. 案例站点:奇迹私服 第一步:登入FTP,在/后台的文件夹/arti ...

  8. document.ready与window.onload的区别

    代码分析: $(document).ready(function() { .... }); window.onload=function(){ ....} 两段代码功能上可以互换,但又有许多区别: 1 ...

  9. python 中 super函数的使用

    转载地址:http://python.jobbole.com/86787/ 1.简单的使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我 ...

  10. 织梦cms 后台查看会员性别为空

    织梦cms会员注册选择性别为保密时,在后台会员中心查看性别为空的修改方法 第一步:找到dede/templets/member_view.htm,在引号中添加保密就ok 再次修改后的结果