找回密码
 立即注册
  • QQ空间
  • 回复
  • 收藏

算法怎么学?微博热议

admin 2019-3-21 21:50 168人围观 C++相关

(给算法爱好者加星标,修炼编程内功)


作者:@jolestar

综合整理:「算法爱好者」(id: AlgorithmFans)已获授权


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

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

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

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

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

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

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

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

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

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

网友评论

@平成最後的号 :我一个同事,进来的时候面试,其实他基本不懂GC算法,当场硬是在我们PE的引导下自己几乎造出来了generational GC的remembered sets

@工业聚:这事儿得看天分。生活中大多数人都是排序高手,冒泡排序,快速排序,插入排序,归并排序按需灵活运用。但要变成代码等形式化的、抽象表达的场景,其算法能力难以启动。正常人都理解如何下山,却离理解机器学习里的梯度下降还很远。我们都有智能/内置算法,但要将它们赋于机器/代码,可不简单

@但丁不淡定: 我倒是觉得因果反了。稍微学过点算法的才有把现实世界的事务对应成流程的逻辑,而不是从现实的逻辑寻找算法的灵感。举个例子,你房间里椅子上的衣服,了解过 LRU 的才知道先从底部的清理起...

@邓草原:在做 kesque 的 compaction,要充分利用内存,算法是:先把有用的记录复制到硬盘新空间,边把内存中这些记录的索引也转指新空间,过程中不影响使用。最后要清理的垃圾,硬盘上的旧空间直接删除,而内存索引还指向旧空间的,先 stop world,然后遍历一遍移走。边开车边换轮胎。算法是一次梦醒后确定的。

@AshleySean:我希望我有这样的老师

虽然我知道挑老师很不对 但我真的是那种会看老师学习的人 什么时候才能改啊

我的学习生涯什么时候才能真正变得主动啊



推荐阅读

(点击标题可跳转阅读)

这份 GitHub 万星的 ML 算法面试大全请收下

集 20 年之大成,这是一本开源的算法教科书



觉得本文有帮助?请分享给更多人

关注「算法爱好者」加星标,修炼编程内功



喜欢就点一下「好看」呗~

----------------------------------------------------------------------------------------------------------------------
我们尊重原创,也注重分享,文章来源于微信公众号:算法爱好者,建议关注公众号查看原文。如若侵权请联系qter@qter.org。
----------------------------------------------------------------------------------------------------------------------

鲜花

握手

雷人

路过

鸡蛋

yafeilinux和他的朋友们微信公众号二维码

微信公众号

专注于Qt嵌入式Linux开发等。扫一扫立即关注。

Qt开源社区官方QQ群二维码

QQ交流群

欢迎加入QQ群大家庭,一起讨论学习!

我有话说......


关于进行手机实名认证的紧急通知!
按照有关部门要求,论坛类网站必须完成手机实名认证才可以进行发帖等操作。希望大家积极配合,为创建一个和谐文明的社区而贡献自己的力量。我们会对会员的隐私进行严格保密,对大家造成的不便深表歉意! 我知道了