數(shù)據(jù)結(jié)構(gòu)、算法與應(yīng)用
定 價:79 元
叢書名:計算機(jī)科學(xué)叢書
- 作者:(美) 薩特吉·薩尼著
- 出版時間:2015/4/1
- ISBN:9787111496007
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP311.12
- 頁碼:544
- 紙張:膠版紙
- 版次:1
- 開本:16K
本書共分三個部分。第一部分從第1章到第4章,旨在復(fù)習(xí)C++程序設(shè)計的概念以及程序性能的分析和測量方法。第二部分從第5章到第16章,研究數(shù)據(jù)結(jié)構(gòu),包括線性表、數(shù)組和矩陣、棧、隊列、字典、二叉樹、優(yōu)先級隊列、競賽樹、搜索樹和圖等。第三部分從第17章到第21章,研究常用算法,包括貪婪算法、分而治之算法、動態(tài)規(guī)劃、回溯算法和分枝定界算法。本書有800多道練習(xí)題和50多個應(yīng)用實(shí)例。內(nèi)容廣博,組織合理,論述清晰,循序漸進(jìn),而且對程序性能的分析和測量系統(tǒng)入微。
DataStructures,Algorithms,andApplicationsinC++,SecondEdition對數(shù)據(jù)結(jié)構(gòu)和算法的研究是計算機(jī)科學(xué)和工程的基礎(chǔ)。精通這方面的知識,對開發(fā)能夠有效利用計算機(jī)資源的程序是必不可少的。因此,所有計算機(jī)科學(xué)和工程專業(yè)都有一門或幾門課程專門用來講授這方面的內(nèi)容。一般來說,第一門程序設(shè)計課程介紹數(shù)據(jù)結(jié)構(gòu)和算法的基礎(chǔ)知識(數(shù)據(jù)結(jié)構(gòu)的棧和隊列,算法的排序和矩陣運(yùn)算)。第二門程序設(shè)計課程介紹數(shù)據(jù)結(jié)構(gòu)和算法的系統(tǒng)知識。隨后,可以對數(shù)據(jù)結(jié)構(gòu)和算法進(jìn)行深入的研究,這通常需要一門或兩門課程。
計算機(jī)科學(xué)和工程的本科專業(yè)課程過多,已經(jīng)迫使很多高等院校進(jìn)行課程整合。例如,在佛羅里達(dá)大學(xué),給本科生只開設(shè)一學(xué)期的數(shù)據(jù)結(jié)構(gòu)和算法的課程。在學(xué)習(xí)本課程之前,要求學(xué)生已經(jīng)學(xué)過一學(xué)期的Java程序設(shè)計和離散數(shù)學(xué)。
本書既可以用于兩門或更多的專門研究數(shù)據(jù)結(jié)構(gòu)和算法的課程,也可以用于相關(guān)的一門綜合課程。全書共分三個部分。第一部分從第1章到第4章,旨在復(fù)習(xí)C++程序設(shè)計的概念以及程序性能的分析和測量方法。對于熟悉C語言程序設(shè)計的學(xué)生,通過學(xué)習(xí)第1章應(yīng)該能夠過渡到C++。第1章雖然不是C++的入門知識,但是依然包含了C++的一些基本概念,這些概念常令學(xué)生感到困惑,如參數(shù)傳遞、模板函數(shù)、動態(tài)存儲分配、遞歸、類、繼承、異常的拋出和捕捉。第2章和第3章復(fù)習(xí)了程序性能的分析和測量方法——操作計數(shù)、執(zhí)行步數(shù)和漸近符號(大O、Ω、Θ,小o)。第4章復(fù)習(xí)了程序性能的實(shí)驗(yàn)測量方法,還簡要地討論了高速緩沖存儲器對運(yùn)行時間測量的影響問題。第2章通過程序性能分析方法的應(yīng)用,深入研究了在程序設(shè)計入門課程中遇到的典型的基礎(chǔ)性算法:簡單的排序算法(冒泡排序、選擇排序、插入排序和計數(shù)排序),順序搜索,利用Horner法則進(jìn)行多項(xiàng)式求值,矩陣運(yùn)算(矩陣相加、矩陣轉(zhuǎn)置、矩陣相乘)。第3章研究了二分搜索算法。盡管第2章到第4章的主要目的是學(xué)習(xí)程序性能的分析和測量方法,但是也讓學(xué)生精通了一組基本算法。
本書第二部分從第5章到第16章,深入研究了數(shù)據(jù)結(jié)構(gòu)。第5章和第6章分別研究了數(shù)據(jù)的數(shù)組描述方法和指針(或鏈?zhǔn)剑┟枋龇椒,?gòu)建起數(shù)據(jù)結(jié)構(gòu)研究的框架。這兩章用這兩種數(shù)據(jù)描述方法來創(chuàng)建C++類,以描述線性表數(shù)據(jù)結(jié)構(gòu)。我們通過實(shí)驗(yàn)數(shù)據(jù)對不同的數(shù)據(jù)描述方法在描述線性表時的性能進(jìn)行了比較。第二部分從第7章以后都是應(yīng)用第5章和第6章的描述方法來描述其他的數(shù)據(jù)結(jié)構(gòu),如數(shù)組和矩陣(第7章)、棧(第8章)、隊列(第9章)、字典(第10、14和15章)、二叉樹(第11章)、優(yōu)先級隊列(第12章)、競賽樹(第15章)和圖(第16章)。
本書在處理數(shù)據(jù)結(jié)構(gòu)時,試圖做到與C++標(biāo)準(zhǔn)模板庫(STL)所使用的結(jié)構(gòu)在相似性或同一性上保持兼容。例如,第5章的線性表數(shù)據(jù)結(jié)構(gòu)便是按照STL的類vector的模式而建立的。本書通篇都利用了STL的函數(shù),諸如copy、min和max,學(xué)生由此會熟悉這些函數(shù)。
本書第三部分從第17章到第21章,研究常用的算法設(shè)計方法。這些方法有貪婪算法(第17章)、分而治之算法(第18章)、動態(tài)規(guī)劃(第19章)、回溯算法(第20章)和分支定界算法(第21章)。另外還包括兩種下限的證明(最小最大問題和排序問題)(18.4節(jié))、機(jī)器調(diào)度的近似算法(12.6.2節(jié))、箱子裝載算法(13.5節(jié))和0/1背包問題(17.3.2節(jié))。12.6.2節(jié)還簡略地介紹了NP-復(fù)雜問題。
本書的一個特色是強(qiáng)調(diào)應(yīng)用。書中的每一種數(shù)據(jù)結(jié)構(gòu)和算法設(shè)計都通過多個應(yīng)用實(shí)例來演示。通常每一章的最后一節(jié)都針對本章介紹的數(shù)據(jù)結(jié)構(gòu)或設(shè)計方法給出具體的應(yīng)用。很多時候,在一章的前面幾節(jié)也包含一些應(yīng)用實(shí)例。這些應(yīng)用實(shí)例涉及多個方面——排序(冒泡排序、選擇排序、插入排序、計數(shù)排序、堆排序、歸并排序、快速排序、箱子排序、基數(shù)排序和拓?fù)渑判颍;矩陣運(yùn)算(矩陣加法、矩陣轉(zhuǎn)置、矩陣乘法);電路設(shè)計自動化(搜索電路網(wǎng)組、電路布線、元件折疊、開關(guān)盒布線、設(shè)置信號放大器、交叉分布、電路板排列);壓縮編碼(LZW壓縮、霍夫曼編碼);計算幾何(凸包和最近點(diǎn)對);仿真(工廠仿真);圖像處理(圖元標(biāo)注);趣味數(shù)學(xué)(漢諾塔、殘缺棋盤、迷宮老鼠);調(diào)度(LPT調(diào)度);優(yōu)化(裝箱問題、貨箱裝載、0/1背包、矩陣乘法鏈);統(tǒng)計(直方圖、尋找最大值和最小值、尋找第k個最小值);圖論(生成樹、圖元、最短路徑、最大完備子圖、二分覆蓋和旅行商)。研究這些應(yīng)用實(shí)例不需要學(xué)生具有相關(guān)領(lǐng)域的預(yù)備知識,因?yàn)楸緯诉@些知識,而且這些知識會提高學(xué)生的學(xué)習(xí)興趣。
我們希望通過把實(shí)際應(yīng)用與數(shù)據(jù)結(jié)構(gòu)和算法設(shè)計方法的基礎(chǔ)研究緊密結(jié)合,能夠激發(fā)學(xué)生更大的專業(yè)興趣。學(xué)生通過完成本書和本書網(wǎng)站的800多道練習(xí)題,知識將會更加豐富和牢固。
Sartaj Sahni,佛羅里達(dá)大學(xué)計算機(jī)與信息科學(xué)工程系杰出教授,歐洲科學(xué)院院士,美國電氣和電子工程師協(xié)會(IEEE)、美國計算機(jī)協(xié)會(ACM)、美國科學(xué)促進(jìn)會(AAAS)和明尼蘇達(dá)超級計算機(jī)研究所的成員,坎普爾印度理工學(xué)院( lIT)的杰出校友。Sahni博士獲得1997年IEEE計算機(jī)分會的Taylor L Booth教育獎,2003年IEEE計算機(jī)分會的W.Wallace McDowell獎和2003年ACM的Karl Karlstrom杰出教育家獎。他目前還擔(dān)任ACM《Computing Surveys》期刊的總編輯,還是17個期刊編委會成員。他在坎普爾印度理工學(xué)院獲得電子工程學(xué)士學(xué)位,在康奈爾大學(xué)獲得計算機(jī)科學(xué)碩士和博士學(xué)位,發(fā)表過250多篇論文,編寫了1 5本教科書,研究成果所涉及的領(lǐng)域包括有效算法的設(shè)計與分析、并行計算、互聯(lián)網(wǎng)、自動化設(shè)計和醫(yī)用算法。
Data Structures, Algorithms, and Applications in C++, Second Edition
出版者的話
譯者序
前言
第一部分 預(yù)備知識
第1章 C++回顧
1.1 引言
1.2 函數(shù)與參數(shù)
1.2.1 傳值參數(shù)
1.2.2 模板函數(shù)
1.2.3 引用參數(shù)
1.2.4 常量引用參數(shù)
1.2.5 返回值
1.2.6 重載函數(shù)
1.3 異常
1.3.1 拋出異常
1.3.2 處理異常
1.4 動態(tài)存儲空間分配
1.4.1 操作符new
1.4.2 一維數(shù)組
1.4.3 異常處理
1.4.4 操作符delete
1.4.5 二維數(shù)組
1.5 自有數(shù)據(jù)類型
1.5.1 類currency
1.5.2 一種不同的描述方法
1.5.3 操作符重載
1.5.4 友元和保護(hù)性類成員
1.5.5 增加#ifndef、#define和#endif語句
1.6 異常類illegalParameterValue
1.7 遞歸函數(shù)
1.7.1 遞歸的數(shù)學(xué)函數(shù)
1.7.2 歸納
1.7.3 C++遞歸函數(shù)
1.8 標(biāo)準(zhǔn)模板庫
1.9 測試與調(diào)試
1.9.1 什么是測試
1.9.2 測試數(shù)據(jù)的設(shè)計
1.9.3 調(diào)試
1.10 參考及推薦讀物
第2章 程序性能分析
2.1 什么是程序性能
2.2 空間復(fù)雜度
2.2.1 空間復(fù)雜度的組成
2.2.2 舉例
2.3 時間復(fù)雜度
2.3.1 時間復(fù)雜度的組成
2.3.2 操作計數(shù)
2.3.3 最好、最壞和平均操作計數(shù)
2.3.4 步數(shù)
第3章 漸近記法
3.1 引言
3.2 漸近記法
3.2.1 大Ο記法
3.2.2 漸近記法Ω和Θ
3.3 漸近數(shù)學(xué)(可選)
3.3.1 大O記法
3.3.2 Ω記法
3.3.3 Θ記法
3.3.4 小ο記法
3.3.5 特性
3.4 復(fù)雜度分析舉例
3.5 實(shí)際復(fù)雜度
3.6 參考及推薦讀物
第4章 性能測量
4.1 引言
4.2 選擇實(shí)例的大小
4.3 設(shè)計測試數(shù)據(jù)
4.4 實(shí)驗(yàn)設(shè)計
4.5 高速緩存
4.5.1 簡單計算機(jī)模型
4.5.2 緩存未命中對運(yùn)行時間的影響
4.5.3 矩陣乘法
4.6 參考及推薦讀物
第二部分 數(shù)據(jù)結(jié)構(gòu)
第5章 線性表——數(shù)組描述
5.1 數(shù)據(jù)對象和數(shù)據(jù)結(jié)構(gòu)
5.2 線性表數(shù)據(jù)結(jié)構(gòu)
5.2.1 抽象數(shù)據(jù)類型linearList
5.2.2 抽象類linearList
5.3 數(shù)組描述
5.3.1 描述
5.3.2 變長一維數(shù)組
5.3.3 類arrayList
5.3.4 C++迭代器
5.3.5 arrayList的一個迭代器
5.4 vector的描述
5.5 在一個數(shù)組中實(shí)現(xiàn)的多重表
5.6 性能測量
5.7 參考及推薦讀物
第6章 線性表——鏈?zhǔn)矫枋?br />
6.1 單向鏈表
6.1.1 描述
6.1.2 結(jié)構(gòu)chainNode
6.1.3 類chain
6.1.4 抽象數(shù)據(jù)類型linearList的擴(kuò)充
6.1.5 類extendedChain
6.1.6 性能測量
6.2 循環(huán)鏈表和頭節(jié)點(diǎn)
6.3 雙向鏈表
6.4 鏈表用到的詞匯表
6.5 應(yīng)用
6.5.1 箱子排序
6.5.2 基數(shù)排序
6.5.3 凸包
6.5.4 并查集
第7章 數(shù)組和矩陣
7.1 數(shù)組
7.1.1 抽象數(shù)據(jù)類型
7.1.2 C++數(shù)組的索引
7.1.3 行主映射和列主映射
7.1.4 用數(shù)組的數(shù)組來描述
7.1.5 行主描述和列主描述
7.1.6 不規(guī)則二維數(shù)組
7.2 矩陣
7.2.1 定義和操作
7.2.2 類matrix
7.3 特殊矩陣
7.3.1 定義和應(yīng)用
7.3.2 對角矩陣
7.3.3 三對角矩陣
7.3.4 三角矩陣
7.3.5 對稱矩陣
7.4 稀疏矩陣
7.4.1 基本概念
7.4.2 用單個線性表描述
7.4.3 用多個線性表描述
7.4.4 性能測量
第8章 棧
8.1 定義和應(yīng)用
8.2 抽象數(shù)據(jù)類型
8.3 數(shù)組描述
8.3.1 作為一個派生類實(shí)現(xiàn)
8.3.2 類arrayStack
8.3.3 性能測量
8.4 鏈表描述
8.4.1 類derivedLinkedStack
8.4.2 類linkedStack
8.4.3 性能測量
8.5 應(yīng)用
8.5.1 括號匹配
8.5.2 漢諾塔
8.5.3 列車車廂重排
8.5.4 開關(guān)盒布線
8.5.5 離線等價類問題
8.5.6 迷宮老鼠
8.6 參考及推薦讀物
第9章 隊列
9.1 定義和應(yīng)用
9.2 抽象數(shù)據(jù)類型
9.3 數(shù)組描述
9.3.1 描述
9.3.2 類arrayQueue
9.4 鏈表描述
9.5 應(yīng)用
9.5.1 列車車廂重排
9.5.2 電路布線
9.5.3 圖元識別
9.5.4 工廠仿真
9.6 參考及推薦讀物
第10章 跳表和散列
10.1 字典
10.2 抽象數(shù)據(jù)類型
10.3 線性表描述
10.4 跳表表示(可選)
10.4.1 理想情況
10.4.2 插入和刪除
10.4.3 級的分配
10.4.4 結(jié)構(gòu)skipNode
10.4.5 類skipList
10.4.6 skipList方法的復(fù)雜度
10.5 散列表描述
10.5.1 理想散列
10.5.2 散列函數(shù)和散列表
10.5.3 線性探查
10.5.4 鏈?zhǔn)缴⒘?br />
10.6 一個應(yīng)用——文本壓縮
10.6.1 LZW壓縮
10.6.2 LZW壓縮的實(shí)現(xiàn)
10.6.3 LZW解壓縮
10.6.4 LZW解壓縮的實(shí)現(xiàn)
10.6.5 性能評價
10.7 參考及推薦讀物
第11章 二叉樹和其他樹
11.1 樹
11.2 二叉樹
11.3 二叉樹的特性
11.4 二叉樹的描述
11.4.1 數(shù)組描述
11.4.2 鏈表描述
11.5 二叉樹常用操作
11.6 二叉樹遍歷
11.7 抽象數(shù)據(jù)類型BinaryTree
11.8 類linkedBinaryTree
11.9 應(yīng)用
11.9.1 設(shè)置信號放大器
11.9.2 并查集
11.10 參考及推薦讀物
第12章 優(yōu)先級隊列
12.1 定義和應(yīng)用
12.2 抽象數(shù)據(jù)類型
12.3 線性表
12.4 堆
12.4.1 定義
12.4.2 大根堆的插入
12.4.3 大根堆的刪除
12.4.4 大根堆的初始化
12.4.5 類maxHeap
12.4.6 堆和STL
12.5 左高樹
12.5.1 高度優(yōu)先與寬度優(yōu)先的最大及最小左高樹
12.5.2 最大HBLT的插入
12.5.3 最大HBLT的刪除
12.5.4 兩棵最大HBLT的合并
12.5.5 初始化
12.5.6 類maxHblt
12.6 應(yīng)用
12.6.1 堆排序
12.6.2 機(jī)器調(diào)度
12.6.3 霍夫曼編碼
12.7 參考及推薦讀物
第13章 競賽樹
13.1 贏者樹和應(yīng)用
13.2 抽象數(shù)據(jù)類型WinnerTree
13.3 贏者樹的實(shí)現(xiàn)
13.3.1 表示
13.3.2 贏者樹的初始化
13.3.3 重新組織比賽
13.3.4 類completeWinnerTree
13.4 輸者樹
13.5 應(yīng)用
13.5.1 用最先適配法求解箱子裝載問題
13.5.2 用相鄰適配法求解箱子裝載問題
13.6 參考及推薦讀物
第14章 搜索樹
14.1 定義
14.1.1 二叉搜索樹
14.1.2 索引二叉搜索樹
14.2 抽象數(shù)據(jù)類型
14.3 二叉搜索樹的操作和實(shí)現(xiàn)
14.3.1 類binarySearchTree
14.3.2 搜索
14.3.3 插入
14.3.4 刪除
14.3.5 二叉搜索樹的高度
14.4 帶有相同關(guān)鍵字元素的二叉搜索樹
14.5 索引二叉搜索樹
14.6 應(yīng)用
14.6.1 直方圖
14.6.2 箱子裝載問題的最優(yōu)匹配法
14.6.3 交叉分布
第15章 平衡搜索樹
15.1 AVL樹
15.1.1 定義
15.1.2 AVL樹的高度
15.1.3 AVL樹的描述
15.1.4 AVL搜索樹的搜索
15.1.5 AVL搜索樹的插入
15.1.6 AVL搜索樹的刪除
15.2 紅-黑樹
15.2.1 基本概念
15.2.2 紅-黑樹的描述
15.2.3 紅-黑樹的搜索
15.2.4 紅-黑樹的插入
15.2.5 紅-黑樹的刪除
15.2.6 實(shí)現(xiàn)細(xì)節(jié)的考慮及復(fù)雜性分析
15.3 分裂樹
15.3.1 介紹
15.3.2 分裂樹的操作
15.3.3 折算復(fù)雜性
15.4 B-樹
15.4.1 索引順序訪問方法
15.4.2 m叉搜索樹
15.4.3 m階B-樹
15.4.4 B-樹的高度
15.4.5 B-樹的搜索
15.4.6 B-樹的插入
15.4.7 B-樹的刪除
15.4.8 節(jié)點(diǎn)結(jié)構(gòu)
15.5 參考及推薦讀物
第16章 圖
16.1 基本概念
16.2 應(yīng)用和更多的概念
16.3 特性
16.4 抽象數(shù)據(jù)類型graph
16.5 無權(quán)圖的描述
16.5.1 鄰接矩陣
16.5.2 鄰接鏈表
16.5.3 鄰接數(shù)組
16.6 加權(quán)圖的描述
16.7 類實(shí)現(xiàn)
16.7.1 不同的類
16.7.2 鄰接矩陣類
16.7.3 擴(kuò)充chain類
16.7.4 鏈表類
16.8 圖的遍歷
16.8.1 廣度優(yōu)先搜索
16.8.2 廣度優(yōu)先搜索的實(shí)現(xiàn)
16.8.3 方法graph::bfs的復(fù)雜性分析
16.8.4 深度優(yōu)先搜索
16.8.5 深度優(yōu)先搜索的實(shí)現(xiàn)
16.8.6 方法graph::dfs的復(fù)雜性分析
16.9 應(yīng)用
16.9.1 尋找一條路徑
16.9.2 連通圖及其構(gòu)成
16.9.3 生成樹
第三部分 算法設(shè)計方法
第17章 貪婪算法
17.1 最優(yōu)化問題
17.2 貪婪算法思想
17.3 應(yīng)用
17.3.1 貨箱裝載
17.3.2 0/1背包問題
17.3.3 拓?fù)渑判?br />
17.3.4 二分覆蓋
17.3.5 單源最短路徑
17.3.6 最小成本生成樹
17.4 參考及推薦讀物
第18章 分而治之
18.1 算法思想
18.2 應(yīng)用
18.2.1 殘缺棋盤
18.2.2 歸并排序
18.2.3 快速排序
18.2.4 選擇
18.2.5 相距最近的點(diǎn)對
18.3 解遞歸方程
18.4 復(fù)雜度的下限
18.4.1 最小最大問題的下限
18.4.2 排序算法的下限
第19章 動態(tài)規(guī)劃
19.1 算法思想
19.2 應(yīng)用
19.2.1 0/1背包問題
19.2.2 矩陣乘法鏈
19.2.3 所有頂點(diǎn)對之間的最短路徑
19.2.4 帶有負(fù)值的單源最短路徑
19.2.5 網(wǎng)組的無交叉子集
19.3 參考及推薦讀物
第20章 回溯法
20.1 算法思想
20.2 應(yīng)用
20.2.1 貨箱裝載
20.2.2 0/1背包問題
20.2.3 最大完備子圖
20.2.4 旅行商問題
20.2.5 電路板排列
第21章 分支定界
21.1 算法思想
21.2 應(yīng)用
21.2.1 貨箱裝載
21.2.2 0/1背包問題
21.2.3 最大完備子圖
21.2.4 旅行商問題
21.2.5 電路板排列