計算機專業(yè)的學(xué)生需要每天刷題嗎?
點擊左上方藍字添加"星標(biāo)",重磅干貨,第一時間送達

轉(zhuǎn)載自 | 深度學(xué)習(xí)與計算機視覺
鏈接 | https://www.zhihu.com/question/399753856

https://www.zhihu.com/question/399753856/answer/1653942986
當(dāng)然,這也不是大問題,當(dāng)進入實際工作中,無論是在教研室還是公司,管他用的是什么語言,大學(xué)課程訓(xùn)練的思維方法這時候就起到很大作用,編程語言特性很容易學(xué)會,但思維方法卻是需要幾年的訓(xùn)練積累,只要思維方式和基礎(chǔ)知識到位了,很容易就能適應(yīng)工作需要。
像題主說的,刷題如果是『看題解,然后自己寫』,然后『沒有效果』,我猜根本原因不是他不努力,而是思維方式和基礎(chǔ)知識還沒到位。
打個比方,你學(xué)打網(wǎng)球,要不要每天打一場比賽?表面上看,網(wǎng)球就是比賽,好比計算機專業(yè)就是要產(chǎn)出代碼,但是,為了打好網(wǎng)球,你不能完全靠比賽來提高水平,你先得要體力,然后對于動作技巧要掌握,知道自己的身體肌肉如何正確運動,不是說看了費德勒比賽錄像就能學(xué)會正確姿勢的,這需要在比賽之外專門訓(xùn)練,所以,在學(xué)習(xí)網(wǎng)球初期,訓(xùn)練正確的姿勢更重要,和菜鳥打比賽贏了多少分一點意義都沒有,你用錯誤的姿勢去打反而養(yǎng)成不好的習(xí)慣。
所以,如果題主覺得『沒有效果』,那么就應(yīng)該多花時間在思維方式和基礎(chǔ)知識的培養(yǎng)上,不要著急去做每日刷題。
我知道我知道,肯定會有人問:問題來了,怎么培養(yǎng)思維方式和基礎(chǔ)知識呢?
答:在大學(xué)上課要認真聽講,你爹媽給你交的大學(xué)學(xué)費,不是只讓你去刷題和拿文憑,你要對得起學(xué)費就要上課認證聽講,那些知識課堂上都講。
我知道我知道,肯定還會有人說:我們大學(xué)里老師水平很差,他們都講不明白。
答:盡量去聽,老師水平很差不代表一無是處,如果你真覺得大學(xué)水平配不上你,退學(xué),重新高考去考一個更牛的大學(xué),如果你考不上更牛的大學(xué),那么現(xiàn)在的大學(xué)就是配得上你的大學(xué),接受這一點吧。
https://www.zhihu.com/question/399753856/answer/1608833085
提問者的直覺是對的,堅持刷題一段時間后,發(fā)現(xiàn)自己并沒有得到明顯提升,這時候就應(yīng)該停止刷題。若學(xué)習(xí)效果不夠巨大,則等于浪費時間。
我先講一個類似案例。我上高中的時候我們班有一個男生熱衷于每天寫兩道奧數(shù)題,他的想法是我奧數(shù)題都會做了,以一個如此高的思維強度去應(yīng)付高考還不是簡單。最后如愿以償?shù)?,他高考失利了?/span>
寫奧數(shù)題學(xué)不到東西嗎?不是,能學(xué)到很多東西,但都是一些trick,也就是犯了聰明,小聰明啊,這些都不是數(shù)學(xué)建構(gòu)的思維,只見樹木,不見森林。他不擅長數(shù)形結(jié)合,書上的結(jié)論自己也沒有推過一遍,做題不系統(tǒng)規(guī)矩,高考自然要掛他。
刷題是同樣的?;氐降谝痪湓捴械那疤釛l件,我認為沒有編程經(jīng)驗的,近期需要找工作的,以及一年大大小小十幾個比賽的,刷題很有必要;除此之外,刷題就是浪費時間,即使分門別類去刷,效果也不見長。
繼續(xù)舉栗子,有人可能覺得刷題對提升算法思維有幫助,我們就來看看《算法導(dǎo)論》中是怎么研究動態(tài)規(guī)劃的。在介紹動態(tài)規(guī)劃的前幾章,這本書先介紹了分治法,并在動態(tài)規(guī)劃的開頭明確點出動態(tài)規(guī)劃的定義:規(guī)劃,是一種表格化解法而不是計算機代碼。在正文部分,作者先用一個裝配線問題開篇,用足足兩頁的篇幅分析了問題的本質(zhì),之后再嘗試用暴力法求解,發(fā)現(xiàn)在數(shù)量很大時暴力法需要的時間復(fù)雜度下限太高了,那怎么辦呢?哦,我們可以把這個問題先用遞歸表達出來,接著想辦法把復(fù)雜度下限優(yōu)化到最快,用for循環(huán)代替遞歸,那就初步得到了一個能用的算法。接著書里還舉了一個矩陣鏈乘法的例子去幫你加強這種優(yōu)化印象,注意,到這里,這種for循環(huán)方法還只是讀者腦中一個印象。
通過兩個例子的求解,可以開始剖解此類問題的本質(zhì)了,書中點出動態(tài)規(guī)劃兩個基本概念,最優(yōu)子結(jié)構(gòu)和重疊子問題,并對此做了剖析,再然后告訴你要做動態(tài)規(guī)劃,要構(gòu)造最優(yōu)解并且把他存起來,這就是用空間換時間。
好了,現(xiàn)在你已經(jīng)掌握了動態(tài)規(guī)劃的底層方法,就帶著這種思想去解決最長公共子序列的問題吧。完。
來看一下刷題和這種系統(tǒng)學(xué)習(xí)有什么區(qū)別。
《算法導(dǎo)論》的研究符合一般研究規(guī)律,都是發(fā)現(xiàn)問題——分析問題——解決問題——發(fā)現(xiàn)問題變種的循環(huán),這種直來直去的思維,相比于leetcode那一堆故事講的亂七八糟,強行配條件,各種暗示你該用哪種算法,實際挖了個巨坑的敘事模式不知道高到哪里去了,你這種題刷多了,在理解層面腦子就會變得很混亂。
接著來看具體的,規(guī)劃是一種表格化解法而不是計算機代碼,這叫做概念定義。試問有幾個人,一想到dp,腦子里出現(xiàn)的不是那兩個for循環(huán)?刷題時不會給出這樣清晰的定義。
再然后碰到了問題,我們首先嘗試用暴力法求解,這叫做尋找baseline,baseline是擬解決一個問題所能找到的性能不太好的方法,但能用;反過來,只要我的方法比baseline有提升,我就成功了。leetcode上的解答基本都是最優(yōu)解,你很少能看到別人從較差解法優(yōu)化過來的細節(jié)。
由于暴力法跑得慢,我們必須用遞歸把問題表達出來。這叫做具體問題的抽象化,很多刷題人寫題沒有抽象化這個過程,accpted之后也不知道自己是怎么寫出來的。
根據(jù)一個例子,我們分析dp問題的本質(zhì)是兩個概念了,這就是學(xué)術(shù)中的基本假設(shè)。知道了這兩個基本假設(shè),你才知道哪些問題能用dp做,哪些不行,到這里為止,你已經(jīng)了解了動態(tài)規(guī)劃的本質(zhì),以后碰到不管多難的題,你都可以用最優(yōu)子結(jié)構(gòu)重疊子問題去套一下,再也不怕題干挖坑了。但你自己顯然總結(jié)不出如此精煉的前提條件。
結(jié)論收束,刷題后,除了兩個for循環(huán),你不能收獲任何計算思維。
不只是算法,單純編程層面,刷題也無法提供有效反饋。提問者作為計算機專業(yè)的學(xué)生,應(yīng)當(dāng)始終以計算科學(xué)(Computing Science)的思維為目標(biāo),如果你覺得刷題除了保持手感沒有額外增益,我的建議是一道題也不要刷,多寫一道題都是浪費生命。
回到立論,提升專業(yè)思維只有一條道路,那就是不斷深入地學(xué)習(xí)計算機各個門類的建構(gòu)思想。有刷題的時間,不如多學(xué)學(xué)大神們是怎么發(fā)現(xiàn)問題和解決問題的。答主在專業(yè)領(lǐng)域也算走過不少彎路,曾經(jīng)也是個輕度刷題家,最后在國內(nèi)一些算法競賽獲得一些實在稱不上有用的榮譽,我對此問題下一些答主模棱兩可的“刷題可能有用吧”觀點持反對態(tài)度,對“刷題需要有方向和方法”觀點持弱反對態(tài)度,因為我覺得,對一個大二的學(xué)生來說,你的時間很寶貴,編程思維和計算思維還沒有成型,多刷一道題都是反動的,因為路線錯了。
https://www.zhihu.com/question/399753856/answer/1974790624
我在找到實習(xí)前,略微寫了三五道leetcode后來因為懶惰放棄了。憑著學(xué)校里學(xué)的一點點算法,基本也能磕磕絆絆地把面試級別的算法題過去。找實習(xí)面了兩個廠,字節(jié)掛在二面算法了,騰訊一波過了。
后來因為劃水(反卷斗士就是我)沒能在騰訊轉(zhuǎn)正,就秋招唄。
然后還是懶,不想寫題。就硬著頭皮找,反正就看面經(jīng),看別人考什么算法題了,就記一下。華為和美團的面試很順利過了,分別拿到sp和ssp。其它廠子基本不是因為算法題掛掉的。
正經(jīng)建議
所以我的建議是給和我類似的普通人的,讓你用最少的時間,最安逸的過程取得性價比最高的結(jié)果(最字夸張了,大概是這么個意思)
建議1 不要死磕leetcode,個人感覺大部分人瓶頸并不在于算法題,而且面試的算法題并不算太難。我沒有任何競賽經(jīng)歷,也沒刷過題,憑課堂知識和臨時抱佛腳也能過個七七八八。但是我也不推薦學(xué)我直接躺平。把高頻考點做一做看一看,我感覺就差不多了,更多的時間應(yīng)該花在基本功和項目上。
建議2 深挖一個或兩個知識點。面試中,一般會就一個問題展開問答,直到面試官和面試者其中有一個人不會為止。如果能在某一個知識點上讓面試官閉嘴,是一個相當(dāng)加分的點。
建議3 了解各種框架模型的設(shè)計思想,在場景題時能夠給你更好的解題思路。即便自己依然不理解為什么,但是信手拈來地"引經(jīng)據(jù)典",也許會讓面試官感覺你的實戰(zhàn)經(jīng)驗豐富。
其它的以后想到再更
總的來說,我不推薦像高贊們說的那樣看大部頭的書(看不進去?。。?/span>
https://www.zhihu.com/question/399753856/answer/1790194123
學(xué)會在刷題時分類總結(jié),比如說鏈表的部分,插入/刪除節(jié)點/查找倒數(shù)第k個節(jié)點,這些都是常考的題,你在做題之前更應(yīng)該知道他的思路是什么。然后還有一些trick,像有的題要在頭節(jié)點之前增加一個啞節(jié)點。
網(wǎng)上也有現(xiàn)成的總結(jié),然后你再把其他章節(jié)也這樣過一遍,面試中手撕代碼的環(huán)節(jié)基本就沒問題了。
在平時生活中我認為要做的是多寫代碼,培養(yǎng)自己對技術(shù)的興趣。體會在現(xiàn)實生活中用計算機解決問題的喜悅。刷題只要在找工作之前突擊一下,就沒太大問題了。
END
整理不易,點贊三連↓
