怎样才是一个好算法:空间复杂度 & 时间复杂度​


大家好,欢迎来到 Crossin的编程教室 !

“算法”是一个我们经常在编程学习、求职面试时听到的一个词。那么,什么是算法?以及如何评价一个算法的好坏?今天我们就来给大家说一说。

一、什么是算法

算法

  • 一个有限指令集

  • 接受一些输入(有些情况下不需要收入)

  • 产生输出

  • 一定在有限步骤之后终止

  • 每一条指令必须:

  1. 有充分明确的目标,不可以有歧义

  2. 计算机能处理的范围之内

  3. 描述应不依赖于任何一种计算机语言以及具体的实现手段

其实说白了,算法就是一个计算过程解决问题的方法。我们现在已经知道数据结构表示数据是怎么存储的,而“程序=数据结构+算法”,数据结构是静态的,算法是动态的,它们加起来就是程序

对算法来说有输入,有输出,相当于函数参数返回值。我们写算法的时候习惯把算法封装到一个函数中。

二、什么是好的算法

好,从上面我们知道了什么是算法,下面我再说什么是好的算法
在解决同一个问题的时候,我们通常会有很多种不一样的算法,区别就在于,有的算法比较笨,有的算法比较聪明,那我们怎么去衡量它们谁好谁坏呢?我们通常有下面两个指标:

  • 空间复杂度:根据算法写成的程序在执行时占用存储单元的长度。

  • 时间复杂度:根据算法写成的程序在执行时耗费时间的长度。

先举个例子说,如果让你打印十个整数,你那个程序可能瞬间就给出结果了,如果让你打印十万个整数呢?这你就得多等一会了。所以这个程序运行的时间,就跟你要处理的数据是十个还是十万个是相关的,这个十万就是我们要处理的数据的规模。我们把它叫做n,是一个变量的话,那我们这个程序所用的时间空间都跟这个n是有直接关系的。解决一个问题有很多中不同的方法,你在设计这个方法的时候,一定要把这两个要素考虑清楚。一不小心,如果空间复杂度太大的话,你那个程序就可能直接爆掉了,非正常中断,我一会会在后面讲,时间复杂度如果太大的话,你就可能等很长时间都等不出结果。

时间复杂度

先来看上面图片中的几组代码,我是用Python表示的,你在看的时候考虑两个问题:

  1. 四组代码中,哪组的运行时间最短?

  2. 用什么方式来体现算法运行的快慢?

刚才说n可以看作数据的规模,规模不一样,运行时间肯定也不一样,而且所用时间也不好确定,不同的n会得到不同的时间,所以我们用时间复杂度来表示算法运行的快慢。
先来看下面图片中的几个生活中的事件,估计时间:

这里你会发现我们会用“”表示一个大概,后面还有相应的时间单位,那时间复杂度也参照类似的方法:
时间复杂度:用来评估算法运行效率的一个式子

看上面图片所示,先说print(‘Hello World’),它的时间复杂度表示为O(1),O严格来说,它表示数学上一个式子的上界,我们可以简单的理解为就是一个估计,大约,相当于上面说的“”。1可以理解为是个运行单位(类似于秒这样的单位),为什么是O(1),因为print(‘Hello World’)只执行了一次,同理分析第二个:

for i in range(n):
    print('Hello World')

它的时间复杂度表示为O(n),因为这组代码执行了n次。n还是个单位,同理,分析第三个:

for i in range(n):    for j in range(n):        print('Hello World')

它的时间复杂度表示为O(

),因为是有两层循环,所以是

,

还是个单位。第四个你自己就可以分析了,我就不多此一举了。但千万不要以为就是这么简单,咱再看下面代码图片:

看到这个图片,你是不是感觉很良好,和你猜的差不多是吧,哈哈,不要高兴的太早,告诉你们,错了,它们的时间复杂度不是这样的。
为什么?我说了,“1”是单位,但“3”不是单位,3是3乘1,就比如说在生活中,问你一壶水烧多长时间,没有人回答说是三个几分钟或者几个三分钟。再说第二个,

是单位,n也是个单位,但是

比n大,所以我们在估计时用大单位,就好比生活中问你大概睡了多久,你一般说是几个小时,而不是说几个小时零几分钟,你强调的是一个大概的时间,明白了吧。
所以正确的时间复杂度是这样的:

第一个为什么是O(1),首先print('Hello World')打印一次和打印三次实际的影响不大吧,就是不管执行几次,只要它的规模不上升到n这么大的时候,换句话说,1是个单位,所以不管怎样,因为这是表示近似,不是表示精确的,所以是O(1).好,再看下面这个图片:

当你的循环减半的时候,时间复杂度就会变为O(logn)。所以你可以这样记,当算法过程出现循环折半的时候,复杂度式子中会出现logn。

时间复杂度小结

  • 时间复杂度是用来估计算法运行时间的一个式子(单位)

  • 一般来说,时间复杂度高的算法比时间复杂度低的算法慢

常见的时间复杂度(按效率排序)
复杂问题的时间复杂度

如何简单快速地判断算法复杂度

空间复杂度

在空间复杂度中需要注意的一点就是理解“空间换时间”,在研究一个算法的时候,时间比空间重要。毕竟,你的时间要比你的内存更值钱

作者:泰斗贤若如
(0)

相关推荐

  • 复杂度分析和大O表示法

    学习数据结构和算法要从复杂度分析说起.表示时间的大O符号,是用来描述算法效率的语言和度量单位.算法复杂度包括时间复杂度和空间复杂度,两者中又以时间复杂度相对重要,因为就 Web 应用而言,我们常见的性 ...

  • 基础分析时间、空间复杂第

    文章将按照:是什么,什么用,如何分析. 时间复杂度和空间复杂度是什么? 时间复杂度是程序根据问题规模,运行后所产生的时间与问题规模的比例(正相关). 空间复杂度是程序根据问题规模,所产生除基础空间外的 ...

  • 800年才出一个的“草书巨擘”,赵孟頫曾...

    800年才出一个的"草书巨擘",赵孟頫曾拜他为师,水平比怀素都厉害! 在中国书法史上能够名垂青史的书法家其实并不多,并且书法这一行业的成材率也极低,历史上那些流传千古的书法大师往往 ...

  • 800年才出一个的“草书巨擘”,赵孟頫曾拜他为师,水平比怀素都厉害!

    书法网 优质文化领域创作者 关注 在中国书法史上能够名垂青史的书法家其实并不多,并且书法这一行业的成材率也极低,历史上那些流传千古的书法大师往往几百年才出一个. 而在草书领域,这样的草书大师更是少见. ...

  • 这才是一个女人该有的精致生活

    人从出生到18岁,需要好的家庭与回忆,18到35岁,需要好的容颜与身体,35到55岁,需要好的个性,55岁以后,需要好的时光. 不管在什么年龄段,女人都该精致地活着.那什么才算是一个女人该有的精致生活 ...

  • 情感随笔‖女人,首先是一个活生生的人,其次才是一个母亲的角色!

    昨天在某音看到一个母亲在母亲节那天发的女儿给她的祝福语,女主感觉很庆幸 她女儿给她的母亲节祝福是:祝我妈不要做超人,永远做自己! 我想她的女儿一定是看多了她妈妈平时的不易,承担了太多太多,心里谁都有, ...

  • 奥黛丽·赫本:这才是一个女人最大的资本…

    奥黛丽·赫本,这个名字,我们通常会联想到哪些词语? 优雅.大方.美丽.端庄.高级.性感.超级大美女,-- 有一种美就叫奥黛丽·赫本 有一种美就叫奥黛丽·赫本,高级到一直被模仿却从未被超级. 她有着从容 ...

  • 高手背后的底层逻辑:不要成为一个被算法喂养的人

    领英LinkedIn 如果你的时间价值千万,你还舍得花时间刷小视频吗?网友:这很难说 编者按:本文来自微信公众号"LinkedIn"(ID:LinkedIn-China),作者:Y ...

  • 书法史唯一的平民书法家,隶书精绝天下,这种人1000年才出一个

    了解书法史的朋友都知道,在中国书法史上能够留下名姓且在后世影响深远的大书法家,一般均为官宦门第或者豪富之家. 因为只有在这种条件下生活的人,才有机会学习书法,才有机会获得更好的学习资源,拜到更好的老师 ...

  • 这才算是一个真正对的人

    经常都有人在问,究竟什么样的人,才算是真正对的人.很多人都想弄明白这个问题,这其实也很正常,毕竟,不同的选择,那就会是不同的一生.而关于对的人,有的人说,只要自己爱对方,这就足够了,有的人说,只要彼此 ...

  • 两千多年的时间里,大家都在骂这个人,其实他才是一个伟大的人

    栖霞山素有"六朝胜迹"之称,在明代被列为"金陵四十八景"之一,有"一座栖霞山,半部金陵史"的美誉.历史上曾有五王十四帝登临栖霞山,历史古迹遗 ...