數(shù)據(jù)結(jié)構(gòu)
1.說(shuō)明是數(shù)據(jù)結(jié)構(gòu)?
在計(jì)算機(jī)科學(xué)中,數(shù)據(jù)結(jié)構(gòu)(英語(yǔ):data structure)是計(jì)算機(jī)中存儲(chǔ)、組織數(shù)據(jù)的方式。
數(shù)據(jù)存儲(chǔ)在哪里呢,這里就要涉及到寄存器之類的東西了,本文不做延伸,可以參考這里簡(jiǎn)單看下(存儲(chǔ)數(shù)據(jù)的地址:http://www.cnblogs.com/xiohao/p/4296088.html),以后我可能會(huì)進(jìn)行總結(jié),這個(gè)鏈接嚴(yán)格來(lái)說(shuō)并不深入,感覺(jué)以前上學(xué)那會(huì)兒上單片機(jī)課本上的那個(gè)比較詳細(xì),這種東西要是想詳細(xì)了解還是翻書比較好。
2.常見的數(shù)據(jù)結(jié)構(gòu)
不同的數(shù)據(jù)結(jié)構(gòu)由于存儲(chǔ)方式的不同,會(huì)有不同的操作方式。
數(shù)組(Array)
最簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu)類型是一維數(shù)組。例如,索引為0到9的32位整數(shù)數(shù)組,可作為在內(nèi)存地址2000,2004,2008,...2036中,存儲(chǔ)10個(gè)變量,因此索引為i的元素即在內(nèi)存中的2000+4×i地址。數(shù)組第一個(gè)元素的內(nèi)存地址稱為第一地址或基礎(chǔ)地址。
利用元素的索引(index)可以計(jì)算出該元素對(duì)應(yīng)的存儲(chǔ)地址。
(通過(guò)索引來(lái)操作數(shù)據(jù))
堆棧(Stack)
堆棧(英語(yǔ):stack),也可直接稱棧(港澳臺(tái)作堆疊),在計(jì)算機(jī)科學(xué)中,是一種特殊的串列形式的數(shù)據(jù)結(jié)構(gòu),它的特殊之處在于只能允許在鏈接串列或陣列的一端(稱為堆疊頂端指標(biāo),英語(yǔ):top)進(jìn)行加入數(shù)據(jù)(英語(yǔ):push)和輸出數(shù)據(jù)(英語(yǔ):pop)的運(yùn)算。另外棧也可以用一維數(shù)組或連結(jié)串列的形式來(lái)完成。堆疊的另外一個(gè)相對(duì)的操作方式稱為佇列。
由于堆疊數(shù)據(jù)結(jié)構(gòu)只允許在一端進(jìn)行操作,因而按照后進(jìn)先出(LIFO, Last In First Out)的原理運(yùn)作。
(只能對(duì)棧頂進(jìn)行操作)
隊(duì)列(Queue)
隊(duì)列,又稱為佇列(queue),是先進(jìn)先出(FIFO, First-In-First-Out)的線性表。在具體應(yīng)用中通常用鏈表或者數(shù)組來(lái)實(shí)現(xiàn)。隊(duì)列只允許在后端(稱為rear)進(jìn)行插入操作,在前端(稱為front)進(jìn)行刪除操作。
(可以想象下你去買東西然后要排隊(duì),不能插隊(duì)新來(lái)的人只能從后面開始排,前面的人排到了就走了退出隊(duì)列。線性表(Linear List)是由n(n≥0)個(gè)數(shù)據(jù)元素(結(jié)點(diǎn))a[0],a[1],a[2]…,a[n-1]組成的有限序列。)
鏈表(Linked List)
鏈表(Linked list)是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表,但是并不會(huì)按線性的順序存儲(chǔ)數(shù)據(jù),而是在每一個(gè)節(jié)點(diǎn)里存到下一個(gè)節(jié)點(diǎn)的指針(Pointer)。由于不必須按順序存儲(chǔ),鏈表在插入的時(shí)候可以達(dá)到O(1)的復(fù)雜度,比另一種線性表順序表快得多,但是查找一個(gè)節(jié)點(diǎn)或者訪問(wèn)特定編號(hào)的節(jié)點(diǎn)則需要O(n)的時(shí)間,而順序表相應(yīng)的時(shí)間復(fù)雜度分別是O(logn)和O(1)。
(非線性存儲(chǔ)數(shù)據(jù)的線性表,與隊(duì)列對(duì)立。)
樹(Tree)
在計(jì)算機(jī)科學(xué)中,樹(英語(yǔ):tree)是一種抽象數(shù)據(jù)類型(ADT)或是實(shí)作這種抽象數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu),用來(lái)模擬具有樹狀結(jié)構(gòu)性質(zhì)的數(shù)據(jù)集合。它是由n(n>0)個(gè)有限節(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。把它叫做“樹”是因?yàn)樗雌饋?lái)像一棵倒掛的樹,也就是說(shuō)它是根朝上,而葉朝下的。
圖(Graph)
在數(shù)學(xué)上,一個(gè)圖(Graph)是表示物件與物件之間的關(guān)系的方法,是圖論的基本研究對(duì)象。一個(gè)圖看起來(lái)是由一些小圓點(diǎn)(稱為頂點(diǎn)或結(jié)點(diǎn))和連結(jié)這些圓點(diǎn)的直線或曲線(稱為邊)組成的。
圖(Graph)是由頂點(diǎn)的有窮非空集合和頂點(diǎn)之間的邊的集合組成。
參考這兩個(gè)鏈接
http://www.itdecent.cn/p/6cace353141d
http://www.cnblogs.com/w-wanglei/p/figure.html
堆(Heap)
堆(英語(yǔ):Heap)是計(jì)算機(jī)科學(xué)中一類特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱。堆通常是一個(gè)可以被看做一棵樹的數(shù)組對(duì)象。在隊(duì)列中,調(diào)度程序反復(fù)提取隊(duì)列中第一個(gè)作業(yè)并運(yùn)行,因?yàn)閷?shí)際情況中某些時(shí)間較短的任務(wù)將等待很長(zhǎng)時(shí)間才能結(jié)束,或者某些不短小,但具有重要性的作業(yè),同樣應(yīng)當(dāng)具有優(yōu)先權(quán)。堆即為解決此類問(wèn)題設(shè)計(jì)的一種數(shù)據(jù)結(jié)構(gòu)。
散列表(Hash)
散列表(Hash table,也叫哈希表),是根據(jù)鍵(Key)而直接訪問(wèn)在內(nèi)存存儲(chǔ)位置的數(shù)據(jù)結(jié)構(gòu)。也就是說(shuō),它通過(guò)計(jì)算一個(gè)關(guān)于鍵值的函數(shù),將所需查詢的數(shù)據(jù)映射到表中一個(gè)位置來(lái)訪問(wèn)記錄,這加快了查找速度。這個(gè)映射函數(shù)稱做散列函數(shù),存放記錄的數(shù)組稱做散列表。
一個(gè)通俗的例子是,為了查找電話簿中某人的號(hào)碼,可以創(chuàng)建一個(gè)按照人名首字母順序排列的表(即建立人名到首字母的一個(gè)函數(shù)關(guān)系),在首字母為W的表中查找“王”姓的電話號(hào)碼,顯然比直接查找就要快得多。這里使用人名作為關(guān)鍵字,“取首字母”是這個(gè)例子中散列函數(shù)的函數(shù)法則,存放首字母的表對(duì)應(yīng)散列表。關(guān)鍵字和函數(shù)法則理論上可以任意確定。
通過(guò)以上對(duì)應(yīng)wiki,可以對(duì)數(shù)據(jù)結(jié)構(gòu)有一定的理解。下面我們來(lái)看看數(shù)據(jù)結(jié)構(gòu)的具體使用場(chǎng)景。
3.數(shù)據(jù)結(jié)構(gòu)與算法
提到數(shù)據(jù)結(jié)構(gòu),就必定會(huì)提到算法。
在我看來(lái)數(shù)據(jù)結(jié)構(gòu)與算法存在的根本目的,應(yīng)該就是:數(shù)據(jù)種類時(shí)多種多樣的,因此我們需要選擇不同的存儲(chǔ)結(jié)構(gòu)(用于存數(shù)據(jù)),與算法(用于操作數(shù)據(jù)),以便能對(duì)高效地?cái)?shù)據(jù)進(jìn)行操作,這只是個(gè)人理解,不能盡信。
搜索資料中發(fā)現(xiàn)一個(gè)相關(guān)資料,是清華大學(xué)數(shù)據(jù)結(jié)構(gòu)(C++語(yǔ)言版)課程。
課程地址:https://dsa.cs.tsinghua.edu.cn/~deng/ds/dsacpp/
這個(gè)網(wǎng)站,可以動(dòng)態(tài)地觀看多種數(shù)據(jù)結(jié)構(gòu)的簡(jiǎn)單使用,該網(wǎng)站支持中文模式。
http://zh.visualgo.net/zh

其實(shí)學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)還是需要通過(guò)書籍才能全面地學(xué)習(xí)。
參考鏈接:
https://zh.wikipedia.org/wiki/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84