Java語言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)(進(jìn)階篇)(原書第11版)
定 價(jià):99 元
叢書名:華章教育
- 作者:[美]梁勇(Y. Daniel Liang)
- 出版時(shí)間:2018/10/1
- ISBN:9787111610038
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP312.8JA
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
本書是Java語言的經(jīng)典教材,中文版分為基礎(chǔ)篇和進(jìn)階篇,主要介紹程序設(shè)計(jì)基礎(chǔ)、面向?qū)ο蟪绦蛟O(shè)計(jì)、GUI程序設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)和算法、高級Java程序設(shè)計(jì)等內(nèi)容。本書以示例介紹解決問題的技巧,提供大量的程序清單,每章配有大量復(fù)習(xí)題和編程練習(xí)題,幫助讀者掌握編程技術(shù),并應(yīng)用所學(xué)技術(shù)解決實(shí)際工程問題。進(jìn)階篇突出數(shù)據(jù)結(jié)構(gòu)和算法,主要涵蓋以下內(nèi)容:泛型,規(guī)則集和映射,開發(fā)高效算法,實(shí)現(xiàn)線性表、棧、隊(duì)列和優(yōu)先隊(duì)列,二叉搜索樹,AVL樹,散列,圖及其應(yīng)用,加權(quán)圖及其應(yīng)用,集合流的聚合操作等。本書可作為高等院校計(jì)算機(jī)專業(yè)相關(guān)課程的教材,也可供Java語言及編程愛好者參考。
許多讀者就本書之前的版本給出了很多反饋。這些評論和建議極大地改進(jìn)了本書。這一版在表述、組織、示例、練習(xí)題以及附錄方面都有大幅提高。
本書采用基礎(chǔ)優(yōu)先的方法,在設(shè)計(jì)用戶自定義類之前,首先介紹基本的程序設(shè)計(jì)概念和技術(shù)。選擇語句、循環(huán)、方法和數(shù)組這樣的基本概念和技術(shù)是程序設(shè)計(jì)的基礎(chǔ),它們?yōu)閷W(xué)生進(jìn)一步學(xué)習(xí)面向?qū)ο蟪绦蛟O(shè)計(jì)和高級Java程序設(shè)計(jì)做好準(zhǔn)備。
本書以問題驅(qū)動(dòng)的方式來教授程序設(shè)計(jì),將重點(diǎn)放在問題的解決而不是語法上。我們通過使用在各種應(yīng)用情景中引發(fā)思考的問題,使得程序設(shè)計(jì)的介紹變得更加有趣。前面章節(jié)的主線放在問題的解決上,引入合適的語法和庫以支持編寫解決問題的程序。為了支持以問題驅(qū)動(dòng)的方式來教授程序設(shè)計(jì),本書提供了大量不同難度的問題來激發(fā)學(xué)生的積極性。為了吸引各個(gè)專業(yè)的學(xué)生來學(xué)習(xí),這些問題涉及很多應(yīng)用領(lǐng)域,包括數(shù)學(xué)、科學(xué)、商業(yè)、金融、游戲、動(dòng)畫以及多媒體等。
本書將程序設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)和算法無縫整合在一起,采用一種實(shí)用的方式來教授數(shù)據(jù)結(jié)構(gòu)。首先介紹如何使用各種數(shù)據(jù)結(jié)構(gòu)來開發(fā)高效的算法,然后演示如何實(shí)現(xiàn)這些數(shù)據(jù)結(jié)構(gòu)。通過實(shí)現(xiàn),學(xué)生可以深入理解數(shù)據(jù)結(jié)構(gòu)的效率,以及如何和何時(shí)使用某種數(shù)據(jù)結(jié)構(gòu)。最后,我們設(shè)計(jì)和實(shí)現(xiàn)了針對樹和圖的用戶自定義數(shù)據(jù)結(jié)構(gòu)。
本書廣泛應(yīng)用于全球各大學(xué)的程序設(shè)計(jì)入門、數(shù)據(jù)結(jié)構(gòu)和算法課程中。完全版包括程序設(shè)計(jì)基礎(chǔ)、面向?qū)ο蟪绦蛟O(shè)計(jì)、GUI程序設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)、算法、并行、網(wǎng)絡(luò)、數(shù)據(jù)庫和Web程序設(shè)計(jì)。這個(gè)版本旨在把學(xué)生培養(yǎng)成精通Java的程序員;A(chǔ)篇可用于程序設(shè)計(jì)的第一門課程(通常稱為CS1);A(chǔ)篇包含完全版的前18章內(nèi)容,本書還有一個(gè)AP版本,適合學(xué)習(xí)AP計(jì)算機(jī)科學(xué)(AP Computer Science)課程的高中生使用。
教授編程的最好途徑是通過示例,而學(xué)習(xí)編程的唯一途徑是通過動(dòng)手練習(xí)。本書通過示例對基本概念進(jìn)行了講解,并提供了大量不同難度的練習(xí)題供學(xué)生進(jìn)行練習(xí)。在我們的程序設(shè)計(jì)課程中,每次課后都布置了編程練習(xí)。
我們的目標(biāo)是編寫一本可以通過各種應(yīng)用場景中的有趣示例來教授問題求解和程序設(shè)計(jì)的教材。如果您有任何關(guān)于如何改進(jìn)本書的評論或建議,請給我發(fā)郵件。
Y. Daniel Liang
y.daniel.liang@gmail.com
www.cs.armstrong.edu/liang
www.pearsonhighered.com/liang
ACM/IEEE課程體系2013版和ABET課程評價(jià)
新的ACM/IEEE課程體系2013版將知識體系組織成18個(gè)知識領(lǐng)域。為了幫助教師基于本書設(shè)計(jì)課程,我們提供了示例教學(xué)大綱來確定知識領(lǐng)域和知識單元。作為一個(gè)常規(guī)的定制示例,示例教學(xué)大綱用于三學(xué)期的課程系列。示例教學(xué)大綱可以從教師資源配套網(wǎng)站獲取。
許多讀者來自ABET認(rèn)證計(jì)劃。ABET認(rèn)證的一個(gè)關(guān)鍵組成部分是,通過針對課程效果的持續(xù)的課程評價(jià)確定薄弱環(huán)節(jié)。我們在教師資源配套網(wǎng)站中提供了課程效果示例,以及用于衡量課程效果的示例考試。
本版新增內(nèi)容
本版對各個(gè)細(xì)節(jié)都進(jìn)行了全面修訂,以增強(qiáng)其清晰性、表述、內(nèi)容、示例和練習(xí)題。本版主要的改進(jìn)如下:
書名改為了“Java語言程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)”,以體現(xiàn)在數(shù)據(jù)結(jié)構(gòu)方面的增強(qiáng)。本書使用一種實(shí)用的方式來介紹、實(shí)現(xiàn)和使用數(shù)據(jù)結(jié)構(gòu),并涵蓋了一門典型的數(shù)據(jù)結(jié)構(gòu)課程中的所有主題。另外,還提供了額外的獎(jiǎng)勵(lì)章節(jié)來介紹高級的數(shù)據(jù)結(jié)構(gòu),比如2-4樹、B樹以及紅黑樹等。
針對最新的Java技術(shù)進(jìn)行了更新。使用Java 8版本中的新特征對示例和練習(xí)進(jìn)行了改進(jìn)和簡化。
在第13章的接口介紹中,引入了默認(rèn)方法和靜態(tài)方法。
GUI相關(guān)章節(jié)都更新到JavaFX 8。改寫了所有示例。示例和練習(xí)中的用戶界面現(xiàn)在都是可以改變尺寸并且居中顯示的。
在第15章的示例中,涵蓋了內(nèi)部類、匿名內(nèi)部類以及l(fā)ambda表達(dá)式的內(nèi)容。
數(shù)據(jù)結(jié)構(gòu)相關(guān)章節(jié)中,更多的示例和練習(xí)采用了lambda表達(dá)式來簡化編程。方法引用在20.6節(jié)介紹Comparator接口時(shí)進(jìn)行了介紹。
在第20章中介紹了forEach方法,作為對集合中每個(gè)元素應(yīng)用一個(gè)動(dòng)作而進(jìn)行的循環(huán)的簡單替代方法。
在第24~29章中,使用了Java 8中接口的默認(rèn)方法重新設(shè)計(jì)和簡化了MyList、MyArrayList、MyLinkedList、Tree、BST、AVLTree、MyMap、MyHashMap、MySet、MyHashSet、Graph、UnweightedGraph和WeightedGraph的實(shí)現(xiàn)。
第30章為全新章節(jié),介紹集合流的聚合操作。
第31章(獎(jiǎng)勵(lì)章節(jié))介紹了FXML和Scene Builder可視化工具。
重新設(shè)計(jì)了配套網(wǎng)站,增加了新的交互式測試題、復(fù)習(xí)題、動(dòng)畫以及現(xiàn)場編程。
在教師資源網(wǎng)站上為教師額外提供了200多道編程練習(xí)題,并給出了答案。這些練習(xí)題沒有出現(xiàn)在教材中。
可以訪問www.pearsonhighered.com/liang,獲得和前一版本的關(guān)聯(lián)以及新特征的完整列表。
教學(xué)特色
本書使用以下要素組織素材:
教學(xué)目標(biāo):在每章開始列出學(xué)生學(xué)習(xí)本章應(yīng)該掌握的內(nèi)容,學(xué)完這章后,學(xué)生能夠判斷自己是否達(dá)到這個(gè)目標(biāo)。
引言:提出引發(fā)思考的問題以展開討論,激發(fā)讀者深入探討該章內(nèi)容。
要點(diǎn)提示:突出每節(jié)中涵蓋的重要概念。
復(fù)習(xí)題:按節(jié)組織,幫助學(xué)生復(fù)習(xí)相關(guān)內(nèi)容并評估掌握的程度。
示例學(xué)習(xí):通過精心挑選示例,以容易理解的方式教授問題求解和程序設(shè)計(jì)概
梁勇(Y. Daniel Liang) 現(xiàn)為阿姆斯特朗亞特蘭大州立大學(xué)計(jì)算機(jī)科學(xué)系教授。之前曾是普度大學(xué)計(jì)算機(jī)科學(xué)系副教授,并曾兩次獲得普度大學(xué)杰出研究獎(jiǎng)。他所編寫的Java教程在美國大學(xué)Java課程中采用率極高,同時(shí)他還兼任Prentice Hall Java系列叢書的編輯。他是“Java Champion”榮譽(yù)得主,并在世界各地給在校學(xué)生和程序員做Java語言及技術(shù)方面的講座。
出版者的話
中文版序
譯者序
前言
第19章 泛型 1
19.1 引言 1
19.2 動(dòng)機(jī)和優(yōu)點(diǎn) 1
19.3 定義泛型類和接口 4
19.4 泛型方法 5
19.5 示例學(xué)習(xí):對一個(gè)對象數(shù)組進(jìn)行排序 7
19.6 原生類型和向后兼容 8
19.7 通配泛型 10
19.8 泛型的擦除和限制 12
19.9 示例學(xué)習(xí):泛型矩陣類 15
關(guān)鍵術(shù)語 19
本章小結(jié) 19
測試題 20
編程練習(xí)題 20
第20章 線性表、棧、隊(duì)列和優(yōu)先隊(duì)列 22
20.1 引言 22
20.2 集合 23
20.3 迭代器 26
20.4 使用forEach方法 27
20.5 線性表 28
20.5.1 List接口中的通用方法 28
20.5.2 數(shù)組線性表類ArrayList和鏈表類LinkedList 29
20.6 Comparator接口 32
20.7 線性表和集合的靜態(tài)方法 36
20.8 示例學(xué)習(xí):彈球 39
20.9 向量類和棧類 42
20.10 隊(duì)列和優(yōu)先隊(duì)列 44
20.10.1 Queue接口 44
20.10.2 雙端隊(duì)列Deque和鏈表LinkedList 45
20.11 示例學(xué)習(xí):表達(dá)式求值 47
關(guān)鍵術(shù)語 51
本章小結(jié) 51
測試題 51
編程練習(xí)題 51
第21章 規(guī)則集和映射 57
21.1 引言 57
21.2 規(guī)則集 57
21.2.1 HashSet 58
21.2.2 LinkedHashSet 61
21.2.3 TreeSet 62
21.3 比較規(guī)則集和線性表的性能 65
21.4 示例學(xué)習(xí):關(guān)鍵字計(jì)數(shù) 67
21.5 映射 69
21.6 示例學(xué)習(xí):單詞的出現(xiàn)次數(shù) 73
21.7 單元素與不可變的集合和映射 75
關(guān)鍵術(shù)語 76
本章小結(jié) 76
測試題 77
編程練習(xí)題 77
第22章 開發(fā)高效算法 79
22.1 引言 79
22.2 使用大?O?標(biāo)記來衡量算法效率 79
22.3 示例:確定大O 81
22.4 分析算法的時(shí)間復(fù)雜度 85
22.4.1 分析二分查找算法 85
22.4.2 分析選擇排序算法 85
22.4.3 分析漢諾塔問題 85
22.4.4 常用的遞推關(guān)系 86
22.4.5 比較常用的增長函數(shù) 86
22.5 使用動(dòng)態(tài)編程尋找斐波那契數(shù) 87
22.6 使用歐幾里得算法求最大公約數(shù) 89
22.7 尋找素?cái)?shù)的高效算法 93
22.8 使用分而治之法尋找最近點(diǎn)對 99
22.9 使用回溯法解決八皇后問題 101
22.10 計(jì)算幾何:尋找凸包 103
22.10.1 卷包裹算法 104
22.10.2 格雷厄姆算法 105
關(guān)鍵術(shù)語 106
本章小結(jié) 106
測試題 107
編程練習(xí)題 107
第23章 排序 114
23.1 引言 114
23.2 插入排序 115
23.3 冒泡排序 117
23.4 歸并排序 119
23.5 快速排序 122
23.6 堆排序 126
23.6.1 堆的存儲(chǔ) 127
23.6.2 添加一個(gè)新的結(jié)點(diǎn) 127
23.6.3 刪除根結(jié)點(diǎn) 128
23.6.4 Heap類 129
23.6.5 使用Heap類進(jìn)行排序 131
23.6.6 堆排序的時(shí)間復(fù)雜度 132
23.7 桶排序和基數(shù)排序 133
23.8 外部排序 135
23.8.1 實(shí)現(xiàn)階段Ⅰ 136
23.8.2 實(shí)現(xiàn)階段Ⅱ 137
23.8.3 結(jié)合兩個(gè)階段 139
23.8.4 外部排序復(fù)雜度 141
關(guān)鍵術(shù)語 142
本章小結(jié) 142
測試題 142
編程練習(xí)題 142
第24章 實(shí)現(xiàn)線性表、棧、隊(duì)列和優(yōu)先隊(duì)列 146
24.1 引言 146
24.2 線性表的通用操作 146
24.3 數(shù)組線性表 149
24.4 鏈表 156
24.4.1 結(jié)點(diǎn) 156
24.4.2 MyLinkedList類 158
24.4.3 實(shí)現(xiàn)MyLinkedList 159
24.4.4 MyArrayList和MyLinkedList 167
24.4.5 鏈表的變體 167
24.5 棧和隊(duì)列 169
24.6 優(yōu)先隊(duì)列 172
本章小結(jié) 173
測試題 174
編程練習(xí)題 174
第25章 二叉搜索樹 176
25.1 引言 176
25.2 二叉搜索樹 176
25.2.1 表示二叉搜索樹 177
25.2.2 查找一個(gè)元素 178
25.2.3 在BST中插入一個(gè)元素 178
25.2.4 樹的遍歷 179
25.2.5 BST類 180
25.3 刪除BST中的一個(gè)元素 189
25.4 樹的可視化和MVC 194
25.5 迭代器 197
25.6 示例學(xué)習(xí):數(shù)據(jù)壓縮 199
關(guān)鍵術(shù)語 204
本章小結(jié) 204
測試題 204
編程練習(xí)題 204
第26章 AVL樹 208
26.1 引言 208
26.2 重新平衡樹 209
26.3 為AVL樹設(shè)計(jì)類 211
26.4 重寫insert方法 212
26.5 實(shí)現(xiàn)旋轉(zhuǎn) 213
26.6 實(shí)現(xiàn)delete方法 213
26.7 AVLTree類 214
26.8 測試 AVLTree類 219
26.9 AVL樹的時(shí)間復(fù)雜度分析 222
關(guān)鍵術(shù)語 222
本章小結(jié) 223
測試題 223
編程練習(xí)題 223
第27章 散列 225
27.1 引言 225
27.2 什么是散列 225
27.3 散列函數(shù)和散列碼 226
27.3.1 基本數(shù)據(jù)類型的散列碼 226
27.3.2 字符串的散列碼 227
27.3.3 壓縮散列碼 227
27.4 使用開放地址法處理沖突 228
27.4.1 線性探測法 228
27.4.2 二次探測法 230
27.4.3 雙重散列法 230
27.5 使用分離鏈接法處理沖突 232
27.6 裝填因子和再散列 232
27.7 使用散列實(shí)現(xiàn)映射 233
27.8 使用散列實(shí)現(xiàn)規(guī)則集 242
關(guān)鍵術(shù)語 248
本章小結(jié) 249
測試題 249
編程練習(xí)題 249
第28章 圖及其應(yīng)用 251
28.1 引言 251
28.2 基本的圖術(shù)語 252
28.3 表示圖 254
28.3.1 表示頂點(diǎn) 254
28.3.2 表示邊:邊數(shù)組 255
28.3.3 表示邊:Edge對象 256
28.3.4 表示邊:鄰接矩陣 256
28.3.5 表示邊:鄰接線性表 257
28.4 圖的建模 259
28.5 圖的可視化 268
28.6 圖的遍歷 271
28.7 深度優(yōu)先搜索 272
28.7.1 DFS的算法 272
28.7.2 DFS的實(shí)現(xiàn) 273
28.7.3 DFS的應(yīng)用 274
28.8 示例學(xué)習(xí):連通圓問題 275
28.9 廣度優(yōu)先搜索 278
28.9.1 BFS的算法 278
28.9.2 BFS的實(shí)現(xiàn) 278
28.9.3 BFS的應(yīng)用 280
28.10 示例學(xué)習(xí):9枚硬幣反面問題 281
關(guān)鍵術(shù)語 286
本章小結(jié) 286
測試題 286
編程練習(xí)題 286
第29章 加權(quán)圖及其應(yīng)用 291
29.1 引言 291
29.2 加權(quán)圖的表示 292
29.2.1 加權(quán)邊的表示:邊數(shù)組 292
29.2.2 加權(quán)鄰接矩陣 293
29.2.3 鄰接線性表 293
29.3 WeightedGraph類 294
29.4 最小生成樹 301
29.4.1 最小生成樹算法 302
29.4.2 完善Prim的MST算法 303
29.4.3 MST算法的實(shí)現(xiàn) 304
29.5 尋找最短路徑 307
29.6 示例學(xué)習(xí):加權(quán)的9枚硬幣反面問題 315
關(guān)鍵術(shù)語 318
本章小結(jié) 318
測試題 319
編程練習(xí)題 319
第30章 集合流的聚合操作 325
30.1 引言 325
30.2 流管道 326
30.2.1 Stream.of、limit、forEach方法 328
30.2.2 sorted方法 329
30.2.3 filter方法 329
30.2.4 max和min方法 329
30.2.5 anyMatch、allMatch和noneMatch方法 329
30.2.6 map、distinct和count方法 329
30.2.7 findFirst、findAny和toArray方法 330
30.3 IntStream、LongStream和DoubleStream 331
30.4 并行流 333
30.5 使用reduce方法進(jìn)行流的歸約 336
30.6 使用collect方法進(jìn)行流的歸約 338
30.7 使用groupingBy收集器進(jìn)行元素分組 341
30.8 示例學(xué)習(xí) 344
30.8.1 示例學(xué)習(xí):數(shù)字分析 344
30.8.2 示例學(xué)習(xí):計(jì)算字母的出現(xiàn)次數(shù) 345
30.8.3 示例學(xué)習(xí):計(jì)算字符串中每個(gè)字母的出現(xiàn)次數(shù) 346
30.8.4 示例學(xué)習(xí):處理二維數(shù)組中的所有元素 347
30.8.5 示例學(xué)習(xí):得到目錄大小 348
30.8.6 示例學(xué)習(xí):關(guān)鍵字計(jì)數(shù) 349
30.8.7 示例學(xué)習(xí):單詞出現(xiàn)次數(shù) 350
本章小結(jié) 351
測試題 351
編程練習(xí)題 351
附錄A Java關(guān)鍵字 353
附錄B ASCII字符集 354
附錄C 操作符優(yōu)先級表 355
附錄D Java修飾符 356
附錄E 特殊浮點(diǎn)值 357
附錄F 數(shù)系 358
附錄G 位操作符 362
附錄H 正則表達(dá)式 363
附錄I 枚舉類型 367