專欄作者/ 樹華子
專欄導(dǎo)讀
算法+ 數(shù)據(jù)結(jié)構(gòu) = 程序
在計算機(jī)領(lǐng)域岖圈,有這樣一個人盡皆知的著名公式,「算法+ 數(shù)據(jù)結(jié)構(gòu) = 程序」钙皮,可以說如果把編寫程序比作烹飪蜂科,那么數(shù)據(jù)結(jié)構(gòu)就好比菜譜中食材用量顽决,算法就好比烹飪步驟。這個公式由瑞士計算機(jī)科學(xué)家崇摄,Pascal之父擎值,尼古拉斯·沃斯于1976年提出。很多人覺得它已經(jīng)完全過時了逐抑,其實并不然鸠儿。鄒欣的《構(gòu)建之法》一書中對這個著名公式進(jìn)行了補(bǔ)充,他說道「程序 = 數(shù)據(jù)結(jié)構(gòu)+算法厕氨、 軟件 = 程序 + 軟件工程」进每。雖然當(dāng)今的軟件開發(fā)過程已經(jīng)不像是上個世紀(jì)那樣簡單,但這并不是不去好好學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)這門課程的理由命斧。算法和數(shù)據(jù)結(jié)構(gòu)就如同程序員的基本功田晚,是重中之重,掌握了其中的思想和原理国葬,很多問題才可以迎刃而解贤徒。
很多同學(xué)可能會問,「我大概知道算法的含義汇四,可數(shù)據(jù)結(jié)構(gòu)到底是什么呢接奈?」
什么是數(shù)據(jù)結(jié)構(gòu)?
要回答這個問題,首先要回答「什么是數(shù)據(jù)通孽?」
數(shù)據(jù)是對客觀事物的符號表示序宦,在計算機(jī)科學(xué)中是指所有能輸入到計算機(jī)中并被計算機(jī)處理的符號的總稱,在不同是場景中數(shù)據(jù)有不同的表現(xiàn)形式背苦,可以是數(shù)字(整數(shù)互捌、浮點(diǎn)數(shù)等等)、字符串甚至是圖像行剂、聲音秕噪。
現(xiàn)在你明白了數(shù)據(jù)的概念,但還不夠厚宰,你需要明白「什么是數(shù)據(jù)元素腌巾?」
數(shù)據(jù)元素是數(shù)據(jù)的基本單位,在計算機(jī)程序中通常作為一個整體進(jìn)行考慮和處理固阁。
為了便于理解壤躲,我們舉一個簡單的例子城菊。在整數(shù)數(shù)據(jù)中替废,整數(shù)“1”可以視作一個數(shù)據(jù)元素躁垛,在本文中我們暫且以上圖形式表示它。
接下來你還需要知道另一個概念,「什么是數(shù)據(jù)對象员萍?」
數(shù)據(jù)對象是性質(zhì)相同的數(shù)據(jù)元素的集合例书,是數(shù)據(jù)的一個子集。
繼續(xù)剛才的例子,整數(shù)數(shù)據(jù)對象可以表示為N={...,-1,0,1,2,...}撕贞,在本文中我們暫且以上圖形式表示它。
好了测垛,現(xià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ù)對象。
對于數(shù)據(jù)集合{1,2,3,7,10}锯七,當(dāng)數(shù)據(jù)元素之間關(guān)系僅為“同屬一個集合”链快,此外無其他關(guān)系時,我們暫且以如下的集合來表示:
當(dāng)數(shù)據(jù)元素之間存在一對一的關(guān)系時眉尸,例如對于上述集合域蜗,若任意兩個元素A和元素B之間存在「A是集合中大于B的最小的元素」這種關(guān)系,則可以使用如下的線性結(jié)構(gòu)加以表示:
當(dāng)數(shù)據(jù)元素之間存在一對多的關(guān)系時噪猾,例如對于同樣的集合霉祸,若元素A和元素B之間存在「可由A和集合中另一元素相加得到B」這種關(guān)系,則可以使用如下的樹形結(jié)構(gòu)加以表示:
當(dāng)數(shù)據(jù)元素之間存在多對多的關(guān)系時畏妖,例如對于同樣的集合脉执,若元素A和元素B之間存在「A和B互質(zhì)」這種關(guān)系,則可以使用如下的圖狀結(jié)構(gòu)加以表示:
想必你已經(jīng)對數(shù)據(jù)結(jié)構(gòu)和它的種類有了大體的認(rèn)識戒劫,實際上半夷,對于數(shù)據(jù)結(jié)構(gòu)這個概念,至今尚未有一個被一致公認(rèn)的定義迅细,不同的人在使用這個詞的時候所表達(dá)的意思可能是不同的巫橄,請看一段關(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.
(請嘗試閱讀理解上面這段話,計算機(jī)領(lǐng)域?qū)τ⒄Z水平是有基本的要求的...畢竟作為一個“程序員”以后有很多機(jī)會混跡SO或是github)
一種數(shù)據(jù)結(jié)構(gòu)是用來組織和存儲數(shù)據(jù)的一種特定格式茵典。常見的數(shù)據(jù)結(jié)構(gòu)類型包括數(shù)組湘换、文件、記錄统阿、表彩倚、樹等等。任何數(shù)據(jù)結(jié)構(gòu)都被設(shè)計用來組織數(shù)據(jù)以適應(yīng)于特定的目的扶平,因此它必須可以訪問并且可以在特定方式下工作帆离。在計算機(jī)編程中,一個數(shù)據(jù)結(jié)構(gòu)可以被選擇或設(shè)計以為不同的算法存儲數(shù)據(jù)结澄。
如果你暫時認(rèn)為上述解釋有些晦澀難懂也沒有關(guān)系哥谷,在日后的學(xué)習(xí)中相信你會慢慢理解這段話的含義岸夯。
數(shù)據(jù)結(jié)構(gòu)研究什么?
數(shù)據(jù)的邏輯結(jié)構(gòu)和其存儲的物理結(jié)構(gòu)
為不同的數(shù)據(jù)結(jié)構(gòu)設(shè)計不同的算法
對應(yīng)的算法的時間復(fù)雜度(效率)
緣何產(chǎn)生
1968年唐納德·克努特教授開創(chuàng)了數(shù)據(jù)結(jié)構(gòu)的最初體系,他所著的《計算機(jī)程序設(shè)計技巧》第一卷《基本算法》是第一本較系統(tǒng)地闡述數(shù)據(jù)的邏輯結(jié)構(gòu)和存儲結(jié)構(gòu)及其操作的著作们妥。
20世紀(jì)70年代初猜扮,出現(xiàn)了大型程序,軟件也開始相對獨(dú)立监婶,結(jié)構(gòu)程序設(shè)計成為程序設(shè)計方法學(xué)的主要內(nèi)容旅赢,數(shù)據(jù)結(jié)構(gòu)作為一門獨(dú)立的課程開始進(jìn)入大學(xué)課堂。
課程框架
課程綱要
0.1 / 專欄導(dǎo)讀
第一章線性結(jié)構(gòu)
1.1 / 線性表
1.2 / 棧
1.3 / 隊列
第二章樹結(jié)構(gòu)
2.1 / 樹和二叉樹
2.2 / 遍歷二叉樹和線索二叉樹
2.3 / 哈夫曼樹和哈弗慢編碼
2.4 / 堆
第三章圖結(jié)構(gòu)
3.1 / 圖和圖的遍歷
3.2 / 最短路徑問題
3.3 / 最小生成樹
第四章查找
4.1 / 靜態(tài)查找表
4.2 / 動態(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ù)備知識)
本專欄教學(xué)內(nèi)容以C語言為樣例代碼惑惶,希望你可以具備C語言的基本知識鲜漩。
C語言基礎(chǔ)可參考:
http://www.runoob.com/cprogramming/c-tutorial.html
http://www.imooc.com/learn/249
推薦閱讀
以下書目雖然和本專欄教學(xué)內(nèi)容并無太大關(guān)系,請相信我集惋,他們對于剛剛走上或者即將走上這條道路的你會有很大的幫助孕似。
結(jié)城浩(Hiroshi Yuki)《程序員的數(shù)學(xué)》(人民郵電出版社)
喬恩·本特利(Jon Bentley)《編程珠璣》(人民郵電出版社)
鄒欣《構(gòu)建之法》(人民郵電出版社)
吳軍《數(shù)學(xué)之美》(人民郵電出版社)
本來這個系列作為《了不起的數(shù)據(jù)結(jié)構(gòu)》是發(fā)豆瓣專欄的,可仿佛豆瓣不太喜歡專業(yè)性的文章刮刑,看來還要繼續(xù)修訂《信息浪潮》喉祭。
也好沒了交稿日期,可以輕松一點(diǎn)寫這個系列雷绢,在簡書慢慢與大家分享泛烙。