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