一、資料**
1.教材:
★★★★資料結構與演算法分析 (豆瓣)
(經典之作,廣為人知)
★★★資料結構 (豆瓣)
(嚴蔚敏的,就是國內大學常用的那本。嚴謹,偽**不錯。)
★★大話資料結構 (豆瓣)
(語言比較通俗。比第一本簡單易懂。btw,作者程杰老師在知乎上也相當活躍)
★★演算法(第4版) (豆瓣)
(圖超多。比第一本簡單易懂。)
2.慕課:
★★★★★浙江大學的:資料結構 - 網易雲課堂
(同樣地非常非常非常好。比起浙大的資料結構,難度更深,內容更多。而且聽完課以後,不僅知其然,也知其所以然。)
二、就需要先搞清楚幾個前提,
1、記憶體的資料儲存模式,是以順序排列的方式儲存的。
也就是說,記憶體中的資料是起點是0,終點根據記憶體的大小和作業系統而定的乙個順序的序列。0被占用,後面存入的資料則依次存入。
2、程式在乙個執行緒中,一次只能從乙個位址來取資料。所以,除了圖之外,所有的資料結構都有且只有唯一的取數入口。所以,必須從乙個入口來進行取數。
3、記憶體的資料訪問並不是單線的,而是很多個程式不斷的進行並行操作的。所以資料的分布是不連續的,作業系統並不能保證可以一次性找到足夠大的一塊記憶體來存放一次操作所需要的所有資料。
可以用磁碟碎片整理的圖示來模擬一下,使用一段時間以後,記憶體中的資料大概就是這個樣子的,此時要想一次性開出一大塊資料,是不可能的,所以要想辦法解決資料量無限增加時的資料分配。
三、資料結構分為三大類
1、線性表:
這個是為了解決單線儲存而出現的,陣列就是最簡單粗暴的儲存方法。就是直接拉出一大塊資料存在那裡。陣列的快速訪問其實只是乙個***,因為所有的資料都在一起,可以直接算出來資料的位址。鍊錶則是為了解決可以無線增長的需求的。因為找不到一大塊可以連續的存入資料,甚至也不知道程式可能使用的資料總量,所以就沒辦法劃分一塊資料來使用,劃小了不夠用,划大了浪費(這在早年是非常大的事情)。所以必須想辦法解決問題。最後採用的方法就是從入口開始,每乙個資料塊不僅僅有資料,還會有指向下乙個資料塊的線索,用來尋找下乙個資料。這就是鍊錶。所謂的雙向鍊錶,只是加了乙個向前的線索的鍊錶而已。佇列,棧,都是線性表的特殊形態。進行了操作上的限制罷了。沒有什麼太複雜的。
2、樹:
樹是為了解決單一入口下的非線性關聯性的資料儲存或者排序這樣的功能而來的。
最常見的應用是程式設計時候的map,就是利用了二叉樹的可排序和可以快速插入並且保持序列完整的特性來構建鍵值資料對,來實現資料的插入增加以及快速查詢的能力的。
還有做語法解析,文書處理等等很多場景也會用到樹。這就不一一贅述了。當然在吃透線性表的基礎上,再去理解樹也並不難。因為樹相對於鍊錶,就是每個節點不止有乙個後續節點但是只有乙個前置節點。
3、圖:
圖是資料結構裡最難的一部分,但是很多學校並不作為重點,因為確實大部分人不會用到。
圖其實就是把線性表進一步擴充套件,每個節點會有不止乙個前置和字尾節點,而且前置和字尾的概念也不再明晰,變成了關聯節點而已。
四、學習建議
理解資料結構/演算法的原理visualgo - 資料結構和演算法動態視覺化 (chinese)
用c/c++實現
這一步也是最考驗乙個人程式設計基本功的。寫出簡潔、優雅、具有表現力的**能夠使資料結構的學習變得很簡單。反之,如果介面設計得太複雜、邊界情況不注意處理或者不注意效率的話,就會出現各種bug:記憶體洩漏、野指標、遞迴棧溢位……
分析時間和空間複雜度、優點、缺點以及適用於解決的問題學習順序
直觀的理解某種資料結構是什麼樣的,使用起來是什麼樣的,在抽象和實際的記憶體中是如何儲存的。這是一件單獨的並且很重要的事情,從最簡單的棧和佇列到很複雜的平衡樹。你可以把它們畫出來,直觀地展現在你腦海裡,無論你用什麼方式,最重要的就是你要直觀地去理解。
知道在自己的**中何時,並如何去使用這些不同的資料結構和演算法
這一點對於學生來說可能有點難,因為在他們的作業中不需要思考這些。沒有關係,你以後會意識到如果你不參加乙個實際的專案,你就永遠不會理解資料結構,你也不會發現雜湊演算法是你解決效能問題的方法。但是,即使是學生,你也應該學習一些實用性強的內容,比如什麼時候用雜湊表?什麼時候用樹結構?什麼時候最小堆是最好的解決方案?
附件知乎**:
資料結構與演算法學習
我想重新學習一下資料結構與演算法,打好基礎。to measure is to know.我們用演算法複雜度t n 來表示演算法的效率,效能。t n 的取值 所有問題規模為n的問題例項中,將他們的計算成本進行總體的比較,取出最壞情況下的值。有幾點需要catch,1.演算法執行的時間,會根據程式語言,作...
資料結構與演算法學習筆記
演算法基礎篇 第一章 演算法概述 首先了解一下基本的概念 1.1 什麼是演算法呢?從字面意義上理解,演算法就是用於計算的方法,用這種方法達到預期的結果。通俗的講,演算法可以理解為乙個完整的解題步驟,由一些基本的運算和規定的運算順序組成。通過這樣的解題步驟可以解決特定的問題。演算法可以抽象出5個特徵 ...
資料結構與演算法學習二
1 用js中object物件模擬集合set的資料結構 set集合中的資料結構 s s 即集合中的鍵 值相同。故,可令object物件中的鍵 值相同,來模擬set集合及其中的方法,如下 用js中object模擬實現集合set資料結構 es6中有set類,避免混淆這裡用set2 var set2 fun...