---
title: 算法学习与问题模型
date: '2019-03-19 13:09:23'
draft: false
summary: 很多新手害怕算法，不是因为算法本身不可理解，而是把它当成需要回忆细节的知识点，而不是一组可复用的问题抽象。
slug: algorithm-learning-needs-problem-models-not-memorization
syndication:
- platform: Weibo
  url: https://weibo.com/1648815335/HlCRSp8qd
tags:
- algorithms
- learning
- engineering
topics:
- software-engineering
type: post
---

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

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

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

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

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

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

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

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

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

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