前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >六千字干货文:到底要怎么去学算法?

六千字干货文:到底要怎么去学算法?

作者头像
五分钟学算法
发布于 2019-09-03 09:37:36
发布于 2019-09-03 09:37:36
62701
代码可运行
举报
文章被收录于专栏:五分钟学算法五分钟学算法
运行总次数:1
代码可运行

文章有所删减,原文链接在此:liuyubobobo

作者 | liuyubobobo

来源 | 是不是很酷

前言

此文对我影响很大,分享出来给大家,愿大家早日成为大神。

1)不要完美主义!

我观察到的大多数同学犯得最最最最大的“错误”,就是在学习上“完美主义”。乃至后续很多其他的问题,在我看来都和这个问题是直接相关的。

举个最经典的例子,也是我经常举的例子,背英语单词(在这里我们先不聊背英语单词是不是好的英语学习方法,我们只看如果我们想要背英语单词的话,应该怎么背)。

我发现很多同学拿着红宝书,第一个list都没翻过去就放弃了。这是因为每天背完第一个 list 以后,第二天会发现:第一个list还是有很多单词没掌握,然后就继续背第一个 list。然后一周后,发现自己第一个 list 都搞不定,觉得英语好难,彻底放弃了。这就是“完美主义”:不把第一个 list “彻底”掌握不肯继续前进。这样是不对的。背了一个list,能多记一个词,都是进步。就算一个词都没记住,模糊有了印象,也是一种进步。

我们不应该过度着眼于我们还不够完美。

学习不是要么 0 分,要么 100 分的。80 分是收获;60 分是收获;20 分也是收获。有收获最重要。但是因为着眼于自己的不完美,最终放弃了,那就是彻底的 0 分了。

仔细想,这种“完美主义害死人”的例子特别多。我看到过很多同学,其实是在学习的路上,被自己的“完美主义”逼得“放弃了”——由于学习中有一点没有做好,遭受到了一点点挫折,最终就放弃了整个学习计划。每个人都一定要接受自己的不完美。想开一点:我们都不是小升初考了满分,才能上初中的;也不是中考考了满分,才能读高中的;更不是高考考了满分,才能念大学的;将来也不会是大学所有科目都是满分,才能出来工作。不完美其实是常态,根本不会影响我们学习更多更深入的内容。但是在自学过程中,很多同学却要求自己在自己制定的每一步计划中都达到“完美”,才进行下一步。最终结果,通常都是“放弃”:(

可能有的同学会跳出来反驳我:学习当然要认真啊!在这里,我必须强调,我所说的“不要完美主义”,和“学习认真”是不冲突的

什么是“完美主义”,什么又是“囫囵吞枣”,这是一个“度”,每个人其实不一样。不要“完美主义”,不代表学习可以草率前行。

每个人都必须要找到适合自己的学习节奏。我的经验是:在一些情况下,问自己一句:是不是自己又犯“完美主义”的毛病了:)

2)不要过度“学习路径依赖”,学习要冲着自己的目标去。

什么意思?就是现在信息太发达了,对于大多数领域的知识,网上会有很多所谓的“学习路径”。我不是说这些学习路径没有用,但是不能“过度”依赖这些所谓的学习路径。

比如,很多同学想学机器学习,大多数学习路径都会告诉你,机器学习需要数学基础。于是,很多同学就转而学习数学去了,非要先把数学学好再去学机器学习。可是发现数学怎么也学不好(在这里,可能完美主义的毛病又犯了),而机器学习却一点儿都没学。最终放弃了机器学习,非常可惜。

其实,如果真正去接触机器学习,就会发现,至少在入门阶段,机器学习对数学的要求没有那么高。正因为如此,我一直建议:只要你在本科接触过高数,线数,概率这些科目的基础概念,想学机器学习,就去直接学习机器学习。学习过程中发现自己的数学不够用,再回头补数学。在这种情况下,数学学习得也更有目标性,其实效果更好。

类似这样的例子还有很多,很多同学想学习做 iOS app,就先去精通 Swift 语言,或者想做android app,就先去精通 java 语言。在我看来大可不必。以我的经验,只要你有一门编译型语言基础,大概看一下这些语言的基础语法,就可以直接上手 iOS 或者 android app 的开发了。先能做出一个最基本的 app,在这个过程中,就会意识到语言特性的意义,再回头深入研究语言也不迟。此时还能结合真实的开发任务去理解语言特性,比没有上手 app 开发,抽象地理解语言特性,有意义的多。

虽然我一再强调对预算法的学习,语言不重要,但还是有很多同学表示,要先把 C++ 学透,再回来把课程中的算法学好。这是完全没必要的。事实上,在我的这两门课程中,我看到的收获最大的同学,是那些能够把课程中的算法思想理解清楚,然后用自己熟悉的语言去实现的同学:)

依然是:不要“过度”学习路径依赖,什么叫“过度”,每个人的标准不一样。每个人都需要寻找自己的那个“度”。

3) 不要迷信权威的“好”教材。

不是说权威教材不好,而是每一本教材都有其预设的读者群,如果你不在这个预设的读者群的范畴里,教材再好也没用。最简单的例子:再好的高数教材,对于小学生来说,都是一堆废纸。

我经常举的一个例子是《算法导论》。我个人建议如果你是研究生或者博士生,已经有了一定的算法底子,才应该去阅读《算法导论》,我在我的课程的问答区,也谈过如何学习使用算法导论。

但是对大多数本科同学,尤其是第一次接触算法的同学,《算法导论》实在不是一个好的教材。

但很可惜,很多同学在学习中有上面的两个毛病,既过度路径依赖,别人说《算法导论》好,学习算法要走学《算法导论》这个路径,自己就不探索其他更适合自己的学习路径了,一头扎进《算法导论》里;同时还“完美主义”,对于《算法导论》的前几章,学习的事无巨细,但其实接触了很多在初学算法时没必要学习的内容。最后终于觉得自己学不下去了,放弃了对“算法”整个学科的学习。认为算法太难了。

诚然,算法不容易,但是,一上来就抱着《算法导论》啃,实在是选择了一条完全没必要的,更难的,甚至可能是根本走不通的路。对于一个领域的学习,了解市面上有什么好的教材是必要的,单也不能迷信权威教材。每个人必须要去探索学习如何寻找适合自己的学习材料。

4)不要看不起“薄薄”的“傻”教材,这些你看不起的学习材料,可能是你入门某个领域的关键。

很多同学问我最初学习算法的是什么教材,我告诉他们是这本教材:《算法设计与分析基础》 。在这里,我完全没有推荐这本教材的意思。事实上,现在我有点儿“鄙视”这本教材。因为我在学习它的过程中,发现这本教材有很多错误(帮助它纠正错误其实也提高了我的水平:)

当然,现在这本书的版本可能也和我当时学习的版本不同了,大部分错误应该已经纠正了。)但它确实是我的一本很重要的算法启蒙教材。

关键原因是,它够薄。

在大多数时候,如果有人问我教材推荐,基本上我的回答都是,如果是入门水平:随便找一本在京东,亚马逊,豆瓣上,评分不太差的“薄”的教材,就 ok 了。

在这里,关键字是够“薄”。

因为“薄”的教材能让你以最快的速度看完,对整个学科有一个全盘的认识:这个领域是做什么的?解决什么问题了?整体解决问题的思路是怎样?解决问题的方法大致是怎样划分的?一些最基础的方法具体是怎样的。这些在初学阶段是至关重要!是让你全盘把握整个领域脉络的。

虽然通过这么一本薄薄的教材,你的脉络把握肯定不够全面细致,但比没有强太多!我看过不少同学,一上来学习《算法导论》,关于复杂度分析的笔记做了好几页,然后就放弃了,可是连什么是动态规划都不知道。这样完全没有对“算法”这个领域有全面的认识,甚至可以说根本没有学过“算法”!

先用薄教材入门,再找“厚”教材,细细体会其中的细节,是我百试不爽的学习方法。

另外,在这里,我还要强调“入门教材”,很多教材虽然够“薄”,但不是“入门教材”。大家要注意。

5)不要迷信单一教材。

很多同学理解了要找“薄”教材入门的道理,却还是非要我推荐一本具体的“薄”教材,说实话,很多时候这让我有点儿哭笑不得。

因为我随便推荐一本,我确实不敢保证它是“最好的”,“最适合你的”,但是各个领域那么多教材,我又不可能都一一看过,一一比较过。

最最重要的是,我的学习经验告诉我,在大多数情况下,学习不是一本固定教材可以搞定的。

非要找到一本“最适合自己的”教材,然后就一头扎进去,其实是不科学的。我印象很深刻,我读本科的时候,那会儿申请了一个项目,要做一个网站(那时候服务端都用 ASP.NET ),我一口气从图书馆借了 10 本 ASP.NET 的教材,然后以一本最薄的书为主干去看,发现这本书介绍不清楚的概念,马上就从其他书里找答案。

通常不同的作者对同一个事物从不同的角度做解读,是能够帮助你更深刻的认识一个概念的。基本上一个月的时间,我就从一个完全的网站搭建小白,做出了这个项目需要的那个网站。

这个习惯我一直延续,研究生的时候,对什么领域感兴趣了,第一件事就是到图书馆,借十本相关书籍回来翻看。

但是,大多数同学喜欢仅仅扎进一本书里,一旦选定了自己的学习材料,就对其他材料充耳不闻,甚至是排斥的心理。这种做法,一方面又是“完美主义”的表现——非要把这本教材学透;另一方面,其实也是“犯懒”的表现,不愿意多翻翻,多看看,自己多比较比较,自己去寻找最适合自己的材料,一味地盲目相信所谓“大神”的推荐,殊不知,这些推荐,不一定是更适合自己的材料;更何况,还有很多大神,明明是靠不出名的“薄”教材入的门,但给别人做推荐的时候,就突然变成自己是算法奇才,自幼阅读《算法导论》而所成的神话了:)

6)实践

前面说了很多和教材选择相关的话题,但对于计算机领域的学习来说,教材的意义其实远远小于实践的意义。如果仅仅是看学习材料就是学习的话,那么慕课网的视频后期处理人员就是水平最高的工程师了。因为每段视频,他们都需要看一遍。但是,很显然,仅仅是看视频,是无法学到知识的。

对于计算机领域的学习来说,真正动手实践去编程是异常重要的。怎么夸大其中的作用都不过分。

这就好比学游泳,必须下水去游泳;或者学开车,必须亲自上路。

否则你说的再头头是道,一个小学生文化水平的人,只要他开过车,游过泳,都能在这两个领域瞬间秒杀你。

很多同学都说我的算法讲得好,其实,我一直认为,这其中的一个最简单的秘诀就是:我带领大家把大多数算法都非常细致的实现了一遍;或者对其中的应用进行了非常具体的实践。

反观大多数高校教育,对于算法或者机器学习这种一定程度偏理论的学习,通常非常不强调实践。最终的结果是学习者只是接受了很多抽象的概念,但对其中具体的实现细节,却是云里雾里。

我见过太多同学,都明白什么是 O(n^2) 复杂度,什么是 O(nlogn) 的复杂度,却问我对于 100 万的数据规模,为什么自己的选择排序运行起来就没反应了。答案很简单:O(n^2) 的复杂度太慢了,100 万的数据规模太大了,一般家用计算机转选择排序一时半会儿是转不完的。这些同学一定理解 O(n^2) 的算法比 O(nlogn) 的算法慢,却没有真正实践过,不知道这个差距到底是多少。

在我的课程中,经常遇到有些同学提出这样的问题:这个算法的某句话(或者某段逻辑),为什么要写成 A 的样子,而不是 B 的样子?这种问题其实很好,但我觉得解决方法也很简单,实际的去把算法改写成 B 的样子,实际的运行试试看,看会发生什么。如果发生了错误,仔细分析一下,为什么会有错误?如果没有错误,具体比较一下:A和B两种不同的写法,为什么都正确?又有什么区别?

真正的学习上的提高,就发生在这个过程中。

我当然可以告诉给同学们一个结果,但是自己亲自实践一遍,相比阅读我给出的一个答案,自己对其中问题理解的深刻程度,是完全不可比拟的。

7)debug非常非常重要。

我看到的另一类“经典”问题就是:老师,这个代码为什么错了,然后贴一大段代码。这种问题背后,依然是,透露着学习方法的不对劲:提问的同学懒得 debug 。

在计算机领域,debug 近乎和实践是一个意思。如果只是把材料上的代码“抄”一遍,这不叫实践,这叫抄代码。小学生也能做。但是“抄”一遍,不小心没抄对,发生了错误,然后自己一点一点调试,找到错误的根源,这叫真的实践。小学生不能做。(当然,我更推崇的是:自己理解了算法的逻辑,按照自己的理解,把算法写出来:)

不过很多同学不喜欢 debug,我当然理解。其实谁都不喜欢 debug ,但是,debug 才是最重要的能力。(通常在一个领域里,你最不喜欢做的事情,就是这个领域的核心竞争力:)是计算机领域异常重要的一项技能。我见过的所有计算机领域的“高手”,不管是在哪个细分领域,都无一例外,是个 debug 好手。我经常告诉大家,在实际工作中,其实 debug 的时间要占你真正编程时间的 70%。如果你做一个项目,根本不需要 debug ,要么是你的项目对你来说太简单了,要么是你根本没有接触到这个项目的核心。

debug 不仅仅是找到代码错误,解决错误的手段,其实更是一个重要的学习手段。通过 debug,看看自己写的程序执行逻辑,哪里和自己设想的不一致?再回头看自己哪里想错了,或者想漏了,分析一下自己为什么想错了,或者想漏了,等等等等,依然是,进步就是发生在这个过程的。

在我的算法课程中,很多同学对递归想不明白,我的建议都是:用一个小数据量,一步步跟踪程序,看看程序到底是怎么运行的。通常这么做,1 个小时的时间,就足以让你深刻理解递归程序的运转逻辑。可是,很多同学懒得花这1个小时的时间,最终的结果是,花了一个下午,对着代码生看,硬想,最终还是没有理解程序的运转逻辑。

8)量变到质变。

还有很多同学,对于算法的一些问题,会问:老师,你是怎么想到用这样的方法的?对于这类问题,我的回答一般都是:你见的还不够多。

不知道是不是受高中阶段学习的影响,有一些同学特别执着于就着一个单一的问题,寻找其中的“解题路径”。当然,我不是说这是完全错误的,但也有一个“度”。

我的经验是:与其把时间花在这里,不如去见更多问题

比如动态规划,是算法学习的一个难点,很多同学在学会了背包问题的解法之后,总是执着于去追寻:是怎么想到这种状态定义的方法的。可能是我个人水平有限,我无法清楚地解释是如何想到这种状态定义的方法的。但是我的经验告诉我:再去看,去实践 100 个动态规划相关的问题,然后回头看背包问题,你会发现这种状态定义的方式非常自然。

仅仅对着一个问题思考,很多时候都是死胡同。你见识的还不够多,就不足以帮助你总结出更加“普遍”的问题解决的规律。当你见得足够多的时候,一切就都变得很自然,所谓的“量变到质变”。

不过,大多数同学在这个环节都会“犯懒”,企图通过一个问题就理解问题的本质,这其实和企图通过一本教材就精通一个领域的想法是一样的,是不现实的,不可能的。同时,这里又包含着学习过程中的“完美主义”的思想,遇到一个问题一定要把它想的无比透彻。但是我的经验告诉我:大多数问题,其实都是需要“回头看”的。随着你对一个领域理解的越深入,回头再去看那些曾经的问题,都会产生新的视角,对于很多曾经想不明白的问题也豁然开朗。这也是“进步”的根源。如果卡在一个问题上不前进,不给自己“回头看”的机会,甚至最后是放弃了,就什么也没有学会了。

所以,很多时候,你发现对一些问题“百思不得其解”,或许不是因为自己“笨”,而是因为“还不够努力”:)

9)最后,一定要相信时间的力量。

有一天,在我的一个算法课程群里,有个滴滴的后端大神发招聘,结果大家七嘴八舌的就议论开了,大致主题思想就是:自己什么时候能够成为滴滴的后端大神。这位滴滴的后端大神今年 32 岁;大多数议论的同学,其实连 22 岁都不到。我告诉他们,其实 10 年后,你们就是大神。

这其实很好理解,回想十年前,也就是 12 岁的你,和现在的你比较,是不是天壤之别?如果把你扔到一堆 12 岁的小朋友中间,22 岁的你是不是就是个大神?同理,32 岁的人,已经在业界摸爬滚打了那么多年,扔回到22岁的大学生中间,当然是大神:)

很多时候,所谓的“大神”并不神秘,很多时候,仔细观察,会发现时间有着不可磨灭的作用。只要你没有虚度时间,每天都在进步,通常结果都不会太差的。如果再加上一点点机遇,可能就不仅仅是大神。

愿大家也早日成为大神。

End

本文作者为 liuyubobobo,算法大牛,ACM亚洲区奖牌获得者,现居美国,创业者。bobo老师对我影响极大,我的算法入门和进阶都是靠他的指导,希望此篇文章对大家有帮助~

愿大家也早日成为大神。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 五分钟学算法 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用php怎么写一个用户注册登录的页面呢?
想写就会尽快去写。如果用php写了就一定要用nodejs写出来啊,不写是小狗啊! 补充一下,想要实现的功能: 1.用户名重复检测 2.检测信息填写是否完整 3.邮箱是否已经被注册 4.实现ajax无刷新 5.注册成功后跳转到一个index导航页面,并且右上角显示用户名 6.index导航页面中有导航栏,分别是:首页(显示文章) 发布文章页面(文章实现可编辑)、可评论,可分享、可赞... 7.密码长度检测并提示 html文件叫1.html,文件代码: <!DOCTYPE html> <html> <head>
用户1749219
2018/05/16
4.9K0
(防抖) 前后端防重复提交常用的那些方法
友儿
2023/10/21
9300
原生php实现自定义表单(基础类型)(特色:防止重复提交 防止输出空数据等等功能)
-- phpMyAdmin SQL Dump -- version 4.5.1 -- http://www.phpmyadmin.net -- -- Host: 127.0.0.1 -- Generation Time: 2022-03-31 14:41:20 -- 服务器版本: 10.1.13-MariaDB -- PHP Version: 5.6.21 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00"; /*!4010
贵哥的编程之路
2022/05/06
5630
原生php实现自定义表单(基础类型)(特色:防止重复提交 防止输出空数据等等功能)
防止Web表单重复提交的方法总结
在Web开发中,对于处理表单重复提交是经常要面对的事情。那么,存在哪些场景会导致表单重复提交呢?表单重复提交会带来什么问题?有哪些方法可以避免表单重复提交?
编程随笔
2019/09/11
4.9K0
防止Web表单重复提交的方法总结
【黄啊码】PHP如何防止重复提交
防抖(Debounce)是一种防止重复提交的策略,它通过延迟一定时间来合并连续的操作,以确保只执行一次。
黄啊码
2023/12/18
3430
在 PHP 中使用和管理 Session
与 Cookie 一样,Session 技术也是用于解决 HTTP 协议无状态的问题,不过,与 Cookie 数据保存在客户端不同,Session 数据存储在服务端,然后通过分配一个全局唯一的 ID 与特定用户关联(通常在用户认证通过后分配),但 Session 又与 Cookie 紧密关联,因为这个 Session ID 通常会存储到 Cookie 中,在其生命周期内,用户发起请求时就会带上它,这样服务端通过解析存储在 Cookie 中的 Session ID 就能识别特定的客户端用户,并返回与之关联的 Session 数据,比如前面提到的电商网站中的购物车数据。
学院君
2020/08/13
3.1K0
咱妈说别乱点链接之浅谈CSRF攻击
serena
2017/04/27
5.2K8
咱妈说别乱点链接之浅谈CSRF攻击
PHP+MYSQL的使用(注册页面)3
第二核心是判断他是否注册成功的关键在于他是否密码和确认密码的一致性,如果一致,则成功,否则就重新输入把 //这里在于告诉他你的第二次输入的密码与第一次输入的密码不一样
贵哥的编程之路
2020/10/28
1.3K0
JavaWeb学习(1) 使用Session和Token防止表单重复提交
前言 以前在很多p2p网站中,都有新手领取红包的活动。这样的红包链接或多或少都有很多的漏洞,就是表单可以重复提交。这样的话,对那些p2p网站或者其他类似的网站造成很大的损失。Fiddler大家都不陌生吧,就是一个抓包软件。我们先拦截url请求,Shift+R,填入压力测试的次数,然后释放,就会造成很多次的url访问请求,这样的结果很容易造成表单重复提交。那么我们的今天主题就是如何使用Session和Token防止表单重复提交 ---- 表单重复提交例子 在我们写网站的时候,肯定写过留言板的功能,但是肯定对重
用户2032165
2018/06/05
1.5K0
php实现带权限的增删改查功能
原生php实现简易的招聘网站:逻辑流程如下: 第一:boss能增删改查(招聘内容)。求职者只能看招聘内容.(权限的不同) 第二:不登录不能查看。必须登录某个账号才能查看. 第三:防止重复提交 防止输出空数据 第四:多用户的哦
贵哥的编程之路
2022/10/24
2.8K0
php实现带权限的增删改查功能
java后端解决重复提交问题
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zwb19940216/article/details/78151899
林老师带你学编程
2019/05/26
1.1K0
php案例 解决cookie失效后使用session的问题
session比cookie安全。因为cookie是把整个cookiekey=>value都存储在浏览器上面。而session只是在浏览器上面放一个ID。数据都在数据库中,所以就算sessionid被获取利用,但是session中的数据并不会被恶意程序获取,这一点相对cookie来说就安全了一些。
贵哥的编程之路
2022/09/29
1.2K0
php案例 解决cookie失效后使用session的问题
解决分布式表单重复提交问题
3.1 前端解决办法:通过前端的方法将提交按钮变灰。对于前端的办法这里就不做演示了,因为前端的控制虽然能够防止数据的重复提交但是治标不治本。这里主要介绍第二种方法。
林老师带你学编程
2019/05/25
7700
PHP的安全性问题,你能说得上几个?
所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.
全栈程序员站长
2021/12/23
8590
PHP的安全性问题,你能说得上几个?
PHP实现用户登录注册功能
初学php做了一些比较常见且有用的页面,放在上面记录一下咯 我是用了bootstrap框架里面的模态框做注册登陆页面,这样页面比较美观 页面效果:
用户8099761
2023/05/11
2.1K0
PHP实现用户登录注册功能
PHP全栈学习笔记4
JavaScript是网景公司开发的,是一种基于对象和事件驱动并具有安全性能的解释型脚本语言。
达达前端
2019/07/03
2.9K0
PHP全栈学习笔记4
JavaWeb防止表单重复提交的几种方式
(4)、ajax提交加锁 采用ajax方式提交表单时,设置一个布尔变量(true/false),当然其他类型变量也可以。初始时为true可以提交,在前端向服务器发出请求后,服务端响应结果没有回来之前将该值置为false,正常响应时再置为true。
全栈程序员站长
2022/08/04
2.4K0
相关推荐
用php怎么写一个用户注册登录的页面呢?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验