《数据结构与算法之美》专栏学习笔记_02

本系列是极客时间中前 Google 工程师王争《数据结构与算法之美》专栏的学习笔记,想加强数据结构及算法能力的同学可以直接购买此专栏,数据结构与算法之美跳转链接

什么是好算法?

这个问题是在邓俊辉老师的数据结构和算法课上看到的,他的课在B站上有,讲的非常细致清晰,但是对我来说太难,坚持不了,有兴趣的同学可以去看。

什么是好算法呢?正确,即符合语法,能够编译、链接;健壮,即能辨别不合法的输入并做适当处理,而不致非正常退出;可读,即结构化+准确命名+注释......这些方面对于算法来说都很重要,但都不是这里最最关注的,好算法最关注的是效率(efficiency),就是说速度尽可能快,存储空间尽可能少。哈哈,这是啥意思呢?邓俊辉老师讲了,“既要马儿快快跑,又要马儿吃的少”。这是非常现实接地气的事儿哈,现实中资源是非常有限的,那么提高效率,优化资源使用是创新之外的重中之重。1976年,沃斯(N. Wirth)讲了程序等于算法加数据结构,这是我们经常听到的一句话。邓俊辉老师给出新的公式,即算法加上数据结构的和再乘以效率就等于计算,那么,效率越高的话,最后的结果值越高,值越高,对这个计算的评价越高。

Algorithms + Data Structures = Programs    //N. Wirth, 1976
(Algorithms + Data Structures) * Efficiency = Computation    //邓俊辉

王争老师见解也是一样的,“数据结构和算法本身解决的事‘快’和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间。”

庖丁解牛——复杂度分析

执行效率是算法最重要的考量指标,那么如何衡量你我编写的算法代码执行效率呢?那就是复杂度分析,它分为时间复杂度分析和空间复杂度分析。要想掌握复杂度分析到庖丁解牛的地步,就需要先认识规律然后多练。

我们需要一个不用具体的测试数据来测试,就可以粗略地估计算法的执行效率的方法。这就是要引进的非常重要的表示法——大O记号

大O记号是从哪里来的呢?是从T(n)来的,T(n)即所有代码的执行时间,而每行代码的执行次数是f(n),所有代码的执行时间和每行代码的执行次数成正比。

这里有一个规律出现,公式来了:

 n表示数据规模大小,f(n)表示每行代码执行的次数总和。公式中的O,表示代码的执行时间T(n)与f(n)表达式成正比。

这就是大O时间复杂度表示法。大O记号实际上并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以也叫渐进时间复杂度(asymptotic time complexity),简称时间复杂度。

时间复杂度分析有三种比较实用的方法:

复杂度量级

具体的案例分析看课程里老师的详解。复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来分析算法执行效率与数据规模之间的增长关系,可粗略地表示,越高阶复杂度的算法,执行效率越低。常见的复杂度并不多,从低阶到高阶有:O(1)、O(logn)、O(n)、O(nlogn)、O(n^2)。复杂度分析并不难,关键在于多练。以后就跟着老师的思路学习、练习,嗯,达到庖丁解牛的程度。

时间复杂度分析四方面 

 首先看前三个,最好情况时间复杂度,就是在最理想的情况下,执行这段代码的时间复杂度;最坏情况时间复杂度,就是在最糟糕的情况下,执行这段代码的时间复杂度;平均时间复杂度应该叫加权平均时间复杂度或者期望时间复杂度。实际上,在大多数情况下,我们并不需要区分最好、最坏、平均情况时间复杂度三种情况。很多时候,我们使用一个复杂度就可以满足需求了。只有同一块代码在不同的情况下,时间复杂度有量级的差距,我们才会使用这三种复杂度表示法来区分。

你说,还有一个均摊时间复杂度呢。平均复杂度只在某些特殊情况下才会用到,而均摊时间复杂度应用的场景比它更加特殊、更加有限。这种情况,我们不需要像平均复杂度分析方法那样,找出所有的输入情况及相应的发生概率,然后再计算加权平均值。这事我们引进一种更加简单的分析方法:摊还分析法。大概是这么回事儿,对一个数据结构进行一组连续操作中,大部分情况下时间复杂度都很低,只有个别情况下时间复杂度比较高,而且这些操作之间存在前后连贯的时序关系,这个时候,我们就可以将这一组操作放在一块儿分析,看是否能将较高时间复杂度那次操作的耗时,平摊到其他那些时间复杂度比较低的操作上。而且,在能够应用均摊时间复杂度分析的场合,一般均摊时间复杂度就等于最好情况时间复杂度。简单的讲,均摊时间复杂度就是一种特殊的平均时间复杂度,没必要花太多精力区分他们。我们要掌握的是它的分析方法,摊还分析。

其实,复杂度分析的例子好多还是看不懂,不过没关系,看不懂就硬着头皮看,哈哈哈,只要坚持看完一遍,就会有感觉。以后还会再来看,相信下次再看时比这次更懂了,慢慢会懂的。中间间隔的时间也会缩短,哈哈哈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值