算法时间复杂度

很多程序员,做了很长时间的编程工作却始终都弄不明白算法的时间复杂度的估算,这是很可悲的一件事情。因为弄不清楚,所以也就从不深究自己写的代码是否效率底下,是不是可以通过优化,让计算机更加快速高效。所以在我最近自学看完算法的时间复杂度这个章节之后,我决定写一篇文章回顾,加深记忆,帮助理解。

算法设计的要求

一个好的算法的设计要求,必须符合以下的几个特性:正确性,可读性,健壮性,时间效率高和存储量低这四个特性。其中算法的前三个特性毕竟容易理解,今天就着重的关于算法的时间效率这个性质来梳理一下。

时间效率高是指在对于同一个问题,有多个算法能够解决,执行时间短的算法效率更高,执行时间长的效率低。在生活中,人们都希望花最少的钱,最短的时间,办最大的事,算法也是一样的思想。例如求一个班级的物理平均分和求全省学生的中考物理平均分,用同样一套算法的确能够解决问题,但是在占用的时间和内存上的差距是非常大的,所以非常有必要去追求一套高效率,低存储空间的算法来解决问题。

算法效率的度量方法

一般我们分析一套算法的效率,有事后统计法和事前分析法,但是事后统计法显然是有很大缺陷的,首先它必须要我们先编写好一套程序,这通常需要花费很大的时间和精力。所以一般我们对一套算法的分析,需要事前分析。

于是我们能发现,一个用高级程序语言编写的程序,在计算机上运行时所消耗的时间取决于下列因素:

  • 算法采用的策略、方法
  • 编译产生的代码质量
  • 问题的输入规模
  • 机器的执行指令的速度

第1条当然是决定一个算法好坏的根本,而第2条由软件决定,第4条主要看硬件性能,也就是说,抛开与计算机软件、硬件有关的因素,一个程序的运行时间,依赖于算法的好坏和问题的输入规模。所谓的输入规模,就是指输入量的多少。

所以我们在分析算法问题时,最重要的就是把程序看成是独立于程序设计语言的算法或一系列的步骤。

函数的渐近增长

函数的渐近增长:给定两个函数f(n)和g(n),
如果存在一个整数N,使得对于所有的n>N,f(n)总是比g(n)大,
那么我们就说f(n)的增长渐近快于g(n)。

判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注的是主项(最高阶项)的阶数。

判断一个算法好不好,通过少量的数据是不能得出结论的。如果我们对比几个函数在关键执行次数的函数的渐近增长性,基本就可以分析出:某个算法,随着n的增大,它会越来越优于另一算法,或者原来越差于另一算法。这其实就是事前估算方法的理论依据,通过算法时间复杂度来估算算法时间效率。

算法时间复杂度

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

这样用写大O()来体现的时间复杂度的记法,我们称之为大O记法。

显然由时间复杂度的定义可知,算法的时间复杂度分别为O(1),O(n),O(n²),用非官方的名称来叫它们,O(1)常数阶,O(n)线性阶,O(n²)平方阶,当然还有一些其他的阶。

//例如O(1)常数阶
sum = (1 + n) / 2 ;

//例如O(n)线性阶
    for (int i = 0; i < n; i++) {
        x++;
    }

//例如O(n²)平方阶

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

推导大O阶的方法

推导大O阶:

1、用常数1取代运行时间中所有的加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项相乘的常熟。
得到的结果就是大O阶。

其实理解大O阶推导并不难,难得是对数列的一些相关运算,这里更多的考察的是数学知识和能力,特别是数列方面的知识和解题能力。

常见的时间复杂度

执行次数函数 非正式术语
12 O(1) 常数阶
2n+3 O(n) 线性阶
3n²+2n+1 O(n²) 平方阶
5log2n+20 O(logn) 对数阶
2n+3nlog2n+19 O(nlogn) nlogn阶
6n³+2n²+3n+4 O(n³) 立方阶
2^n O(2^n) 指数阶

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

O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2^n)<O(n!)<O(n^n)

一般在没有特殊说明的情况下,我们分析的都是算法的在最坏状况下的时间复杂度。

通过分析算法的效率,能深刻感受到愚公的精神固然可敬,但是推土机和炸药可能是更加实在和聪明。

简单的算法时间复杂度的概念就先到这里结束了,以后看到新的知识再继续分享。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,036评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,046评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,411评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,622评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,661评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,521评论 1 304
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,288评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,200评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,644评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,837评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,953评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,673评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,281评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,889评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,011评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,119评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,901评论 2 355

推荐阅读更多精彩内容