计算机专业的学生需要每天刷题吗?
点击左上方蓝字添加"星标",重磅干货,第一时间送达
转载自 | 深度学习与计算机视觉
链接 | https://www.zhihu.com/question/399753856
https://www.zhihu.com/question/399753856/answer/1653942986
当然,这也不是大问题,当进入实际工作中,无论是在教研室还是公司,管他用的是什么语言,大学课程训练的思维方法这时候就起到很大作用,编程语言特性很容易学会,但思维方法却是需要几年的训练积累,只要思维方式和基础知识到位了,很容易就能适应工作需要。
像题主说的,刷题如果是『看题解,然后自己写』,然后『没有效果』,我猜根本原因不是他不努力,而是思维方式和基础知识还没到位。
打个比方,你学打网球,要不要每天打一场比赛?表面上看,网球就是比赛,好比计算机专业就是要产出代码,但是,为了打好网球,你不能完全靠比赛来提高水平,你先得要体力,然后对于动作技巧要掌握,知道自己的身体肌肉如何正确运动,不是说看了费德勒比赛录像就能学会正确姿势的,这需要在比赛之外专门训练,所以,在学习网球初期,训练正确的姿势更重要,和菜鸟打比赛赢了多少分一点意义都没有,你用错误的姿势去打反而养成不好的习惯。
所以,如果题主觉得『没有效果』,那么就应该多花时间在思维方式和基础知识的培养上,不要着急去做每日刷题。
我知道我知道,肯定会有人问:问题来了,怎么培养思维方式和基础知识呢?
答:在大学上课要认真听讲,你爹妈给你交的大学学费,不是只让你去刷题和拿文凭,你要对得起学费就要上课认证听讲,那些知识课堂上都讲。
我知道我知道,肯定还会有人说:我们大学里老师水平很差,他们都讲不明白。
答:尽量去听,老师水平很差不代表一无是处,如果你真觉得大学水平配不上你,退学,重新高考去考一个更牛的大学,如果你考不上更牛的大学,那么现在的大学就是配得上你的大学,接受这一点吧。
https://www.zhihu.com/question/399753856/answer/1608833085
提问者的直觉是对的,坚持刷题一段时间后,发现自己并没有得到明显提升,这时候就应该停止刷题。若学习效果不够巨大,则等于浪费时间。
我先讲一个类似案例。我上高中的时候我们班有一个男生热衷于每天写两道奥数题,他的想法是我奥数题都会做了,以一个如此高的思维强度去应付高考还不是简单。最后如愿以偿地,他高考失利了。
写奥数题学不到东西吗?不是,能学到很多东西,但都是一些trick,也就是犯了聪明,小聪明啊,这些都不是数学建构的思维,只见树木,不见森林。他不擅长数形结合,书上的结论自己也没有推过一遍,做题不系统规矩,高考自然要挂他。
刷题是同样的。回到第一句话中的前提条件,我认为没有编程经验的,近期需要找工作的,以及一年大大小小十几个比赛的,刷题很有必要;除此之外,刷题就是浪费时间,即使分门别类去刷,效果也不见长。
继续举栗子,有人可能觉得刷题对提升算法思维有帮助,我们就来看看《算法导论》中是怎么研究动态规划的。在介绍动态规划的前几章,这本书先介绍了分治法,并在动态规划的开头明确点出动态规划的定义:规划,是一种表格化解法而不是计算机代码。在正文部分,作者先用一个装配线问题开篇,用足足两页的篇幅分析了问题的本质,之后再尝试用暴力法求解,发现在数量很大时暴力法需要的时间复杂度下限太高了,那怎么办呢?哦,我们可以把这个问题先用递归表达出来,接着想办法把复杂度下限优化到最快,用for循环代替递归,那就初步得到了一个能用的算法。接着书里还举了一个矩阵链乘法的例子去帮你加强这种优化印象,注意,到这里,这种for循环方法还只是读者脑中一个印象。
通过两个例子的求解,可以开始剖解此类问题的本质了,书中点出动态规划两个基本概念,最优子结构和重叠子问题,并对此做了剖析,再然后告诉你要做动态规划,要构造最优解并且把他存起来,这就是用空间换时间。
好了,现在你已经掌握了动态规划的底层方法,就带着这种思想去解决最长公共子序列的问题吧。完。
来看一下刷题和这种系统学习有什么区别。
《算法导论》的研究符合一般研究规律,都是发现问题——分析问题——解决问题——发现问题变种的循环,这种直来直去的思维,相比于leetcode那一堆故事讲的乱七八糟,强行配条件,各种暗示你该用哪种算法,实际挖了个巨坑的叙事模式不知道高到哪里去了,你这种题刷多了,在理解层面脑子就会变得很混乱。
接着来看具体的,规划是一种表格化解法而不是计算机代码,这叫做概念定义。试问有几个人,一想到dp,脑子里出现的不是那两个for循环?刷题时不会给出这样清晰的定义。
再然后碰到了问题,我们首先尝试用暴力法求解,这叫做寻找baseline,baseline是拟解决一个问题所能找到的性能不太好的方法,但能用;反过来,只要我的方法比baseline有提升,我就成功了。leetcode上的解答基本都是最优解,你很少能看到别人从较差解法优化过来的细节。
由于暴力法跑得慢,我们必须用递归把问题表达出来。这叫做具体问题的抽象化,很多刷题人写题没有抽象化这个过程,accpted之后也不知道自己是怎么写出来的。
根据一个例子,我们分析dp问题的本质是两个概念了,这就是学术中的基本假设。知道了这两个基本假设,你才知道哪些问题能用dp做,哪些不行,到这里为止,你已经了解了动态规划的本质,以后碰到不管多难的题,你都可以用最优子结构重叠子问题去套一下,再也不怕题干挖坑了。但你自己显然总结不出如此精炼的前提条件。
结论收束,刷题后,除了两个for循环,你不能收获任何计算思维。
不只是算法,单纯编程层面,刷题也无法提供有效反馈。提问者作为计算机专业的学生,应当始终以计算科学(Computing Science)的思维为目标,如果你觉得刷题除了保持手感没有额外增益,我的建议是一道题也不要刷,多写一道题都是浪费生命。
回到立论,提升专业思维只有一条道路,那就是不断深入地学习计算机各个门类的建构思想。有刷题的时间,不如多学学大神们是怎么发现问题和解决问题的。答主在专业领域也算走过不少弯路,曾经也是个轻度刷题家,最后在国内一些算法竞赛获得一些实在称不上有用的荣誉,我对此问题下一些答主模棱两可的“刷题可能有用吧”观点持反对态度,对“刷题需要有方向和方法”观点持弱反对态度,因为我觉得,对一个大二的学生来说,你的时间很宝贵,编程思维和计算思维还没有成型,多刷一道题都是反动的,因为路线错了。
https://www.zhihu.com/question/399753856/answer/1974790624
我在找到实习前,略微写了三五道leetcode后来因为懒惰放弃了。凭着学校里学的一点点算法,基本也能磕磕绊绊地把面试级别的算法题过去。找实习面了两个厂,字节挂在二面算法了,腾讯一波过了。
后来因为划水(反卷斗士就是我)没能在腾讯转正,就秋招呗。
然后还是懒,不想写题。就硬着头皮找,反正就看面经,看别人考什么算法题了,就记一下。华为和美团的面试很顺利过了,分别拿到sp和ssp。其它厂子基本不是因为算法题挂掉的。
正经建议
所以我的建议是给和我类似的普通人的,让你用最少的时间,最安逸的过程取得性价比最高的结果(最字夸张了,大概是这么个意思)
建议1 不要死磕leetcode,个人感觉大部分人瓶颈并不在于算法题,而且面试的算法题并不算太难。我没有任何竞赛经历,也没刷过题,凭课堂知识和临时抱佛脚也能过个七七八八。但是我也不推荐学我直接躺平。把高频考点做一做看一看,我感觉就差不多了,更多的时间应该花在基本功和项目上。
建议2 深挖一个或两个知识点。面试中,一般会就一个问题展开问答,直到面试官和面试者其中有一个人不会为止。如果能在某一个知识点上让面试官闭嘴,是一个相当加分的点。
建议3 了解各种框架模型的设计思想,在场景题时能够给你更好的解题思路。即便自己依然不理解为什么,但是信手拈来地"引经据典",也许会让面试官感觉你的实战经验丰富。
其它的以后想到再更
总的来说,我不推荐像高赞们说的那样看大部头的书(看不进去啊!)
https://www.zhihu.com/question/399753856/answer/1790194123
学会在刷题时分类总结,比如说链表的部分,插入/删除节点/查找倒数第k个节点,这些都是常考的题,你在做题之前更应该知道他的思路是什么。然后还有一些trick,像有的题要在头节点之前增加一个哑节点。
网上也有现成的总结,然后你再把其他章节也这样过一遍,面试中手撕代码的环节基本就没问题了。
在平时生活中我认为要做的是多写代码,培养自己对技术的兴趣。体会在现实生活中用计算机解决问题的喜悦。刷题只要在找工作之前突击一下,就没太大问题了。
END
整理不易,点赞三连↓