当我读完第一本算法书后

读《算法图解》有感

《算法图解》应该是我今年读完的第49本书了。但是很惭愧,因为这只是我今年看完的第一本技术类书籍。算法知识在国内互联网公司面试中应该算是比较重要了,特别是在一二线大厂。而程序归根到底是数据结构+算法,算法的重要程度应该是不言而喻的。

俗话说的好:只输出价值观,而不讲方法论都是在耍流氓。窃以为,学习算法,没有什么捷径可以走,无非是“时间少,看书;时间多,看视频;多敲多想”十四字方针而已。本人比较喜欢看书,最近看的《算法图解》恰巧觉得还真不错,特此来推荐一波。当然了,本人是以Java为主攻方向,而这本书的代码示例都是用python来实现的,就阅读体验上来说未免让人有些不快。为此,我特意将书中的python代码都一一翻译成了Java代码。翻译的博客链接放在了文末,感兴趣的朋友可以去看看哦!

下面言归正传,我想分以下两点来给大家说说《算法图解》这本书:

  1. 这本书有什么亮眼之处
  2. 为什么要学习算法?我看完了《算法图解》这样一本算法书之后有什么感受。

亮眼之处

那么,这本《算法图解》有什么亮眼之处?其实书的封面已经告诉我们了:

在这里插入图片描述
首先,既然这本书叫《算法图解》,一定是有着大量图示的,所以讲解方面会更加的生动形象。我们都知道,人的左脑分管逻辑思维,右脑分管象形思维,而人对于图像的记忆理解能力是文字的数十倍甚至上百倍(在一本书里看到过,具体多少忘记了)。还记得,我第一次接触算法书还是大学时期学校发的教材《数据结构与算法》。我当时对于那本书真的是一言难尽:深奥晦涩的讲解,动则大段没有讲解的伪代码。感觉那本书不是为了让人更好的理解而写,而是为了“炫技”。当然,很有可能是我境界太低了吧。

其次,在书的标题下面有着这样一排红字:像小说一样有趣的算法入门书。当然,它并没有挂羊头卖狗肉:借着算法的名义写小说。看完这本书,你对于算法将会有一个初步的了解(当然,这只是算法入门书,算法大牛想必就不需要了):你将明晰算法的基本概念,如何用大O表示法(时间复杂度)去衡量一个算法的性能(这本书没有怎么考虑空间复杂度)以及了解一些基本的数据结构,剩下的当然就是学会一些基本而又常见的算法。

而这本书的有趣之处就在于两点:

  • 一是运用大量的类比,例如将计算机比作很多抽屉的集合体,散列表突然变成了一个杂货店的收银员…
  • 二则是在讲解的过程中具有很强的故事性,学习递归算法变成了一个在祖母家阁楼的神秘手提箱中寻宝的过程,而在动态规划算法的学习过程中你又将化身成为小偷,思考“偷东西”的最优策略…

为什么要学习算法?

下面再来回答一个问题,也是我问过自己的一个问题:为什么要学习算法?

其实我身边有一部分朋友认为学习算法是没有太大必要的。作为一名后端开发,其实就像是公司的一颗螺丝钉,大多时候都是做的一些CRUD的工作,可能并没有涉及到太多甚至几乎不会涉及到算法知识的运用。就算要用到一些高深的算法,也是有专门的人员写好了,我们再来直接调用即可。

当然,我之前也是这么认为的,我刚开始学习算法知识也仅仅是因为觉得蛮有趣而已。

直到我在工作过程中遇到了一个需要在原有的基础之上排序再展示的需求。记得在排序之前,几乎是秒展示;但是在经过排序后,可能需要1-2秒的时间。虽然花的时间仍不多,但前后一对比,就能感觉到明显的停滞感。那么如何优化这个排序以便提升速率呢?若是不懂算法知识,只怕是书到用时方恨少咯。或者只能安慰自己说:反正功能已经完成了,问题不大。还记得,当时我通过调整排序算法为快速排序以及结合空间换取时间等策略成功将速率优化到几乎等同于没排序之前的速率时,那种满满的成就感。

新的感受

那么,学习算法之后你会有什么新的感受吗?你可能会发现这个世界多了一些新的东西,或者看这个世界的时候,似乎多了一个角度、多了一分透彻。当你上网查单词却输错单词时,看到下方提示的你可能想要输入的单词,你可能会会心一笑:动态规划算法。又或者,当你像我一样使用百度地图看到下方这样的路线指引时,不禁莞尔:这不就是最短路径算法多绕了个环,百度的程序员小哥哥还不快去改bug。
在这里插入图片描述
甚至当你玩游戏的时候,也会觉得和平时不一样。就像我平时比较喜欢玩王者荣耀,最近玩韩信比较多,就想买一个韩信街头霸王的皮肤。
在这里插入图片描述
但是在购买点券的过程中发现这样一个问题:
在这里插入图片描述
我竟然不能够随心所欲的购买点券数量,只能按照腾讯规定的数量购买点券。这应该是腾讯为了刺激用户消费所设置的规则。毕竟自己去凑点券数量也不太好计算,嫌麻烦的用户可能就会直接购买超量的点券。但是这个时候我突然就想挑战一波,于是阐述问题:

如果我想买一个韩信街头霸王的皮肤,已知皮肤的价格为888点券,而我有50点券的优惠卷,余额为8点券,也就是说我需 要购买830点券。但是购买点券的数量又不能随心所欲,如上图所示。但是因为最小单位是1元,也就是10点券,所以我肯定可以凑的刚刚好。问:如何花最少的次数刚好买到830点券?

然后运用简单易行的贪心算法,可编程求得:
在这里插入图片描述

具体求解代码求解过程,可查看博客:贪心算法求解:王者荣耀购买点券最优策略

就像我很喜欢的辩手陈铭在奇葩说讲的那样:

我们坐在同一个舞台上,我们真的看到的是一样的事情吗?我刚才所说的每一位因为背后的知识结构和知识背景不同,他看到的是一个又一个不同的而五彩斑斓的平行世界。而算法的世界如此奇妙,你们就不想进去看一看吗?美不美呢?

在这里插入图片描述
最后,贴出本人翻译的博客链接:

肝了几万字,送给看了《算法图解》却是主攻Java的你和我(上篇)

肝了几万字,送给看了《算法图解》却是主攻Java的你和我(下篇)

本人才疏学浅,权当抛砖引玉,若有不足之处,还望各位雅正。

若能顺手给个赞,更是不胜感激!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值