初試攻略丨4位高分上岸名校計算機學長分享:我考研時學數(shù)據(jù)結(jié)構(gòu)的方法!

【聲明:本文為原創(chuàng)文章,未經(jīng)同意,嚴禁轉(zhuǎn)載和抄襲,違者將追究其法律責任】
/?寫在前面的話?/
初試攻略,考研初試方法論都在這里。
很多同學在遇到數(shù)據(jù)結(jié)構(gòu)的時候,總是一臉茫然,不知道從何下手。打開書本準備學習,剛看了還不到兩三行,就開始摸不著頭腦了。今天小蘇采訪了幾位上岸的計算機碩士,讓他們分享一些他們以前學習數(shù)據(jù)結(jié)構(gòu)的一些心得。
今天分享的四位學長學姐專業(yè)課都是130+哦!
1
A學長,廈門大學計算機,初試專業(yè)課131分
我認為第一步是嘗試解決實際問題,可以在力扣網(wǎng)、牛客網(wǎng)等網(wǎng)站找到問題。這種網(wǎng)站的好處就是有非常多的算法和數(shù)據(jù)結(jié)構(gòu)的問題等待我們?nèi)ソ鉀Q,下面有其他網(wǎng)友的討論和理解,對于我們初學者是非常有啟發(fā)意義的。不停地嘗試去解決問題,久而久之就可以摸出自己不了解或不熟悉的數(shù)據(jù)結(jié)構(gòu)/算法部分。
找到了我們還不是很掌握的數(shù)據(jù)結(jié)構(gòu)/算法后,多去網(wǎng)上查閱該知識點的資料,翻閱書籍等以便自己可以更好地理解它。網(wǎng)上有很多資源可用來學習數(shù)據(jù)結(jié)構(gòu)/算法,并且大多數(shù)資源都是免費的,在這里推薦一個不錯的好網(wǎng)站,www.cp-algorithms.com,其中包含大量的數(shù)據(jù)結(jié)構(gòu)/算法列表,并給出了非常嚴謹科學的解釋。
接下來呢,絕大多數(shù)人都是了解了該數(shù)據(jù)結(jié)構(gòu)/算法的知識點之后,或者看看實際的代碼實現(xiàn),然后告訴自己“我明白了,我學會了”,然后過幾天就把它置之腦后,我以前也會犯這種錯誤。但是這是非常不好的習慣,千萬不要這樣。在學習完數(shù)據(jù)結(jié)構(gòu)/算法的一個知識點后,你應該做的第一件事就是自己實現(xiàn)它。不要只是找到別人的代碼,將其復制粘貼然后運行,不要自己安慰自己說我已經(jīng)理解了這段代碼不需要去動手實現(xiàn)它。不管怎樣,務必自己實現(xiàn)該數(shù)據(jù)結(jié)構(gòu)/算法,編寫,分析,調(diào)試等工作缺一不可,確保你真正理解它,而不是認為自己理解它。此外,修改自己的代碼會變得越來越容易,因為許多問題不僅是特定數(shù)據(jù)結(jié)構(gòu)/算法的直接應用,而且是一個曲折的問題。
編寫完自己的代碼后,還可以通過幾個實例來確保它能正常工作并理解如何使用它,這基本上算是對數(shù)據(jù)結(jié)構(gòu)/算法的直接應用。如果有時間的話,還可以繼續(xù)使用更復雜的用例,以便自己知道如何以更復雜的方式來運行它。
經(jīng)過所有這些步驟,我認為肯定會增強你對數(shù)據(jù)結(jié)構(gòu)和算法的知識和理解,希望這會有所幫助!祝你們考試順利。
小蘇總結(jié):利用力扣網(wǎng)、??途W(wǎng)進行學習,自己寫代碼實現(xiàn)!
2
B學姐,北京大學軟件與微電子學院計算機,初試專業(yè)課135分
其實我一開始學這個也很費勁,不過我是在失敗中成長,不斷地從錯誤/經(jīng)驗中總結(jié),大概有以下幾點:
步驟1:學好一門面向?qū)ο蟮恼Z言
我更喜歡Java / C ++。從解決課本上的簡單問題開始。我在本科期間學C++的時候花了很多時間在學習STL并了解其內(nèi)部結(jié)構(gòu),在以后的編碼過程總,它將成為最有用的庫之一,幫助我解決了很多問題。不只是提供了像vector, string, list等方便的容器,更重要的是STL封裝了許多復雜的數(shù)據(jù)結(jié)構(gòu)算法和大量常用數(shù)據(jù)結(jié)構(gòu)操作。
步驟2:時間和空間的復雜性
這個必須要去了解!不僅必須了解時間和空間的復雜性的計算方式,而且還應該知道如何更改時間/空間以優(yōu)化代碼。
步驟3:前期的分析很重要
遇到了問題多用筆和紙來解決,不要憑空想象。除非你對問題的邏輯很清楚,否則不要著手寫答案寫程序。前期在復習的時候,每道大題都花15-20分鐘是很必要的。如果想了很久還是想不出來,絲毫頭緒都沒有,那么就別掙扎了,看后面的答案吧。高效的復習不是要自己第一遍就要100%把這個問題給解決,而是第二次遇到類似問題時一定可以解決。過去我常常在分析怎么做這個題上猶豫,這浪費了我很多時間。
把這個題給做完了之后,要對其進行全面分析,看看有沒有把下面這些很基礎的問題給解決。
1,估算時間和空間復雜度;
2,檢查是否有重復或不必要的循環(huán);
3,通過增加空間利用率來降低時間復雜度(時間與空間之間的權(quán)衡);
4,廢棄此解決方案并考慮新的解決方案。
步驟4:保持練習
熟能生巧,這個大家都懂。我使用的一個小技巧是,把對自己而言屬于非常棘手的問題記錄在一本本子中,并每天/每周定期去復習這些問題,這將不斷地復現(xiàn)當時我們做題的邏輯,久而久之,就牢牢地掌握了這個知識點了。永遠不要去背代碼,要理解其中的邏輯并定期練習這個知識點。如果在電腦上編程的話,要多多使用調(diào)試器,如果你在調(diào)試器的幫助下可以找出BUG并修改正確,將節(jié)省大量你在數(shù)據(jù)結(jié)構(gòu)上成長的時間。
最后,要自信,每天充滿元氣呀,永不放棄??赡芎茈y,但要繼續(xù)努力。你很快就會上岸啦!
小蘇總結(jié):深入分析算法,熟能生巧!
3
C學長,上海交通大學計算機,初試專業(yè)課130+分
我是跨考生,當我第一次學習編程時,我之前都沒有讀過任何有關(guān)數(shù)據(jù)結(jié)構(gòu)和算法的書。這對當時跨考計算機的我來說,著實壓力不小。
當時我沒有使用任何花哨的數(shù)據(jù)結(jié)構(gòu)圖書,我堅持使用最簡單也是最初始的那個visio studio code。我專注于提高自己的解決問題能力:看到一個問題自己去設計解決方案并將其轉(zhuǎn)換為代碼。舉幾個例子,使用for循環(huán)打印“ *”的三角形、將錢分成較小的鈔票、對單詞或數(shù)字進行排序、檢查單詞是否是回文、打印斐波那契序列等等,一開始我一無所知,不知道從何下手。在能夠設計自己的算法之前,請執(zhí)行以下操作:
后來我通過網(wǎng)課和網(wǎng)上資料,先去了解每種數(shù)據(jù)結(jié)構(gòu)的原理,以及它們是如何運用在實例中來解決問題的。拿到答案,我逐行分析以了解每一行的工作原理以及它們整體上的工作原理。對我而言,最簡單的方法是一鍵點擊運行代碼,同時那個二叉樹是我當時最難理解的知識點了。
了解數(shù)據(jù)結(jié)構(gòu)的工作原理后,我嘗試將其與問題聯(lián)系起來。比如說當我遇到了一個隨機問題。決定不偷看參考方案。先問問自己輸入是什么?輸出是什么?使勁地去想辦法,只要想出頭緒即可,不要想著怎么用程序?qū)崿F(xiàn)它,先能找出思路即可。然后我嘗試用編程語言對其進行仿真。先在紙上畫一個流程圖,弄清楚接下來的編程的邏輯順序,然后在紙上用偽代碼先寫一遍,如果我在紙上的模擬效果很好(解決了問題),那么只需將其轉(zhuǎn)換為代碼即可。接下來我就非常有信心可以將其轉(zhuǎn)換為代碼,最后,我運行所有可能的情況并逐個修正里面的BUG。
紙上模擬戰(zhàn)術(shù)最初是我讀初中一個老師教給我的,直到現(xiàn)在,當我需要解決一個非常具有挑戰(zhàn)性的問題時,我仍然使用這種方法。
小蘇總結(jié):專注每種數(shù)據(jù)結(jié)構(gòu)的原理!
4
D學長,浙江大學計算機,初試專業(yè)課130+分
作為一名電子專業(yè)的學生,我在大學本科四年時間里都沒怎么寫代碼。后來考研選擇了考計算機,我來說說我當時是怎么準備數(shù)據(jù)結(jié)構(gòu)的。
經(jīng)過一輪的復習,至少自己應該能夠明白數(shù)據(jù)結(jié)構(gòu)的整個體系,什么是“鏈表”,什么是“?!钡?。而且這些知識點要能夠形成長久記憶,刻在自己的大腦里面。
數(shù)據(jù)結(jié)構(gòu)整個體系大概是這樣的
1. Arrays:數(shù)組是初步的東西。數(shù)組將使你了解訪問數(shù)據(jù)的線性方式以及對時間和空間復雜度的估計。
2.鏈接列表
3.堆棧和隊列
4.位運算
5.字符串
6.模式搜索算法,例如線性,KMP等
7.散列表
8.Trees:非線性數(shù)據(jù)結(jié)構(gòu),我花了大量的時間來理解。以迭代和遞歸的方式解決盡可能多的問題。樹里面又包括了以下:樹的表示;前序、中序和后序遍歷;二進制,AVL和紅黑樹;多節(jié)點樹。
9.堆(我的最愛)
最小堆
最大堆
10.廣度優(yōu)先搜索和深度優(yōu)先搜索
11.排序:了解每種算法以及何時使用,插入排序;冒泡排序;選擇排序;快速排序等等。
12.回溯
13.動態(tài)規(guī)劃
14.圖形:拓撲順序和Dijkstra等
算法問題的解決和優(yōu)化
我遵循這種方式:不要馬上看現(xiàn)有的答案。看看你是否可以直觀地想出思路并將其寫在紙上,無論你這個初始思路是多么幼稚。最初這個過程需要一段時間,做的多了,自然而然就掌握了在較短時間內(nèi)想出解決該問題的解法。當然,我寫的每個答案上都會驗證以下幾點
1.估算時間和空間復雜度
2.檢查是否有重復或不必要的循環(huán)。
3.通過增加空間利用率來降低時間復雜度(時間與空間之間的權(quán)衡)
4.廢棄此解決方案并考慮新的解決方案。
除此之外還要進行大量相關(guān)練習,用C語言去實現(xiàn)某一種數(shù)據(jù)結(jié)構(gòu),我當時覺得這個步驟是最難的。有的時候,你在一本書或者學習網(wǎng)站上面去看一個數(shù)據(jù)結(jié)構(gòu)的解析的時候會覺得不算難,腦子里想著自己去實現(xiàn)它應該不是很難,但是拋開這些材料的時候讓自己獨立實現(xiàn)的時候,就是另外一回事了。一定得先自己思考,然后再去看答案實現(xiàn),在我看來這不是單純的學習數(shù)據(jù)結(jié)構(gòu)了,而是在鍛煉自己的綜合能力了,如何真正理解問題和用編程技巧實現(xiàn)。
小蘇總結(jié):數(shù)據(jù)結(jié)構(gòu)整個體系做到心中有數(shù),注意練習和算法優(yōu)化!

以上四位“過來人”的學長學姐分享了他們的學習經(jīng)驗,學弟學妹們有沒有從中得到什么啟發(fā)呢?總的來說,還是要多練習多思考,最后祝大家都能找到適合自己的學習方法,早日上岸!小蘇等你們的分享哦!
蘇世學社旗下品牌,專注于計算機考研
計算機考研一手資訊,原創(chuàng)高質(zhì)量干貨
深度的學習分享丨咨詢前輩丨個性化指導
