寫不出數據結構的人是不是不適合編程?

書上原理我都明白了比如說樹,可是自己動手用C實踐這種結構卻不行,必須看別人的代碼。

還有鏈表原理我也知道,不看書上的尾插法自己連創建都不行。

智商太低是不是不合適學編程?

更不要說演算法了。


不是不適合,是沒花心思。

我當初看到了「冒泡排序」的思路後,就想自己實現一個。那時候我是自學C,之前沒有任何編程經驗。而且C語言也才學了基本的語句和數組而已。

為了實現這個排序,足足花了四五天的時間,那時候就是不斷的寫代碼驗證,修修改改。調試。

用筆在紙上演算。給定五個數,第一次比較後,它們的順序如何,第二次運行後順序如何。然後看著紙上的演算去寫代碼,寫出來後調試,不斷的調試。看每一個循環後的結果和紙上的演算一樣不一樣。最後在不斷的寫代碼和調試下終於寫出來了最簡單的冒泡排序。

原始程序只能排序五個數,然後自己琢磨修改下,就能支持很多數的排序。

最後面學鏈表,就在網上搜索了下鏈表實現思路。然後看看別人的代碼,自己拿筆在紙上畫畫內存示意圖,一個小時不到就實現了最簡單的單鏈表。

編程就是邏輯性的東西,只要你花心思,不怕麻煩。一步一步去驗證,去寫。肯定能寫出來。

不要一上來就先看代碼。先弄懂了思路,在去寫代碼,才是事半功倍。直接去看代碼,不了解思路。那沒有別人代碼參考了,還是寫不出來。


據我了解,大多數程序員一般採用:

面向搜索引擎的編程

面向運氣的編程

面向複製粘貼的編程

面向面向耗時間的編程

面向教科書的編程

很多行業其實都是頂尖那一部分人負責腦力勞動,其他人負責體力勞動,碼農也不例外。如果只追求一般的生活,有沒有腦子其實並不重要。鑒於很多離了IDE helloworld都寫不出來的人都活的很好的現狀,不能徒手寫樹沒什麼大不了的,你一樣可以活的很好。

/*
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O = /O
____/`---"\____
." \| |// `.
/ \||| : |||//
/ _||||| -:- |||||-
| | \ - /// | |
| \_| ""---/"" | |
.-\__ `-` ___/-. /
___`. ." /--.-- `. . __
."" "&< `.___\_&<|&>_/___." &>""".
| | : `- `.;` _ /`;.`/ - ` : | |
`-. \_ __ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-"======
`=---="
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
佛祖保佑 永無BUG
*/


我是來鼓勵你的。

大多數科班畢業的,都不會演算法和數據結構。

所以如果你不面頂級公司,你只要準備好面試必問的演算法題和數據結構題就夠了。

給五六千塊錢,還要問複雜的數據結構 演算法的公司就是耍流氓啊


其實到現在我也不是很懂數據結構,在要使用的時候在溫習學習並付之於實踐,沒有合適不合適,只有努力不努力


怕什麼。。我當初笨到什麼地步連我自己都不敢相信,自己想了兩個小時的困局基友2分鐘就幫我搞定了。。

然後一個普通普通的二叉樹,很基本的那種,理解不了遞歸,然後沒辦法,一層一層的手寫,軟磨硬泡也搞定了。

知乎上90%的人智商都高於我的,肯定可以的。。多弄幾次不就行了。熟能生巧。

PS:現在我還在看回溯。。八皇后


當初我大二的時候,鏈表都不會寫呢,主要是指針沒理解好,思維方式沒適應。

我的解決方法就是,背下答案,時不時寫一下。過段時間就想透徹了。

鏈表都不會,就不要寫樹了。學習是有個過程的。么么噠!


編程只是個語言,它本質是用來實現演算法和數據結構等抽象方法的工具而已。所以學編程學到最後一定是拼數學方面的技能的。

打比方說你會寫英語不算什麼,但要寫牛逼的論文最終還是要靠文章的邏輯思維取勝的。


我不信你照著寫好的代碼慢慢理清思路,寫個十遍會完全沒一點頭緒。


用的多了,就會寫了……


因為純理論的數據結構毫無實際意義,你設想一個能和實際關聯起來的例子,比如:

鏈表:用來存一個電話簿,可以動態添加/刪除其中某個聯繫人。

樹:你家的族譜,每個節點都是一個人。

類似這樣的例子先在腦中構建一遍,然後根據你知道的原理再去寫。


堅持學習堅持練習,至少你也得到半年後再來談這個問題。淺嘗輒止不是正確的態度。


哈哈,我到現在也不會默寫樹和圖...


看到題主的問題,我表示我有過類似經歷。

我第一次接觸的數據結構是圖,當時也不是上的初學者的課,反正腦子裡可以形成用圖怎麼完成演算法邏輯,但是我就是不會寫代碼不知道怎麼實現。

於是我就從頭來過,將C語言鞏固了一遍,基礎打好之後,我就慢慢可以看懂別人的代碼實現。學習可以從模仿開始,現有很多基本的數據結構都有人做了比較好的基礎實現,所以如果你有興趣學好的話,不妨先模仿別人怎麼實現的,理解其中的原理,想想別人是怎麼實現的。

不要灰心,多實踐。

關於書目,有人推薦《數據結構與演算法,C語言描述》,我不知道這本書是否適合你,反正當時我看這本書是看不下去的。

後來我的數據結構基礎都是靠演算法集訓學習的,實話說嚴蔚敏的《數據結構》雖然錯誤很多寫的很冗長,不過我比較喜歡看書所以當時上數據結構課程的時候還是藉助了這本書理解一些東西。(我感覺提到這本書我會被吐槽了)

如果還有什麼地方不理解的話,CSDN上很多人寫過比較好的博文,不妨多參考一下。


正常人中,沒有誰生下來就比人笨的,模仿是創新的開始。多思考,多寫寫,那些知識就會成為你的,而不是書上的


懂原理,寫不對,看來是不會維護不變式,每個數據結構若知道原理,實現難點就在於維護好狀態不變數。確保對數據結構狀態的每一次修改,都要維護好不變數。剛寫時多插入不變式斷言,這樣出錯時就知道哪裡錯了,調試也方便。選對教材也很重要,國內教材多不強調不變數的重要性,多靠死記硬背。可以看sedgewick的演算法第四版,aho的foudation of computer science 和cmu的imperative language 課程,課程用c0,自身支持前條間,後條件,很便於學習實現數據結構。爪機不方便,格式不好回校再改。


你適合當碼農,不適合當工程師


以前我也不怎麼會寫數據結構,後來,實驗老師讓我去給大一新生上C語言課,前幾天慌了,怎麼辦,怎麼辦,要不要複習,然後談戀愛,看電影,完全忘了備課,然後上課,心理慌了神,就硬著頭皮照著書念演算法基礎結構,然後邊說邊寫,一節課基本上晚上鏈表大部分操作,然後小弟弟課間都過來說,學長厲害。

我說沒什麼沒什麼,努力學習罷了

心理其實在想:

1.媽蛋這也能讓寫出來,我還事很厲害的。

2.有沒有美女學妹是否因為這樣而偷偷愛上我。

3.次奧,計算機專業怎麼會有美女,嘔。

4.下節課要繼續講雙向鏈表,我要不要看看書。

5.我這麼天才還是算了,和學妹聊聊天更好。

然後第二節課,邊念邊寫,把雙向鏈表也實現了一遍。

後來花了一個月把鏈表和樹的大部分都數據結構和演算法實現了一遍。

那麼我是怎麼做到的呢,只不過是吧數據結構具現化了,比如鏈表,樹要首位相連就是指針,然後往後掛節點就是指針互指。其實慢慢去思考和實現這些至少鏈表和樹的數據結構是很簡單,圖要麻煩點,有的東西還是要動動腦子,不過也沒什麼。

說白了,是否就是認真實現過,後來我鏈表各種面試和其他的場合加起來有30邊左右了。怎麼也忘不了,看到了結構理解他並且實現它


是呀,說「自己智商不行」要比自己去不懈地努力要來得容易得多。

一個數據結構及相應演算法,了解它的原理很容易,但了解不意味著[透徹地理解]。只要你掌握了C語言,並透徹地理解了一個演算法,那麼毫無疑問你能夠清楚地用C語言描述出這個演算法。

要想達到透徹的理解,你可以去看經典演算法的動態圖,可以用demo不斷地實驗來驗證自己的想法,甚至可以先記下來留待以後慢慢消化...或許以我們大多數人的努力程度,還遠沒到拼天賦的時候。


說明你c語言指針不熟練,碰到二維的就不知所措了,對嗎?


題主別灰心,以前我也寫不出來,可是後來我學了點ML語言的皮毛,瞬間就會了


推薦閱讀:

有沒有求多邊形的狹窄部分的演算法?
Unity3D 如何做好版本控制?不限於腳本,包括圖片,模型等二進位文件。
paxos日誌回放應該怎樣去做?
喜歡編程語言理論,國內有什麼好去處?
C++ 編程過程中,有哪些常犯的壞習慣,哪怕對於多年經驗的程序員也會出現?

TAG:編程 | 數據結構 | 編程學習 | CC |