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

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

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