專(zhuān)欄作者/ 樹(shù)華子
專(zhuān)欄導(dǎo)讀
算法+ 數(shù)據(jù)結(jié)構(gòu) = 程序
在計(jì)算機(jī)領(lǐng)域,有這樣一個(gè)人盡皆知的著名公式,「算法+ 數(shù)據(jù)結(jié)構(gòu) = 程序」,可以說(shuō)如果把編寫(xiě)程序比作烹飪,那么數(shù)據(jù)結(jié)構(gòu)就好比菜譜中食材用量,算法就好比烹飪步驟。這個(gè)公式由瑞士計(jì)算機(jī)科學(xué)家,Pascal之父,尼古拉斯·沃斯于1976年提出。很多人覺(jué)得它已經(jīng)完全過(guò)時(shí)了,其實(shí)并不然。鄒欣的《構(gòu)建之法》一書(shū)中對(duì)這個(gè)著名公式進(jìn)行了補(bǔ)充,他說(shuō)道「程序 = 數(shù)據(jù)結(jié)構(gòu)+算法、 軟件 = 程序 + 軟件工程」。雖然當(dāng)今的軟件開(kāi)發(fā)過(guò)程已經(jīng)不像是上個(gè)世紀(jì)那樣簡(jiǎn)單,但這并不是不去好好學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)這門(mén)課程的理由。算法和數(shù)據(jù)結(jié)構(gòu)就如同程序員的基本功,是重中之重,掌握了其中的思想和原理,很多問(wèn)題才可以迎刃而解。
很多同學(xué)可能會(huì)問(wèn),「我大概知道算法的含義,可數(shù)據(jù)結(jié)構(gòu)到底是什么呢?」
什么是數(shù)據(jù)結(jié)構(gòu)?
要回答這個(gè)問(wèn)題,首先要回答「什么是數(shù)據(jù)?」
數(shù)據(jù)是對(duì)客觀事物的符號(hào)表示,在計(jì)算機(jī)科學(xué)中是指所有能輸入到計(jì)算機(jī)中并被計(jì)算機(jī)處理的符號(hào)的總稱(chēng),在不同是場(chǎng)景中數(shù)據(jù)有不同的表現(xiàn)形式,可以是數(shù)字(整數(shù)、浮點(diǎn)數(shù)等等)、字符串甚至是圖像、聲音。
現(xiàn)在你明白了數(shù)據(jù)的概念,但還不夠,你需要明白「什么是數(shù)據(jù)元素?」
數(shù)據(jù)元素是數(shù)據(jù)的基本單位,在計(jì)算機(jī)程序中通常作為一個(gè)整體進(jìn)行考慮和處理。

為了便于理解,我們舉一個(gè)簡(jiǎn)單的例子。在整數(shù)數(shù)據(jù)中,整數(shù)“1”可以視作一個(gè)數(shù)據(jù)元素,在本文中我們暫且以上圖形式表示它。
接下來(lái)你還需要知道另一個(gè)概念,「什么是數(shù)據(jù)對(duì)象?」
數(shù)據(jù)對(duì)象是性質(zhì)相同的數(shù)據(jù)元素的集合,是數(shù)據(jù)的一個(gè)子集。

繼續(xù)剛才的例子,整數(shù)數(shù)據(jù)對(duì)象可以表示為N={...,-1,0,1,2,...},在本文中我們暫且以上圖形式表示它。
好了,現(xiàn)在我們可以回到一開(kāi)始提出的問(wèn)題,「什么是數(shù)據(jù)結(jié)構(gòu)?」
數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。換言之,我們可以將數(shù)據(jù)結(jié)構(gòu)當(dāng)作是一種附帶關(guān)系的數(shù)據(jù)對(duì)象。
對(duì)于數(shù)據(jù)集合{1,2,3,7,10},當(dāng)數(shù)據(jù)元素之間關(guān)系僅為“同屬一個(gè)集合”,此外無(wú)其他關(guān)系時(shí),我們暫且以如下的集合來(lái)表示:

當(dāng)數(shù)據(jù)元素之間存在一對(duì)一的關(guān)系時(shí),例如對(duì)于上述集合,若任意兩個(gè)元素A和元素B之間存在「A是集合中大于B的最小的元素」這種關(guān)系,則可以使用如下的線性結(jié)構(gòu)加以表示:

當(dāng)數(shù)據(jù)元素之間存在一對(duì)多的關(guān)系時(shí),例如對(duì)于同樣的集合,若元素A和元素B之間存在「可由A和集合中另一元素相加得到B」這種關(guān)系,則可以使用如下的樹(shù)形結(jié)構(gòu)加以表示:

當(dāng)數(shù)據(jù)元素之間存在多對(duì)多的關(guān)系時(shí),例如對(duì)于同樣的集合,若元素A和元素B之間存在「A和B互質(zhì)」這種關(guān)系,則可以使用如下的圖狀結(jié)構(gòu)加以表示:

想必你已經(jīng)對(duì)數(shù)據(jù)結(jié)構(gòu)和它的種類(lèi)有了大體的認(rèn)識(shí),實(shí)際上,對(duì)于數(shù)據(jù)結(jié)構(gòu)這個(gè)概念,至今尚未有一個(gè)被一致公認(rèn)的定義,不同的人在使用這個(gè)詞的時(shí)候所表達(dá)的意思可能是不同的,請(qǐng)看一段關(guān)于數(shù)據(jù)結(jié)構(gòu)英文定義:
A data structure is a specialized format for organizing and storing data.General data structure types include the array, the file, the record, the table, the tree,and so on. Any data structure is designed to organize data to suit a specific purpose so that it can be accessed and worked with in appropriate ways. In computer programming, a data structure may be selected or designed to store data for the purpose of working on it with various algorithms.
(請(qǐng)嘗試閱讀理解上面這段話,計(jì)算機(jī)領(lǐng)域?qū)τ⒄Z(yǔ)水平是有基本的要求的...畢竟作為一個(gè)“程序員”以后有很多機(jī)會(huì)混跡SO或是github)
一種數(shù)據(jù)結(jié)構(gòu)是用來(lái)組織和存儲(chǔ)數(shù)據(jù)的一種特定格式。常見(jiàn)的數(shù)據(jù)結(jié)構(gòu)類(lèi)型包括數(shù)組、文件、記錄、表、樹(shù)等等。任何數(shù)據(jù)結(jié)構(gòu)都被設(shè)計(jì)用來(lái)組織數(shù)據(jù)以適應(yīng)于特定的目的,因此它必須可以訪問(wèn)并且可以在特定方式下工作。在計(jì)算機(jī)編程中,一個(gè)數(shù)據(jù)結(jié)構(gòu)可以被選擇或設(shè)計(jì)以為不同的算法存儲(chǔ)數(shù)據(jù)。
如果你暫時(shí)認(rèn)為上述解釋有些晦澀難懂也沒(méi)有關(guān)系,在日后的學(xué)習(xí)中相信你會(huì)慢慢理解這段話的含義。
數(shù)據(jù)結(jié)構(gòu)研究什么?
數(shù)據(jù)的邏輯結(jié)構(gòu)和其存儲(chǔ)的物理結(jié)構(gòu)
為不同的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)不同的算法
對(duì)應(yīng)的算法的時(shí)間復(fù)雜度(效率)
緣何產(chǎn)生
1968年唐納德·克努特教授開(kāi)創(chuàng)了數(shù)據(jù)結(jié)構(gòu)的最初體系,他所著的《計(jì)算機(jī)程序設(shè)計(jì)技巧》第一卷《基本算法》是第一本較系統(tǒng)地闡述數(shù)據(jù)的邏輯結(jié)構(gòu)和存儲(chǔ)結(jié)構(gòu)及其操作的著作。
20世紀(jì)70年代初,出現(xiàn)了大型程序,軟件也開(kāi)始相對(duì)獨(dú)立,結(jié)構(gòu)程序設(shè)計(jì)成為程序設(shè)計(jì)方法學(xué)的主要內(nèi)容,數(shù)據(jù)結(jié)構(gòu)作為一門(mén)獨(dú)立的課程開(kāi)始進(jìn)入大學(xué)課堂。
課程框架
課程綱要
0.1 / 專(zhuān)欄導(dǎo)讀
第一章線性結(jié)構(gòu)
1.1 / 線性表
1.2 / 棧
1.3 / 隊(duì)列
第二章樹(shù)結(jié)構(gòu)
2.1 / 樹(shù)和二叉樹(shù)
2.2 / 遍歷二叉樹(shù)和線索二叉樹(shù)
2.3 / 哈夫曼樹(shù)和哈弗慢編碼
2.4 / 堆
第三章圖結(jié)構(gòu)
3.1 / 圖和圖的遍歷
3.2 / 最短路徑問(wèn)題
3.3 / 最小生成樹(shù)
第四章查找
4.1 / 靜態(tài)查找表
4.2 / 動(dòng)態(tài)查找表
4.3 / 哈希表
第五章排序
5.1 / 插入排序
5.2 / 快速排序
5.3 / 選擇排序
5.4 / 歸并排序
5.5 / 基數(shù)排序
第六章延伸
(本章內(nèi)容和篇數(shù)視情況而定)
參考資料
嚴(yán)蔚敏《數(shù)據(jù)結(jié)構(gòu)》(清華大學(xué)出版社)
陳越《數(shù)據(jù)結(jié)構(gòu)》(高等教育出版社)
教學(xué)工具(預(yù)備知識(shí))
本專(zhuān)欄教學(xué)內(nèi)容以C語(yǔ)言為樣例代碼,希望你可以具備C語(yǔ)言的基本知識(shí)。
C語(yǔ)言基礎(chǔ)可參考:
http://www.runoob.com/cprogramming/c-tutorial.html
http://www.imooc.com/learn/249
推薦閱讀
以下書(shū)目雖然和本專(zhuān)欄教學(xué)內(nèi)容并無(wú)太大關(guān)系,請(qǐng)相信我,他們對(duì)于剛剛走上或者即將走上這條道路的你會(huì)有很大的幫助。
結(jié)城浩(Hiroshi Yuki)《程序員的數(shù)學(xué)》(人民郵電出版社)
喬恩·本特利(Jon Bentley)《編程珠璣》(人民郵電出版社)
鄒欣《構(gòu)建之法》(人民郵電出版社)
吳軍《數(shù)學(xué)之美》(人民郵電出版社)
本來(lái)這個(gè)系列作為《了不起的數(shù)據(jù)結(jié)構(gòu)》是發(fā)豆瓣專(zhuān)欄的,可仿佛豆瓣不太喜歡專(zhuān)業(yè)性的文章,看來(lái)還要繼續(xù)修訂《信息浪潮》。
也好沒(méi)了交稿日期,可以輕松一點(diǎn)寫(xiě)這個(gè)系列,在簡(jiǎn)書(shū)慢慢與大家分享。