怎麼學好數據結構?

想請教,剛學完C,怎麼學好數據結構?我發現,數據結構中的某些演算法好難理解,一些語句不是很容易明白。有沒有必要深究每句語句?謝謝


1. 程序 = 數據結構 + 演算法

2. 學習:剛開始看時肯定會有些不清楚,因為你是剛學完 C 語言,對 C 語言還不太熟練。你學習數據結構時找一本經典的數據結構書,看完一個數據結構後用 C 語言將其實現。開始時的實現肯定會有困難,那麼請 google 下會有很多優秀的數據結構源碼的。你可以模仿這些優秀的源碼寫。請記住一定要開始時自己實現,當被卡住了就看一下源碼,看看自己被卡在了什麼地方,引起注意以便下次自己會寫。當你把書上的數據結構源碼寫了一遍之後,你已經超過了你絕大部分的同學。

3. 運用: 這時你就需要對這些數據結構加以運用,你可以在 google 上搜索「某個數據結構 + ACM」,你就會看到一些題目,這些題目都是數據結構的運用,甚至有這些數據結構的變形。每種數據結構做5題左右。期間你還會遇到程序另一重要的方面演算法,有不會的就 google。 期間可以學到的數據結構和演算法做小軟體玩兒,例如壓縮軟體,五子棋之類的。

4. 深入: 當你完成了第三步你已經是你們學校的小高手了。這時看你的方向如果這時發現自己喜歡 ACM 的話就去搞 ACM,如果不感興趣,就找自己感興趣的技術學習一下,做幾個完整的項目,例如寫個編譯器,或者實現一個簡單的編程語言。

總結:無論選擇哪條道路只要按照這些做了,你畢業後肯定會成為搶手貨。


以非常不專業的語言,分享一下自己的理解,幫大家感性的認識一下數據結構。

.........................................................

想像一下你有一條非常非常長的紙條

這張紙條只能寫一行字

現在要你把一些描述現實世界的東西寫在這張紙條上。

然後把這張紙條給別人。

別人通過這張紙條重構你所描述的世界,或者在裡面查找、推演出自己所需要的信息。

1.這張紙條就是信息的載體,包括硬碟、內存、磁碟、甚至磁帶...說白了他們都是一張轉著圈或者拐著彎的紙條。

2.給別人的過程就是讀寫硬碟過程、網路傳輸過程等等......

3.數據結構所解決的問題就是,你怎麼用一行字啰里八嗦的把這些東西描述出來,別人怎麼讀懂這些啰里吧嗦的東西(註:你看著啰嗦沒事,機器看著不羅嗦就行)

4.編程,就是怎麼解決3,怎麼解決3之後解決你重構出來的世界的一些具體問題...

結語:只要把你的世界觀從三維轉到一維,你就能學懂數據結構了...

......………………

在此,華麗麗的腦補一下黑客帝國中,現實世界碎成渣,變為一串串帥氣的數字雨

數字雨又華麗麗的重組,形成了一個一模一樣的世界

.........................

當然我們遇到的工程問題,遠沒有真實世界這麼複雜。

如果腦洞還夠大的話,

可以想像一下,

你是一個間諜,

要把敵人機構的層級關係,用摩斯密碼發出去。

要把敵人網狀的地下通道的結構,用摩斯密碼發出去.....

(是不是抱著發報機,哭著後悔沒學好數據結構了,學渣同學)

..........................

你以為你在看一個網頁?

右鍵單擊網頁,查看源代碼。

其實,你看的是一串字元,換行處的字元是

這是結構化的一行數據。

瀏覽器理解了這種結構,

顯示給你看到了這個漂亮的網頁。

你以為你看的是一個圖片?

他也是一圈蛇形排列的數值串,(特定格式)

操控著顯示器的色彩明暗,

虛擬一個現實給你,

也是結構化的一行數據。

你以為word很神秘?

後綴改成.zip,

然後解壓,

你看到的,

還是一堆結構化的數據。

結構是人為的規則,書里講的數據結構,是數據組織最基本的規則。

還有各種各樣的數據標準,文件格式,只不過是更高級別的數據組織規則。

再繼續深入的話,語言,思維,規律,數學,哲學,萬物,三,二,一,道,自然.....

..........................

題外話:1.一個工程問題首先抽象成理論問題,然後利用數學方法進行推演解決,獲得了理論知識。然後一套理論知識形成一本書或者一門課。學一門課首先或者最終一定要搞清它解決的是什麼樣的工程問題,才算是學懂了。

換句話說,你要知道當初那個人是遇到了多麼苦逼的問題,才提出一個這麼牛逼的解決辦法。

2.學一門課,最重要的是理解,遇到實際問題要知道用什麼方法去解決。

打個比方就是為知識在大腦內存里建立索引,將知識存在外存,比如書本,百度之類,用到了再去複習一下讀進內存。(不排除有內存夠大的同學都記在腦子裡)

比如當要你用關係資料庫去存儲樹結構的時候,當給你鏈表讓你拼寫返回json數據的時候,當你要搜索一個矩陣中的連通區域的時候,最最起碼要做到的是,知道自己現在需要一本數據結構的書,再好點要知道用哪一個章節的哪個模型。

學霸可能已經動手寫出來了,但作為學渣翻翻書再寫出來,也不會很丟人吧。

而且,下次你就可能就用不到翻書了。

3.不要讓死氣沉沉的概念、定義,約束了自己的想像力。一開始定義這個定義的人,沉澱了自己的思想,做出了精準的描述,為的是更好的與別人交流這個東西,而不是用來約束別人的思想。

4.當然,自己的專業知識、專業技能,最終還是要沉澱下來,畢竟還要靠它吃飯。最後還是趕快聽樓上幾位大牛的忠告,腳踏實地的去碼代碼吧...


我來扒一扒Quora上的回答吧

I see it time and again in Google interviews or new-grad hires: The way data structures and algorithms—among the most important subjects in a proper computer science curriculum—are learnt is often insufficient. That"s not to say students read the wrong books (see my recommendation below) or professors teach the wrong material, but how students ultimately come to understand the subject is lacking.

我多次在google面試或者畢業招聘的時候看到這樣的情形:學習數據結構和演算法--CS課程裡面幾乎最重要的課程--的方式很不科學!!

到不是說大家用的書或者老師用的材料不對,而是說學生們對於這些課程本身的理解非常缺乏.

The key to a solid foundation in data structures and algorithms is not an exhaustive survey of every conceivable data structure and its subforms, with memorization of each"s Big-O value and amortized cost. Such knowledge is great and impressive if you"ve got it, but you will rarely need it. For better or worse, your career will likely never require you to implement a red-black tree node removal algorithm. But you ought be able—with complete ease!—to identify when a binary search tree is a useful solution to a problem, because you will often need that skill.

打好數據結構和演算法基礎的關鍵並不在於對於所有數據結構的細緻的了解,不是記住每一個大O值或者攤余成本..((@_@;)? [不懂]).

如果這些知識你都掌握了,當然很棒並且可以給人留下很深的印象,但是你基本上用不著啊!

你的職業生涯中或許永遠都不會要求你實現一個紅黑樹刪除節點的演算法.但是!你必須有能力而且手起刀落輕輕鬆鬆的識別出什麼時候使用二叉樹更簡單更有效, 因為你十分需要這樣的技巧.

So stop trying to memorize everything. Instead, start with the basics and learn to do two things:

  • Visualize the data structure. Intuitively understand what the data structurelooks like, what it feels like to use it, and how it is structured both in the abstract and physically in your computer"s memory. This is the single most important thing you can do, and it is useful from the simplest queues and stacks up through the most complicated self-balancing tree. Draw it, visualize it in your head, whatever you need to do: Understand the structure intuitively.

  • Learn when and how to use different data structures and their algorithms in your own code. This is harder as a student, as the problem assignments you"ll work through just won"t impart this knowledge. That"s fine. Realize you won"t master data structures until you are working on a real-world problem and discover that a hash is the solution to your performance woes. But even as a student you should focus on learning not the minutia details but the practicalities: When do you want a hash? When do you want a tree? When is a min-heap the right solution?

所以,不要試圖記住所有的東西.而是從基礎開始,做兩件事:

  • 第一件事. 把數據結構圖形化,視覺化.(突然想起來我高中競賽老師說的一句話:數形結合千般好,一旦不做萬事休啊! 就是要畫圖! )在直覺上感受一個數據結構是什麼樣子的.使用它是什麼感覺,抽象上和具體實現上是什麼樣子的.這就是最重要的事情.並且無論是對於簡單的隊列,棧還是天殺的平衡樹都很重要而且有效.把數據結構畫出來,在你的腦袋瓜裡面就能想像出來,總之,你需要做的就是,直觀的去了解這些數據結構.

  • 第二件事.學習什麼時候用什麼樣的數據結構和演算法.對於學生來說這很難,而且你要做作業的時候老師也沒告訴你們這該怎麼辦.╮( ̄▽ ̄")╭ 不過沒關係. 你要認識到當你真正處理到現實問題的時候或許你才能掌握某些數據結構,比如哈希表.但是即使是個學生,你也應該知道數據結構的實用性:什麼時候你需要個哈希表,什麼時候你需要個樹,什麼時候你需要個堆? 而不是一開始就陷入到追求細節中去.

One of the questions I ask in Google engineering interviews has a binary search tree as a potential solution (among others). Good candidates can arrive at the binary search tree as the right path in a few minutes, and then take 10-15 minutes working through the rest of the problem and the other roadblocks I toss out. But occasionally I get a candidate who intuitively understands trees and can visualize the problem I"m presenting. They might stumble on the exact algorithmic complexity of some operation, but they can respond to roadblocks without pause because they can visualize the tree. They get it.

我在google面試的時候,我經常會問一個可以由二叉樹搜索解決的問題. 好的應聘者可以幾分鐘內就可以想到用二叉樹來解決,而且對於我的其他問題也差不多10-15分鐘就可以解決.當然,偶爾會有一個應聘者,他能直觀的認識樹這種結構,而且可以把我的問題形象化,圖形化的描述出來.當然他或許對於某些操作的時間複雜度不甚了解,但是對於問題他卻可以立馬回應,因為他們腦袋裡就有這樣的樹結構啊~所以他也能拿到工作啊.

As for a book, there is but one: Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein, otherwise known as CLRS.

至於書嘛,只推薦一本--- &<演算法導論&>

If you want another text, perhaps one with more examples in a specific language, I recommend Robert Sedgewick"s Algorithms in C++ orAlgorithms in Java, as appropriate. I prefer CLRS as a text, but you might find these a better teaching aid.

如果你想要一本有很多例子並且和語言相關的書的哈u,我就推薦 &&<Algorithms in Java&> 當然我還是更推薦&<演算法導論&>,不過這些也是很好的教輔書啦~


給一個小小的建議:學數據結構的時候,不要陷入C語言的思維(當然,也不要陷入其他語言的思維)

  • 先把你學的計算機語言忘了,然後發揮你的想像力,把各種數據結構在你的大腦中具象化,一開始不必追求過多的理論知識,也不要關心嚴密性,追求感性的認知;

  • 當能夠形象地想像出某種數據結構的時候,動手用你學的C語言實現它。記住,不要追求完備的功能,只要寫一個最簡單的實現,一開始就追求完美不是一個好的學習過程;

  • 寫完之後,回過頭看那些理論上的東西,形成知識體系;

  • 最後,如果還有精力,重新寫一個功能更完備一點兒的實現;

通過上面幾步學習,基本上就掌握的比較好了,即便過了一段時間,也不會忘的一乾二淨;


花點時間把stl的容器自己實現一遍就明白了。


建議邊學習數據結構,(若你也學習C++的話)邊學習STL(源碼),同時你也可以學習其中演算法的知識,可以嘗試模仿著實現一套「微型」的YourSTL。這樣,會很有效果的,只要你肯下功夫。


1.數據存儲的目的是便於數據訪問。這個關係就是數據結構

2.演算法是計算機解題的模型:輸入,輸出,順序執行,跳轉,循環,分支,有限步驟。

3.人大腦組織數據的方式 有線,樹,圖三種邏輯結構,而計算機存儲採用順序,鏈式和兩者混合的方式。前者是概念性的東西,後者是物理實現。

4.線形結構:演算法是迭代演算法,你只要注意規模最小的情況下不出錯,則演算法一般不出錯

樹形結構:演算法是遞歸演算法,你只要運用遞歸組合的方法,將簡單情形組合出複雜情形

簡單情形不出錯,則演算法一般不會出錯。

圖形結構:DFS:將圖按照樹形結構來處理,運用遞歸演算法

BFS:將圖按章線形結構來處理,運用迭代演算法

必須會下面幾個幾個演算法:

(線形兩個)

1.將兩個有序表合併為一個表,這個演算法的變種很多,可以是鏈表,順序表。涉及集合運算,

歸併排序,字元串處理。

2.將一個順序表的元素重新劃分,左邊的較小,右邊較大。涉及快速排序,求字元串的逆串。

(樹形若干個)注意:有些可以實現,有些實現不了,可以拿來思考。

3.前序線索化,遞歸實現,棧模擬遞歸,非棧式迭代實現。

4.中序線索化,遞歸實現,棧模擬遞歸,非棧式迭代實現。

5.後序線索化,遞歸實現,棧模擬遞歸,非棧式迭代實現。

(圖形)注意:會畫表格,寫出演算法的逐個步驟即可。

6.MST:prim,kruskal

7.short path:Dijkstra ,Floyd

8.AOV:拓撲排序的DFS,BFS實現

9.AOE:關鍵路徑

嚴蔚敏數據結構應該怎麼學習。


對於某個數據結構,幾步:

1、理解該數據結構的基本概念(定義、實現)

2、嘗試理解這個數據結構的意義(為什麼它會被發明)

3、用這種數據結構解決一些對應的例題(書本上的習題、Online Judge上的水題)

4、嘗試用這個數據結構解決一些以往你用別的數據結構解決的問題,能否解決,為什麼。

5、再次嘗試理解這個數據結構的意義

6、嘗試改變這個數據結構以應對各種現實的問題(Online Judge的好題)

8、學好數學,別數都不會數。


首先先做一下自我介紹,我是中國某211大學的CS專業的大四學生。能進這個學校算是高考發揮超常,之後又鬼使神差地進了這個專業。剛進來的時候是懵逼的,周圍都是學霸,每天都在問自己我是誰、我在哪兒、我在幹什麼。然後大概懵了一個學期,發現周圍的大神們越來越強,和他們的差距也越來越大,我才醒悟,一定要做點什麼了,不然大學四年真的就要廢了。

經過了幾年的努力,現在也是周圍人以及學弟們眼中的大神了。基本上他們程序有什麼問題讓我看一下我都能挺快幫他們找出bug在哪兒。所以個人認為我的學習方法還是挺有效率的,好了嘮嗑到此結束,以下是乾貨,一定要記住哦~我根據你的問題,給你幾點建議。

1、選對教材很重要

如果你要學數據結構的話,首先推薦給你的是我們學校用的教材《數據結構》,嚴蔚敏的,這本書內容很嚴謹,代碼也不錯,不過是偽代碼,不過畢竟是教學用書,質量肯定杠杠的。

還有一本是《數據數據結構與演算法分析》,這本書可以說是神作了,廣為人知,作者是Mark Allen Weiss,曾被評為20世紀頂尖的30部計算機著作之一,我覺得你要是能認真啃下來,數據結構你肯定已經掌握得很透徹了。

2、光說不練假把式

要想學好數據結構,那光看書肯定是沒用的。建議在看上面兩本書的時候,把裡面的代碼都實現一遍,相信你「數據結構中的某些演算法好難理解,一些語句不是很容易明白」的問題應該就能解決。

然後在此基礎上,你可以做一些題,除了網上買的習題集之外,在這裡給你推薦一個免費刷題的網站:Lintcode (LintCode - 編程面試題在線訓練平/),你只需要加上tag你就能按照類別刷題,而且這裡面的題都分難易程度,你可以由簡到難來做,循序漸進,幫助應該挺大的,我感覺我靠這個網站進步了不少(笑)。而且這個網站還有筆記功能,記得好好利用。

另外安利一個查參考答案的網站,題目很全,而且代碼可以說是很短了,很簡潔:LeetCode / LintCode 答案查詢

3、堅持就是勝利

其實學習編程真的不難,主要就是肯看肯學肯練。我也是堅持了好久,不斷刷題才能逆襲成如今別人眼中的大神。所以說遇到難題千萬不要放棄,多刷幾道題一切都會變好的。

希望這些都能幫助到你吧,期待你也蛻變成大神!


系統的學習的話我認為(有書籍推薦,演算法導論這本書我目前還沒有啃過(大二了))

0:語法要要會,可以不深究一個int佔多大空間這種問題,

1:先要有一定的數學基礎,起碼對一些東西有概念就好,(離散數學後面的一些概念要了解)

2:然後看數據結構的書,可以在紙上 用圖描述出(數據《大話數據結構》)

3:抄襲書上的代碼實現,努力的看懂

4:嘗試自己實現書上的演算法,如果不會的話,可以參考書,但是一定要自己認真思考了

5:更深的認識,(數據結構與演算法分析 c語言描述)

------------

這是我的學習方法,適合正常人(智力比較正常),缺點就是要花費大量時間。


勤學當苦練,你不如問問有什麼好的學習資源


(版權聲明:本文出自數據結構學習網,文中的觀點僅代表原作者個人意見,著作權歸原作者所有)

山不在高,有仙則靈;水不在深,有龍則靈;要學好數據結構,有數據結構學習網才行!

首先,恭喜您發現了這個網站:一個神奇的學習數據結構的網站!

其次,感謝您打開這個網頁閱讀這篇文章,實在太感謝啦!

再次,正在激動中......哽咽了。還是讓我先來介紹一下我自己吧:

我就是江湖上人見人愛、花見花開、車見車載,人稱上天入地、無所不能、英俊瀟洒、風流倜儻、玉樹臨風、學富五車、高大威猛、擁有千萬粉絲、迷倒萬千少女,號稱一朵梨花壓海棠的玉面小黃驢,帥到掉渣!一個見過我的女孩兒曾對我說:「如果世界只剩下十分鐘的話,我會和你一同回憶你帥時的樣子;如果世界只剩下三分鐘的話,你要再擺一下你最最最帥的造型給我看;如果世界只剩下一分鐘的話,我會對你對你說60次—小黃驢,你真帥!」還有一個女孩兒每天早晨都站在教室門口,痴痴地望著我,獃獃狀喃道:「世間本無沙漠,只是我每看到一次你帥的樣子,天上便會落下一粒沙,從此便有了撒哈拉。」唯心主義說:「我說你帥,你就是帥。」唯物主義說:「因為你帥,所以我說你帥。」總而言之一句話—我,就是帥。一個不帥驢子的標誌是他願意為自己的不帥英勇地死去,一個帥氣驢子的標誌是他願意為自己的帥而卑愴地活著,所以,至今我還為自己的帥堅強的活著。

本人沒什麼優點,唯一的優點就是沒有缺點;本人基本全是缺點,最大的缺點就是只有優點;如果靚仔是一種罪,我已經罪犯滔天;如果有型是一種錯,我已經一錯再錯;如果聰明要受懲罰,我豈不是要千刀萬剮;如果謙虛都要受折磨,我又怎能逃得過?

吹了這麼半天驢掰,相信大家一定已經對我有好感了,下面該說點嚴肅的事情了:

天將降大任於斯人也:據說,我出生時,天空的北方,出現祥雲一片,漸漸由遠至近,飄到我家房頂後,幻化成幾個大字:「數據結構學習網」。在接下來的若干年中,我一直在驢不停蹄地努力打造這個人類歷史上、整個宇宙中最經典、最驢掰的可供大家免費學習數據結構的網站,這個網站的出現,是順應天意的結果,更是歷史的必然!

那麼,上天為什麼委託我建造這個前無古人後無來者、舉世無雙、屌爆了的網站呢?學習數據結構到底有啥用?數據結構到底該咋學?

數據結構是計算機科學與技術專業、計算機信息管理與應用專業,電子商務等專業的基礎課,是十分重要的核心課程。所有的計算機系統軟體和應用軟體都要用到各種類型的數據結構。因此,要想更好地運用計算機來解決實際問題,僅掌握幾種計算機程序設計語言是難以應付當前眾多複雜的課題。要想有效地使用計算機、充分發揮計算機的性能,還必須學習和掌握好數據結構的有關知識。打好「數據結構」這門課程的紮實基礎,對於學習其他專業課程是十分有益的。

對於怎麼能學好這門課程,我個人覺得基本上就是上課前看看書、上課時認真聽課、下課以後複習複習、當然還有做作業時很認真的去做。根本談不上什麼好方法,不過我還是有一些話要送給大家:

一、打好基本功

不管學習什麼,概念是基礎,所有的知識框架都是建立在基礎概念之上的。所以,第一遍看課本要將概念熟記於心,然後構建知識框架。比如看了一遍書後你至少應該知道數據結構包括線性結構、樹形結構、圖狀結構或網狀結構。線性結構包括線性表、棧、隊列、串、數組、廣義表等,棧和隊列是操作受限的線性表,串的數據對象約束為字符集,數組和廣義表是對線性表的擴展:表中的數據元素本身也是一個數據結構。除了線性表以外,棧是重點,因為棧和遞歸緊密相連,遞歸是程序設計中很重要的一種工具。樹狀結構中的重點自然是二叉樹和哈弗曼樹了。對於二叉樹的很多操作都是基於對二叉樹的遍歷,掌握了如何遍歷,很多問題也就迎刃而解了,比如對二叉樹結點的查找訪問、統計二叉樹中葉子結點的數目、求二叉樹的深度等。哈弗曼編碼也有著很廣泛的應用。對於圖狀結構,主要學習圖的存儲結構及圖的遍歷。

二、不能看不起自己

「我能行!」

個人覺得這句話非常重要,不知道大家是怎樣看待數據結構這門課的,有多少人覺得數據結構很難呢?我知道還是有一些同學這樣覺得的,有時候我跟我的朋友講要怎樣學,講了一大堆以後,他就向我抱怨:我以前c++都沒有學好,數據結構更學不好了,這哪跟哪的話啊,數據結構與c++沒有什麼關係,我想假如抱有這樣的心態,自己就不相信自己,那是不可能學好的,那些覺得數據結構很難的同學,我想他們應該會很看重數據結構的吧,然後他們就一天到晚捧著一本數據結構,這樣不會覺得很累嗎?而且因為覺得很難,就容易不相信自己,學的效率也不會很好,或許這有點太妄自菲薄了吧。個人認為數據結構很好學,很容易學,因為我覺得很容易,當然就會覺得自己沒問題,學得很輕鬆,效果也還可以。大家都是從高考走過來的,應該知道心態的重要性吧,兩種不同的心態,完全就是兩種不同的效果。學習數據結構我們到底要學些什麼呢?不知道大家有沒有想過,那現在我們現在來歸納一下我們學習的內容吧,其實我們也就學了幾種普通的數據結構,像二叉樹,樹,圖還有排序的問題,前面的線性表和字元串也就是一些概念,當然還有一個很重要的KMP演算法,然後在每種數據結構中我們也就是學到了若干處理的演算法,我想真正數起來也就是幾十個演算法吧。學習數據結構也就是要掌握這幾十種演算法,多簡單!至於如何掌握每個演算法呢,我想就是多看看書,重要的是能夠理解。個人認為,學習的難易程度很大程度上決定於個人的興趣。把一件事情當做任務去做會很痛苦,當做興趣去做會很快樂。如果想讓自己在學習數據結構的過程中更輕鬆一些,就應該先培養對這門學科的興趣。

三、堅持獨自完成作業的好習慣

有一些同學總是喜歡先問好別人演算法,然後再自己寫,雖然這個不算抄襲作業,但自己基本上沒有一個思考問題的過程,雖然要理解演算法也會要思考很多,但是因為沒有自己獨立的思考過程,要自己寫程序、寫演算法的時候根本寫不出來,所以我想如果真的想學好數據結構的話,最好是能夠自己思考問題,不要剛想了一會就覺得做不出來,然後就去問其他人。其實老師給我們的作業大多數還是基於我們的水平的,我絕對相信我們自己能夠獨自想出演算法,雖有可能會比較長時間吧,但是這樣肯定會比問其他人學到更多的東西。當然我並不是說不要問同學,有時候就是腦筋轉不過來,一問別人就懂了,當然問了別人不能只是我知道了這個演算法,還應該去想如何思考才能得到這個演算法,這樣水平會提高很多。

對演算法的學習是學習數據結構的關鍵。在看課本的過程中,要注重對演算法的掌握。對於一個演算法,讀一遍可能能讀懂,但不可能完全領會其中的思想。掌握一個演算法,並不是說將演算法背過,而是掌握演算法的思想。我們需要的是耐心。每看一遍就會有這一遍的收穫。讀懂演算法之後,自己再默寫演算法,寫到不會的地方,看看課本想想自己為什麼沒有想到。反覆練習,直到能順利寫出演算法為止。個人認為,這是行之有效的方法。這樣,不僅可以更加深入的領會演算法思想,還會逐漸發現演算法的巧妙之處,從而對數據結構產生興趣。

四、多動手實驗

這個就沒有太多理由了,我一直覺得編程是一門熟練科學,多編程,水平肯定會提高,最重要的是能夠養成一種感覺,就是對程序對演算法的敏感,為什麼那些牛人看一個演算法一下子就看懂了?而自己要看很久才能弄懂,而且弄懂了過了一陣子又忘記了?其實這個是因為牛人們以前看的程序很多,編得也很多,所以他們有了那種感覺,所以我覺得大家應該多看程序,多寫程序,培養自己的感覺。數據結構是實踐很強的一門課程,光是「聽」和「讀」是絕對不夠的,必須加強實踐。在寫演算法的過程中,可能會出現很多問題,而不斷修改的過程便是學習的過程。在這個過程中,只要全身心的投入了,便會發現很多樂趣。

五、關於複習和考試的一些技巧

我想大家應該都有這樣的感覺,就是覺得自己什麼都掌握了,但是在考試的時候就是會犯暈,有時候一出考場就知道錯在哪個了,然後考完以後一對答案,發現其實考得很簡單,應該都是自己會做的,這個就是與自己的複習和考試的技巧有關係了。

首先就是複習,前面已經說過其實我們學的演算法也就是幾十個,那麼我們的任務也就是理解這幾十個演算法,複習也就是要加深你的理解。如何理解演算法,然後理解到什麼程度呢?是能默寫出整個演算法嗎?其實不是這樣的,數據結構的考試有它的特點,考過期末考試了,大家應該都發現數據結構其實不要求你把整個演算法背出來,它注重考察你的理解,那麼怎麼考察呢?其實也就是兩種方式吧,一種就是用實例,就是給你一個例子,要你用某個演算法運行出結果,我想這個期末考試的時候仍然會有很多這樣的題目,比如排序那塊就很好出這樣的題目,要複習這種題目我覺得很簡單,就是每個演算法都自己用例子去實踐一下,以不變應萬變,我當年期末複習的時候就是這樣去做的,而且考試之前我就覺得排序類的題目就很有可能會考,於是就自己編寫各類排序演算法運行了一遍。另外一種考察方式就是演算法填空和演算法改錯,可能有一些同學覺得這種題目很難,其實我們首先可以確定這兩種題目肯定是與書上演算法有關係的,只要理解了書上的演算法就可以了,有人覺得看完書以後什麼都懂了,而且要默寫也默寫得出來,其實不是這樣的,演算法改錯和填空主要是考察的細微處,雖然你覺得你默寫得出來,那是能夠默寫出演算法的主體部分,很多細微的地方你就會很容易忽略。我想大家考過期末考以後應該都有這種感覺吧?那要怎樣解決這種問題呢?我覺得有兩種方法,一種就是自己去編程實現,這種方法比較有意義,還能夠提高編程水平,另外一種就是用實例分析演算法的每句話,我認為這種方法是最有效的。

然後還有一種題目,就是最後的寫演算法的題目,我覺得這種題目還是很好解決的,只要是能夠自己做出作業的,基本上都會很容易做出來,這也是為什麼我前面覺得平時做作業應該自己獨立思考的原因,同時做這種題目千萬要小心,尤其是題目簡單的時候,那肯定會有一些小地方要考慮清楚,一不小心就會被扣掉很多分,這樣很不值。

我覺得考試的時候沒有太多要講的,只要複習好了,考試的時候細心一點就可以了,然後就是做一個題目開始就要盡量保證正確,如果覺得留在那裡等後面做完了再來檢查,這樣錯誤還是很有可能檢查不出來,我期末考試的時候就基本上沒有檢查,因為我做每個題目都是確保正確,用的時間也挺多的,然後也覺得沒有檢查的必要了。

五百年回眸才換來今生的擦肩而過,一萬年方得今日在此相聚,我希望大家能記住我的名字—小黃驢,因為我將會和大家成為最好的朋友。我希望大家能記住我的網站—數據結構學習網,因為她將會成為一個讓大家可以依賴的學習港灣。我們將風雨無阻一起走過一段美好的時光,祝大家學習愉快!學有所得!


看看視頻,寫寫代碼,實踐實踐。數據結構與演算法視頻


入門版:任何一本權威的數據結構書 - 把所有數據結構用你所使用的語言寫一遍,編譯通過

進階版:《STL源碼剖析》

輔助:可以參照相關語言的內部原理來學習


先找一本國外的教材,敘述比較啰嗦,但是能幫助你更好地理解,把整本書看個兩遍。

然後把每一章後面的題目都做一下,會做的題目就要以最短的時間想好並在電腦上敲出來,難的不會做的在網上找答案或者發帖問人。

最後就是刷刷網上的一些題目,oj、leetcode都可以,題目適量就好

以上這些我覺得應該在大二上學期結束之前完成


數據結構C語言實現

裡面出現的偽代碼都實現一遍

實現的時候就無法避免細節問題了


數據結構 是比較 抽象的知識,單純看書 掌握的其實是比較慢的,而且記得不深刻,更不要說運用了。個人建議,邊學,邊拿 相關的題目 練練手。在題目中 深刻的體會。 題目的話,推薦 OJ,像poj,hdu都很不錯。


首先要對演算法的思路有一個比較清晰的理解(自己可以動手編代碼的話就按這個思路來),如果自己不知道如何用代碼思想,先看書上的代碼,弄懂每句的含義,之後自己再重新編一遍代碼。


理解再練習


C學完了之後先把彙編語言學一遍,能夠幫你更深入理解c語言和程序運行原理,之後再學數據結構應該會簡單很多。


如果還是看不太懂的話,再把C語言重新學習一遍!


演算法導論

OJ上刷一些專題 比如說看了圖論,就刷刷圖論的題目

可以找一些大學的acm集訓隊的模板,看看其C代碼,可讀性不高。


1.聽一位好的老師講課

2. 多練習多看別人代碼。

博客:Learn to programming Blog 上有數據結構視頻教程,很精彩!


推薦閱讀:

人工智慧正在邁向技術奇點嗎?如果是,這對人類是好事還是壞事?
如何簡化包圍多邊形?
快速實現演算法的能力是否有必要?
演算法用在哪?
如何將平面上無序的一組點連成一個簡單多邊形?

TAG:演算法 | 數據結構 |