算法学习的新阶段

算法学习的新阶段

最近忙得一塌糊涂,所以根本没时间总结整理学习成果了。之前刚开学不太忙时写了几篇都没写完,因为发现面前开启了一道道大门,想系统整理的东西太多了。于是时隔快两个月,先发一篇以作记录,系统整理只能等到暑假开始时了,如果觉得有些水还请见谅……


1.基本数据结构

一开始接触到算法是在大学,具体有什么用也不清楚。但老师一般都说:算法+数据结构=程序。当时听起来觉得太重要了(确实重要,但现在知道了,程序的世界何止算法和数据结构这么简单),得好好学!学习过程很机械化,就是跟着老师的讲解和作业,用C++动手实现一个个基本的数据结构及操作。从单向链表、双向链表、各种二叉树…… 以为这就应该是算法了吧。

工作以后,随着时间的流逝,当年学过的各种知识也跟着一点点遗忘了。什么双向链表的结点插入、二叉树的左旋右旋,早忘得一干二净!到最后也只是会用JDK里的List、Set、Map。大家都在天天用,感觉好像也没什么神秘的。于是我开始看起《算法导论》(Introduction to Algorithms,CLRS),都说是好书,第一遍把基础数据结构看了一半吧,真没感觉好…… 然后又看了一遍数据结构,开始对数据结构的内部构造及每种结构相关的算法有了扎实的记忆。比如哈希表是如何解决冲突的,就能联系到JDK的HashMap。看了红黑树,就能联系到TreeMap等等。于是以后选择数据结构时,更加的谨慎了!

可是只会最基本的,碰到了现有数据结构无法解决的问题怎么办呢?这就需要从现有经典的数据结构上,根据不同的需求,扩展出自己的结构,即数据结构扩张。


2.数据结构扩张

当我第三次看《算法导论》时,终于把数据结构的前14章看完了。当时觉得最精彩的是第14章,数据结构扩张(Augmenting Data Structures)。这才叫数据结构嘛!根据需求,对基本的数据结构进行合理的改造,从而解决碰到的具体问题。例如,在树结点上做文章,改造出区间树等数据结构。第一次感觉到了算法的威力!

但虽然此时对数据结构已经非常熟悉了,却还不清楚同一类中到底哪个好哪个差呢?也不清楚自己设计出的新数据结构性能怎么样?这时就要用到科学的方法分析算法的优劣了。


3.分析模型和大O

之后又开始接触到各种其他算法书,每本似乎都会先讲大O。之前看《算法导论》时前面的很多理论部分都略过去了。于是抽时间开始研究到底大O是什么。分析模型还比较好理解,将计算机抽象成内存无限大、每条基本指令都消耗同等时间的模型。而大O则是在衡量算法的上界,而且是当输入规模相当大时的极限值。突然领悟到算法的确是“做大事”用的,像日常普通的开发,输入就那么几个数据的话,用什么数据结构存,用什么算法算,似乎都没什么差别!但是当输入规模逐步增大时,代码的优劣立现!

《算法导论》中各种分析都看不大懂,一直以为知道算法的最坏情况是O(n)、O(logn)还是O(nlogn)就可以了。有的书也说了,平均情况的分析是非常复杂的。结果发现自己被“蒙骗了”,上界对于有些算法来说,能传达给我们的东西太粗略了,平均情况的分析真的很重要!


4.新学习阶段

老师说worst-case的性能分析是本科就该掌握的,研究生要做的是:用coin-flipping模型(二项分布)去分析算法的平均情况,于是我们会看到CLRS中大量概率论知识在算法中的应用。但这还不够!正如CLRS所说,很多算法的平均情况跟最坏情况的复杂度是一样的,那废了很大力气分析出来的平均情况运行时间不就没用了吗?这时就要WHP登场了!

WHP全名是With High Probability或者High Probability Bound。它的用处呢就是:证明算法有极大概率能以不错的时间复杂度运行。如果能证明这一点,那被证明的算法就又有用了!即便它的平均和最坏情况时的表现不好,但它“掉链子”情况的概率是很小很小的。

之外,均摊分析(Amortized Analysis)也是让我们更准确了解算法的一个手段。例如数据结构栈提供了几个API函数,每个的复杂度不一样,但这几个API是有顺序依赖关系的,例如我们使用栈时都要先push再pop等等,所以考虑顺序的话,均摊下来我们能计算出更加准确的运行时间

除了更准确的分析手段,还有更多样的分析层面,例如从外部存储(磁盘)使用情况分析、从多核并行执行分析等等。这里也就只能先列举一下了,过后一定详细整理!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值