《數(shù)據(jù)結(jié)構(gòu)(第2版)》的主要任務(wù)是介紹并探討有關(guān)數(shù)據(jù)組織、算法設(shè)計、時間和空間效率的概念和通用分析方法,幫助讀者學(xué)會數(shù)據(jù)的組織方法和現(xiàn)實世界問題在計算機內(nèi)部的表示方法,針對問題的應(yīng)用背景分析,選擇合適的數(shù)據(jù)結(jié)構(gòu),從而培養(yǎng)高級程序設(shè)計技能。 《數(shù)據(jù)結(jié)構(gòu)(第2版)》第1章介紹了數(shù)據(jù)結(jié)構(gòu)與算法的基本概念;第2章是對C語言關(guān)鍵內(nèi)容的復(fù)習(xí),為后續(xù)章節(jié)理解數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)做準(zhǔn)備;第3章至第7章分別介紹了線性表、樹、散列表、圖、排序算法等經(jīng)典數(shù)據(jù)結(jié)構(gòu)與算法;最后在第8章通過對兩個實際生活中提煉出的問題的解答,幫助讀者更深刻地體會數(shù)據(jù)結(jié)構(gòu)的應(yīng)用。 《數(shù)據(jù)結(jié)構(gòu)(第2版)》可作為高等學(xué)校計算機類專業(yè)“數(shù)據(jù)結(jié)構(gòu)”課程的教材。
《數(shù)據(jù)結(jié)構(gòu)(第2版)》特色:
《數(shù)據(jù)結(jié)構(gòu)(第2版)》的主要任務(wù)是介紹并探討有關(guān)數(shù)據(jù)組織、算法設(shè)計、時間和空間效率的概念和通用分析方法,幫助讀者學(xué)會數(shù)據(jù)的組織方法和現(xiàn)實世界問題在計算機內(nèi)部的表示方法,針對問題的應(yīng)用背景分析,選擇合適的數(shù)據(jù)結(jié)構(gòu),從而培養(yǎng)高級程序設(shè)計技能。
從實際應(yīng)用問題出發(fā),導(dǎo)出各種經(jīng)典數(shù)據(jù)結(jié)構(gòu)的定義、實現(xiàn)(存儲)方法以及操作實現(xiàn),并以更豐富的綜合應(yīng)用案例幫助讀者增強對理論的感性認(rèn)識,從而明白這些數(shù)據(jù)結(jié)構(gòu)為什么存在、以及在什么情況下可以解決什么樣的問題。
提供了豐富的學(xué)習(xí)資源,包括源代碼及配套電子課件、浙江大學(xué)提供的在線系統(tǒng)PTA、《數(shù)據(jù)結(jié)構(gòu)學(xué)習(xí)與實驗指導(dǎo)(第2版)》等。讀者可以通過使用這些學(xué)習(xí)資源隨時檢測自己的學(xué)習(xí)效果與編程能力。
“數(shù)據(jù)結(jié)構(gòu)”是計算機類專業(yè)的重要專業(yè)基礎(chǔ)課。它所討論的知識內(nèi)容和提倡的技術(shù)方法,無論對進(jìn)一步學(xué)習(xí)計算機相關(guān)領(lǐng)域的其他課程,還是對從事大型信息工程的開發(fā),都有著樞紐的作用。
解決問題往往有多種方法,且不同方法之間的效率可能相差甚遠(yuǎn)。解決問題方法的效率,與數(shù)據(jù)的組織方式有關(guān),與空間的利用效率有關(guān),也與方法的巧妙程度有關(guān)。本書的主要任務(wù)是介紹并探討有關(guān)數(shù)據(jù)組織、算法設(shè)計、時間和空間效率的概念和通用分析方法,幫助讀者學(xué)會數(shù)據(jù)的組織方法和現(xiàn)實世界問題在計算機內(nèi)部的表示方法,針對問題的應(yīng)用背景分析,選擇合適的數(shù)據(jù)結(jié)構(gòu),從而培養(yǎng)高級程序設(shè)計技能。
本書的特點是從實際應(yīng)用問題出發(fā),導(dǎo)出各種經(jīng)典數(shù)據(jù)結(jié)構(gòu)的定義、實現(xiàn)(存儲)方法以及操作實現(xiàn),并以更豐富的綜合應(yīng)用案例幫助讀者增強對理論的感性認(rèn)識,從而明白這些數(shù)據(jù)結(jié)構(gòu)為什么存在,以及在什么情況下可以最好地解決什么樣的問題。
數(shù)據(jù)結(jié)構(gòu)的思想和原理是不依賴于編程語言的,但對于每一個抽象概念的具體實現(xiàn)和應(yīng)用則需要一種編程語言作為載體。本書根據(jù)國內(nèi)多數(shù)學(xué)校計算機專業(yè)教學(xué)的實際情況,選擇了C語言作為具體實現(xiàn)的語言,并提供了大量可以直接編譯運行的源代碼。不僅使得學(xué)生在學(xué)習(xí)時容易起步,可以在現(xiàn)有源代碼的基礎(chǔ)上不斷修改擴充,從而解決更為復(fù)雜的問題,而且也為IT專業(yè)人士提供了方便的經(jīng)典代碼庫。
本書第1章介紹了數(shù)據(jù)結(jié)構(gòu)與算法的基本概念和兩者的關(guān)聯(lián),重點介紹了抽象數(shù)據(jù)類型和算法復(fù)雜度的概念;第2章基本上是對C語言關(guān)鍵內(nèi)容的復(fù)習(xí),為后續(xù)章節(jié)理解數(shù)據(jù)結(jié)構(gòu)的實現(xiàn)做準(zhǔn)備;第3章介紹了線性表以及最基本的兩種應(yīng)用——堆棧和隊列;第4章討論一種重要的非線性結(jié)構(gòu)——樹,重點介紹了二叉樹和搜索樹,并將查找、哈夫曼樹和集合表示等作為樹形結(jié)構(gòu)的應(yīng)用進(jìn)行了討論;第5章通過對從海量信息中高效查找關(guān)鍵字問題的再思考,引出對散列表和經(jīng)典哈希映射技術(shù)的討論;第6章介紹圖的各種表示方法和相關(guān)算法;第7章討論了各種經(jīng)典的排序算法;最后在第8章通過對兩個實際生活中提煉出的問題的求解,幫助讀者更深刻體會數(shù)據(jù)結(jié)構(gòu)的應(yīng)用。
讀者可以根據(jù)自身的基礎(chǔ)選擇相應(yīng)章節(jié)進(jìn)行閱讀,熟悉C語言的讀者完全可以跳過第2章有關(guān)C語言基礎(chǔ)的部分。目錄中帶*號的章節(jié)及習(xí)題中帶*號的題目,是本書的擴展內(nèi)容,讀者可以在學(xué)習(xí)基礎(chǔ)內(nèi)容之后再閱讀擴展內(nèi)容。
本書作為第2版,除了修訂第1版的錯誤外,還重新整理了全部源代碼,提供了部分微視頻,并提供了新的在線練習(xí)資源。希望讀者能通過本書的學(xué)習(xí)提高實踐能力,使數(shù)據(jù)結(jié)構(gòu)與算法成為用計算機解決實際問題的有效工具。
陳越,浙江大學(xué)計算機科學(xué)與技術(shù)學(xué)院教授,教育部高等學(xué)校軟件工程專業(yè)教學(xué)指導(dǎo)委員會委員。為程序設(shè)計能力標(biāo)準(zhǔn)化測試(PAT)系統(tǒng)的創(chuàng)始人。與何欽銘教授共同在“中國大學(xué)MOOC”和網(wǎng)易“云課程”平臺開設(shè)在線開放課程“數(shù)據(jù)結(jié)構(gòu)”,注冊人數(shù)累計超過8萬人。為國家精品課程“軟件工程”、國家雙語示范課程“數(shù)據(jù)結(jié)構(gòu)與算法”、國家教學(xué)團(tuán)隊“程序設(shè)計系列課程教學(xué)團(tuán)隊”的負(fù)責(zé)人。曾獲教學(xué)成果二等獎、浙江省教學(xué)成果一等獎、寶鋼優(yōu)秀教師獎等。
第1章 概論
1.1 引子
1.2 數(shù)據(jù)結(jié)構(gòu)
1.2.1 定義
1.2.2 抽象數(shù)據(jù)類型
1.3 算法
1.3.1 定義
1.3.2 算法復(fù)雜度
1.3.3 漸進(jìn)表示法
1.4 應(yīng)用實例:最大子列和問題
本章小結(jié)
習(xí)題
第2章 數(shù)據(jù)結(jié)構(gòu)實現(xiàn)基礎(chǔ)
2.1 引子
2.2 數(shù)據(jù)存儲基礎(chǔ)
2.2.1 數(shù)組
2.2.2 類型定義typedef
2.2.3 指針
2.2.4 結(jié)構(gòu)
2.2.5 鏈表
2.3 流程控制基礎(chǔ)
2.3.1 分支控制
2.3.2 循環(huán)控制
2.3.3 函數(shù)與遞歸
本章小結(jié)
習(xí)題
第3章 線性結(jié)構(gòu)
3.1 引子
3.2 線性表的定義與實現(xiàn)
3.2.1 線性表的定義
3.2.2 線性表的順序存儲實現(xiàn)
3.2.3 線性表的鏈?zhǔn)酱鎯崿F(xiàn)
3.2.4 廣義表與多重鏈表
3.3 堆棧
3.3.1 堆棧的定義
3.3.2 堆棧的實現(xiàn)
3.3.3 堆棧應(yīng)用:表達(dá)式求值
3.4 隊列
3.4.1 隊列的定義
3.4.2 隊列的實現(xiàn)
3.5 應(yīng)用實例
3.5.1 多項式加法運算
3.5.2 迷宮問題
本章小結(jié)
習(xí)題
第4章 樹
4.1 引子
4.1.1 問題的提出
4.1.2 查找
4.2 樹的定義、表示和術(shù)語
4.3 二叉樹
4.3.1 二叉樹的定義及其邏輯表示
4.3.2 二叉樹的性質(zhì)
4.3.3 二叉樹的存儲結(jié)構(gòu)
4.3.4 二叉樹的操作
4.4 二叉搜索樹
4.4.1 二叉搜索樹的定義
4.4.2 二叉搜索樹的動態(tài)查找
4.4.3 二叉搜索樹的插入
4.4.4 二叉搜索樹的刪除
4.5 平衡二叉樹
4.5.1 平衡二叉樹的定義
4.5.2 平衡二叉樹的調(diào)整
4.6 樹的應(yīng)用
4.6.1 堆及其操作
4.6.2 哈夫曼樹
4.6.3 集合及其運算
本章小結(jié)
習(xí)題
第5章 散列查找
5.1 引子
5.2 基本概念
5.3 散列函數(shù)的構(gòu)造方法
5.3.1 數(shù)字關(guān)鍵詞的散列函數(shù)構(gòu)造
5.3.2 字符串關(guān)鍵詞的散列函數(shù)構(gòu)造
5.4 處理沖突的方法
5.4.1 開放定址法
5.4.2 分離鏈接法
5.5 散列表的性能分析
5.6 應(yīng)用實例
本章小結(jié)
習(xí)題
第6章 圖
6.1 引子
6.2 圖的基本概念
6.2.1 圖的定義和術(shù)語
6.2.2 圖的抽象數(shù)據(jù)類型
6.3 圖的存儲結(jié)構(gòu)
6.3.1 鄰接矩陣
6.3.2 鄰接表
6.4 圖的遍歷
6.4.1 迷宮探索
6.4.2 深度優(yōu)先搜索
6.4.3 廣度優(yōu)先搜索
6.5 最小生成樹
6.5.1 生成樹的構(gòu)建與最小生成樹的概念
6.5.2 構(gòu)造最小生成樹的Prim算法
6.5.3 構(gòu)造最小生成樹的Kruskal算法
6.6 最短路徑
6.6.1 單源最短路徑
6.6.2 每一對頂點之間的最短路徑
6.7 拓?fù)渑判?/span>
6.8 關(guān)鍵路徑計算
6.9 應(yīng)用實例
6.9.1 六度空間理論
6.9.2 六度分隔理論的驗證
本章小結(jié)
習(xí)題
第7章 排序
7.1 引子
7.2 選擇排序
7.2.1 簡單選擇排序
7.2.2 堆排序
7.3 插入排序
7.3.1 簡單插入排序
7.3.2 希爾排序
7.4 交換排序
7.4.1 冒泡排序
7.4.2 快速排序
7.5 歸并排序
7.6 基數(shù)排序
7.6.1 桶排序
7.6.2 基數(shù)排序
7.6.3 單關(guān)鍵字的基數(shù)分解
7.7 外部排序
7.8 排序的比較和應(yīng)用
7.8.1 排序算法的比較
7.8.2 排序算法應(yīng)用案例
本章小結(jié)
習(xí)題
第8章 綜合應(yīng)用案例分析
8.1 銀行排隊問題
8.1.1 單隊列多窗口服務(wù)
8.1.2 單隊列多窗口+VIP服務(wù)
8.2 暢通工程問題
8.2.1 建設(shè)道路數(shù)量問題
8.2.2 最低成本建設(shè)問題
本章小結(jié)
習(xí)題
附錄PTA使用說明
參考文獻(xiàn)