午夜咖啡午夜咖啡

jolestar 的文章与笔记。

Post

算法学习与问题模型

2019-03-19 13:09:23Post

很多新手害怕算法,不是因为算法本身不可理解,而是把它当成需要回忆细节的知识点,而不是一组可复用的问题抽象。

一个刚毕业没多久的朋友面试后,给我说面试官问了垃圾回收算法相关的问题,他回答的不好。

我接着问了他几个算法相关问题,发现他回答的时候在努力回忆看过的书以及代码细节,没把握住关键点。

很多新手朋友都有这种问题,遇到算法类的问题就觉得复杂,敬而怕之。实际上算法就是解决问题的一系列可精确描述的步骤,日常生活中也遇到,只是要求没那么精确罢了。

比如垃圾回收的问题,你就假设自己要打扫房子,但房子里还有人活动,再不断制造垃圾,你怎么打扫?

最简单粗暴的办法就是把人赶出去,打扫完了再进来。这就是所谓的 stop world 模式。如果你打扫的足够快,这种办法其实也可以用。

那如果房间比较大,垃圾比较多,这种办法不可接受怎么办?你发现打扫卫生的时候时间耗费在判断一个东西是不是垃圾上了。于是你想了个办法,先把每个垃圾都打上标记,标记完了再 stop world,快速清理。这就是所谓的 Mark-Sweep。

那如果垃圾和有用的东西混杂在一起,即使清理完屋里也乱糟糟的怎么办?那就顺便整理下呗。先腾出一块空间,把有用的东西搬到那边整理好。其他的垃圾清理掉。这就是所谓的 Copying 整理算法。

那如果空间本来就小,弄一块空的空间不容易呢?那就把上面两个办法结合下呗,一遍标记一遍整理。就是所谓的 Mark-Compact 算法。

再后面的优化就是能不能分成不同的区域用不同的算法(分代)?如果你再请几个帮手来一起打扫会如何进行(并发)?虽然越来越复杂,但理解了前面的问题,它的优化点也就容易理解。

所以要学习算法,先要用平常心待之,以常识推理,前面这些算法,你找个打扫卫生的阿姨,把场景描述清楚,她大概也能想出差不多的办法吧。先用从简单粗暴的方法入手,再进一步理解优化细节,不要一开始就陷入了细节中去。有的人能从解决纯算法问题中寻求到快感,还有一种人对纯算法问题无感(比如我),就要把算法和真实问题场景结合起来,和实际应用结合起来。