數據結構與算法分析(Java語言描述)(第2版)

數據結構與算法分析(Java語言描述)(第2版)

《數據結構與算法分析(Java語言描述)(第2版)》是2007年出版的圖書,作者是Frank Carrano。

基本介紹

  • 書名:數據結構與算法分析(Java語言描述)(第2版)
  • ISBN:9787302162698
  • 定價:98元
  • 出版時間:2012.09.10
  • 裝幀:平裝
  • 印次:1-2
圖書簡介,圖書目錄,

圖書簡介

本書是為數據結構入門課程(通常課號是CS-2)而編寫的教材。作者Frank Carrano在編寫過程自始至終特別考慮到了Java與對象,為教師和學生提供了一種精心設計並經過教學實驗的方式藉助Java講授ADT和對象。本書獨特的設計將內容組織為相對較短的章。這種方式使學習更容易,並留出了教學的機動性。本書教給學生如何使用線性表、詞典、棧、佇列等等來組織數據。利用這些數據組織方式,學生們將學到算法設計的相關技術。書中的“編程提示”給讀者額外的編程建議;大量的插圖使講解更形象生動;自測題貫穿各章,書末還給出了答案。本書適合作為數據結構的教學用書。
數據結構”是計算機專業的基礎與核心課程之一,也是從事軟體開發必不可少的入門和常用知識。
程式編寫得好不好,很大程度上取決於編程者對數據結構是否熟練地掌握和恰當地運用。
由於它不僅重要,而且易學難精,“數據結構”一直都被列入相關專業的研究生入學考試和相關行業的公司招聘考試的重點考查範圍。
由於“數據結構”這門課程本身的特點,它必須依託於一種程式設計語言才能講授,否則就成了空中樓閣、紙上談兵。因此,儘管從抽象和邏輯的角度看來都大同小異,按照所依託的程式設計語言可以把“數據結構”的教材分為不同的版本--諸如Pascal版、C版、C++版以及Java版。
除了由於程式設計語言的不同特性而導致的程式實現上的差異,不同版本的“數據結構”教材所講述的主要內容並無本質區別。因此,初學者可以根據自己已經掌握的或者將作為主要使用的程式設計語言選擇相應版本的“數據結構”教材來學習。
將來如果換用另一種程式設計語言,也不需要重新學習另一個版本的“數據結構”教材,只需將其作為參考,查閱同樣的數據結構是如何用另一種語言實現的即可。這也是為什麼不同版本的“數據結構”教材都有其存在的意義。

圖書目錄

引言1
第1章 Java類2
1.1 對象與類2
1.2 在Java類中使用方法5
1.3 定義Java類7
1.3.1 方法定義8
1.3.2 實參與形參10
1.3.3 傳遞實參11
1.3.4 Name類的定義14
1.3.5 構造函式16
1.3.6 toString方法18
1.3.7 調用其他方法的方法 …18
1.3.8 返回所屬類實例
的方法20
1.3.9 靜態域與靜態方法20
1.3.10 方法的重載22
1.4 枚舉類23
1.5 包26
本章小結27
練習28
項目設計31
第2章 從已有類創建新類35
2.1 合成35
2.1.1 通用類型38
2.1.2 適配器41
2.2 繼承42
2.2.1 從構造函式中調用構造
函式45
2.2.2 基類的私有域與私有
方法46
2.2.3 受保護的訪問47
2.2.4 方法的覆蓋與重載47
2.2.5 多重繼承52
2.3 類型兼容性與基類53
2.3.1 Object類54
2.3.2 抽象類與抽象方法56
2.4 多態性58
本章小結63
練習64
項目設計68
第3章 類的設計70
3.1 封裝70
3.2 方法的說明72
3.3 接口76
3.3.1 編寫接口76
3.3.2 實現接口78
3.3.3 作為數據類型的
接口79
3.3.4 接口的通用類型80
3.3.5 Comparable接口80
3.3.6 擴展接口82
3.3.7 接口與抽象類83
3.3.8 符號常量85
3.4 類的選擇86
3.4.1 類的確定87
3.4.2 CRC卡片88
3.5 類的復用91
本章小結91
練習92
項目設計93
第4章 線性表96
4.1 ADT線性表說明96
4.2 使用ADT線性表103
4.3 像使用自動售貨機一樣使用
線性表107
4.4 Java類庫:List接口109
本章小結109
練習110
項目設計112
第5章 用數組實現線性表114
5.1 使用定長數組實現ADT
線性表114
5.1.1 類比114
5.1.2 Java實現116
5.2 使用動態擴展數組實現
ADT線性表124
5.2.1 擴展數組125
5.2.2 線性表的新實現127
5.3 Java類庫:ArrayList與
Vector類128 5.4 用數組實現ADT線性表的優缺點132
本章小結133
練習134
項目設計135
目 錄 數據結構與算法分析(Java語言描述)(第2版)第6章 用鍊表實現線性表136
6.1 鍊表136
6.1.1 在表頭添加來創建鍊表137
6.1.2 在表末添加來創建鍊表138
6.1.3 在不同位置添加來創建鍊表 …140
6.2 使用鍊表實現ADT線性表142
6.2.1 私有類Node142
6.2.2 數據域與構造函式144
6.2.3 選擇要實現的核心方法組145
6.2.4 線上性表的末端插入元素146
6.2.5 線上性表的指定位置插入
元素148
6.2.6 私有方法getNodeAt152
6.2.7 斷言與isEmpty方法153
6.2.8 display方法154
6.3 測試不完整的實現155
本章小結157
練習158
項目設計159
第7章 完成線性表的鍊表實現160
7.1 從鍊表中刪除一個元素160
7.2 完成ADT線性表的鍊表實現162
7.2.1 方法remove162
7.2.2 方法replace165
7.2.3 方法getEntry165
7.2.4 方法contains166
7.2.5 其他方法166
7.3 使用具有設定與獲取方法的
Node類167
7.4 表尾引用170
7.5 用鍊表實現ADT線性表的優缺點175
7.6 Java類庫:LinkedList類175
本章小結176
練習176
項目設計177
第8章 疊代器179
8.1 什麼是疊代器179
8.2 Iterator接口180
8.3 獨立類疊代器186
8.4 內部類疊代器189
8.4.1 基於鍊表實現190
8.4.2 基於數組實現194
8.5 疊代器方法為何在自己的類中197
8.6 ListIterator接口198
8.7 基於數組實現ListIterator接口204
8.8 Java類庫:Iterable接口211
8.8.1 Iterable與for-each循環212
8.8.2 重溫List接口212
本章小結213
練習213
項目設計216
第9章 算法的效率218
9.1 動機218
9.2 度量算法的效率220
9.3 形式化226
9.4 效率的圖形表示229
9.5 ADT線性表不同實現的效率232
9.5.1 基於數組實現232
9.5.2 基於鍊表實現234
9.5.3 比較上述實現237
本章小結238
練習238
項目設計240
第10章 遞歸243
10.1 何謂遞歸243
10.2 跟蹤遞歸方法248
10.3 有返回值的遞歸方法250
10.4 遞歸處理數組253
10.5 遞歸處理鍊表255
10.6 遞歸方法的時間效率257
10.6.1 countDown的時間效率257
10.6.2 計算xn的時間效率258
10.7 困難問題的簡單解法259
10.8 簡單問題的拙劣解法264
10.9 尾遞歸266
10.10 協同遞歸268
本章小結268
練習270
項目設計271
第11章 排序入門275
11.1 組織用於數組排序的Java方法276
11.2 選擇排序277
11.2.1 疊代選擇排序278
11.2.2 遞歸選擇排序280
11.2.3 選擇排序的效率281
11.3 插入排序282
11.3.1 疊代插入排序283
11.3.2 遞歸插入排序284
11.3.3 插入排序的效率286
11.3.4 鍊表的插入排序286
11.4 希爾排序289
11.4.1 Java代碼291
11.4.2 希爾排序的效率292
11.5 算法比較293
本章小結293
練習293
項目設計296
第12章 快速排序算法298
12.1 歸併排序298
12.1.1 數組的歸併298
12.1.2 遞歸歸併排序299
12.1.3 歸併排序的效率302
12.1.4 疊代歸併排序303
12.1.5 Java類庫中的歸併排序304
12.2 快速排序304
12.2.1 快速排序的效率305
12.2.2 創建劃分305
12.2.3 快速排序的Java代碼308
12.2.4 Java類庫中的快速排序311
12.3 基數排序311
12.3.1 基數排序的偽代碼313
12.3.2 基數排序的效率313
12.4 算法比較314
本章小結314
練習315
項目設計316
第13章 有序表319
13.1 ADT有序表的說明319
13.2 鍊表實現323
13.2.1 add方法324
13.2.2 鍊表實現的效率331
13.3 使用ADT線性表的實現331
本章小結336
練習336
項目設計337
第14章 繼承與線性表339
14.1 使用繼承實現有序表339
14.2 設計一個基類342
14.3 有序表的一種高效實現348
本章小結349
練習350
項目設計350
第15章 可變對象、不可變對象與可克隆
對象352
15.1 可變對象與不可變對象352
15.1.1 創建唯讀類355
15.1.2 同伴類356
15.2 可克隆對象358
15.2.1 克隆數組364
15.2.2 克隆鍊表366
15.2.3 克隆體的有序表370
本章小結373
練習373
項目設計376
第16章 查找377
16.1 問題描述377
16.2 查找無序數組378
16.2.1 疊代順序查找無序數組378
16.2.2 遞歸順序查找無序數組379
16.2.3 順序查找數組的效率381
16.3 查找有序數組381
16.3.1 順序查找有序數組381
16.3.2 折半查找有序數組382
16.3.3 Java類庫: binarySearch
方法386
16.3.4 折半查找數組的效率387
16.4 查找無序鍊表388
16.4.1 疊代順序查找無序鍊表388
16.4.2 遞歸順序查找無序鍊表389
16.4.3 順序查找鍊表的效率390
16.5 查找有序鍊表390
16.5.1 順序查找有序鍊表390
16.5.2 折半查找有序鍊表391
16.6 查找方法的選擇391
本章小結392
練習392
項目設計394
第17章 詞典396
17.1 ADT詞典的說明396
17.1.1 Java接口399
17.1.2 疊代器400
17.2 使用ADT詞典402
17.2.1 電話號碼簿402
17.2.2 詞頻407
17.2.3 詞的索引411
17.3 Java類庫:Map接口414
本章小結415
練習415
項目設計416
第18章 詞典的實現418
18.1 基於數組的實現418
18.1.1 基於數組的無序詞典419
18.1.2 基於數組的有序詞典424
18.2 基於向量的實現428
18.3 基於鍊表的實現433
18.3.1 基於鍊表的無序詞典434
18.3.2 基於鍊表的有序詞典434
本章小結438
練習438
項目設計439
第19章 散列概述440
19.1 什麼是散列440
19.2 散列函式442
19.2.1 計算散列碼443
19.2.2 將散列碼壓縮為散列表的
索引445
19.3 處理衝突446
19.3.1 線性探測開放定址446
19.3.2 二次探測開放定址451
19.3.3 雙散列開放定址451
19.3.4 開放定址的潛在問題453
19.3.5 鏈地址453
本章小結456
練習457
項目設計458
第20章 用散列實現詞典459
20.1 效率459
20.1.1 裝填因子460
20.1.2 開放定址的開銷460
20.1.3 鏈地址的開銷462
20.2 再散列463
20.3 處理衝突的各方案比較464
20.4 使用散列的詞典實現465
20.4.1 散列表中的元素465
20.4.2 數據域與構造函式466
20.4.3 方法getValue、remove
和add467
20.4.4 疊代器473
20.5 Java類庫:類HashMap475
本章小結475
練習476
項目設計476
第21章 棧478
21.1 ADT棧的說明478
21.2 利用棧處理代數表達式481
21.2.1 檢查中綴代數表達式的括弧
是否平衡482
21.2.2 將中綴表達式轉化為後綴
表達式487
21.2.3 後綴表達式求值493
21.2.4 中綴表達式求值495
21.3 程式棧497
21.4 使用棧代替遞歸498
21.5 Java類庫:類Stack501
本章小結502
練習502
項目設計504
第22章 棧的實現506
22.1 基於鍊表的實現506
22.2 基於數組的實現509
22.3 基於向量的實現513
本章小結515
練習515
項目設計516
第23章 佇列、雙端佇列與優先佇列517
23.1 ADT佇列的描述517
23.2 使用佇列模擬排隊521
23.3 使用佇列計算股份銷售的資本
收益527
23.4 Java類庫:Queue接口530
23.5 ADT雙端佇列的描述530
23.6 使用雙端佇列計算股份銷售的資本
收益532
23.7 ADT優先佇列的描述534
23.8 使用優先佇列跟蹤委派任務535
本章小結537
練習537
項目設計539
第24章 佇列、雙端佇列與優先佇列的
實現541
24.1 基於鍊表的佇列實現541
24.2 基於數組的佇列實現545
24.2.1 循環數組546
24.2.2 含有一個未用位置的循環
數組547
24.3 基於向量的佇列實現552
24.4 基於循環鍊表的佇列實現554
24.5 Java類庫:AbstractQueue類560
24.6 基於雙向鍊表的雙端佇列實現560
24.7 實現優先佇列的可用方法564
24.8 Java類庫:PriorityQueue類564
本章小結565
練習566
項目設計567
第25章 樹569
25.1 樹的概念569
25.1.1 層次化的組織569
25.1.2 樹的術語571
25.2 樹的遍歷574
25.2.1 二叉樹的遍歷575
25.2.2 樹的遍歷576
25.3 樹的Java接口577
25.3.1 所有樹的接口577
25.3.2 二叉樹的接口578
25.4 二叉樹舉例579
25.4.1 表達式樹580
25.4.2 決策樹581
25.4.3 二叉查找樹585
25.4.4 堆587
25.5 樹舉例589
25.5.1 語法分析樹589
25.5.2 博弈樹590
本章小結590
練習591
項目設計593
第26章 樹的實現595
26.1 二叉樹的結點595
26.1.1 結點的接口596
26.1.2 BinaryNode的實現597
26.2 ADT二叉樹的實現599
26.2.1 創建基本二叉樹599
26.2.2 方法privateSetTree600
26.2.3 訪問者與修改者方法603
26.2.4 計算高度與統計結點604
26.2.5 遍歷605
26.3 表達式二叉樹的實現610
26.4 樹612
26.4.1 樹的結點612
26.4.2 用二叉樹表示樹613
本章小結614
練習614
項目設計616
第27章 二叉查找樹的實現617
27.1 預備知識617
27.1.1 二叉查找樹接口618
27.1.2 重複元素620
27.1.3 開始類定義621
27.2 查找與檢索622
27.3 遍歷624
27.4 插入元素624
27.4.1 遞歸實現625
27.4.2 疊代實現628
27.5 刪除元素631
27.5.1 刪除葉子結點中的元素631
27.5.2 刪除有一個孩子的結點中的
元素631
27.5.3 刪除有兩個孩子的結點中的
元素631
27.5.4 刪除根結點中的元素635
27.5.5 遞歸實現635
27.5.6 疊代實現639
27.6 操作的效率643
27.6.1 平衡的重要性644
27.6.2 插入結點的順序644
27.7 ADT詞典的實現645
本章小結648
練習649
項目設計651
第28章 堆的實現653
28.1 再論ADT堆653
28.2 用數組表示堆654
28.3 插入元素656
28.4 刪除根659
28.5 創建堆662
28.6 堆排序664
本章小結667
練習668
項目設計669
第29章 平衡查找樹670
29.1 AVL樹670
29.1.1 單旋轉671
29.1.2 雙旋轉673
29.1.3 實現細節676
29.2 2-3樹681
29.2.1 2-3樹的查找681
29.2.2 往2-3樹插入元素682
29.2.3 插入期間分裂結點683
29.3 2-4樹685
29.3.1 往2-4樹插入元素685
29.3.2 比較AVL樹、2-3樹
和2-4樹 686
29.4 紅黑樹687
29.4.1 紅黑樹的特性688
29.4.2 往紅黑樹插入元素689
29.4.3 Java類庫:類TreeMap693
29.5 B樹693
本章小結694
練習695
項目設計696
第30章 圖697
30.1 一些例子與術語697
30.1.1 公路地圖697
30.1.2 航線700
30.1.3 迷宮700
30.1.4 先修課程701
30.1.5 樹701
30.2 遍歷701
30.2.1 廣度優先遍歷702
30.2.2 深度優先遍歷704
30.3 拓撲順序705
30.4 路徑707
30.4.1 尋找路徑708
30.4.2 無權圖的最短路徑708
30.4.3 加權圖的最短路徑710
30.5 ADT圖的Java接口714
本章小結717
練習718
項目設計720
第31章 圖的實現722
31.1 兩種實現的概述722
31.1.1 鄰接矩陣722
31.1.2 鄰接表723
31.2 頂點與邊724
31.2.1 說明類Vertex724
31.2.2 內部類Edge726
31.2.3 實現Vertex類727
31.3 ADT圖的實現731
31.3.1 基本操作731
31.3.2 圖的算法735
本章小結737
練習738
項目設計739
附錄A Java基礎741
A.1 引言741
A.1.1 應用程式和小程式741
A.1.2 對象和類741
A.1.3 第一個Java應用程式741
A.2 Java基礎744
A.2.1 標識符744
A.2.2 保留字744
A.2.3 變數745
A.2.4 基本類型745
A.2.5 常量746
A.2.6 賦值語句746
A.2.7 賦值兼容性747
A.2.8 類型轉換748
A.2.9 算術運算符和表達式749
A.2.10 括弧和優先規則750
A.2.11 自增和自減運算符751
A.2.12 特殊賦值運算符752
A.2.13 符號常量752
A.2.14 Math類753
A.3 用鍵盤和螢幕進行簡單的輸入和
輸出754
A.3.1 螢幕輸出754
A.3.2 用Scanner類進行鍵盤
輸入755
A.4 if-else語句757
A.4.1 布爾表達式758
A.4.2 嵌套語句761
A.4.3 多重if-else語句763
A.4.4 條件運算符(可選)764
A.5 switch語句764
A.6 枚舉766
A.7 作用域768
A.8 循環769
A.8.1 while語句769
A.8.2 for語句770
A.8.3 do-while語句772
A.8.4 關於循環的其他信息773
A.9 String類774
A.9.1 字元串中的字元775
A.9.2 字元串的聯接776
A.9.3 String方法777
A.10 StringBuilder類779
A.11 使用Scanner抽取字元串的
一部分780
A.12 數組783
A.12.1 數組形參和返回值785
A.12.2 初始化數組786
A.12.3 數組索引出界786
A.12.4 對數組使用=與==786
A.12.5 數組與for-each循環788
A.12.6 多維數組788
A.12 封裝類790
附錄B 異常處理796
B.1 基本的異常處理796
B.2 Java類庫的異常類799
B.3 定義自己的異常類800
B.4 複合catch代碼塊802
B.5 finally代碼塊803
B.6 拋出但不捕獲異常的方法804
B.7 不需要捕獲的異常805
附錄C 檔案輸入與輸出807
C.1 概述807
C.1.1 數據流807
C.1.2 檔案的優點807
C.1.3 檔案的類型808
C.1.4 檔案名稱809
C.1.5 包java.io809
C.2 使用PrintWriter寫文本檔案809
C.3 讀取文本檔案812
C.3.1 使用Scanner讀取文本檔案812
C.3.2 使用BufferedReader讀取
文本檔案814
C.3.3 定義打開數據流的方法816
C.4 二進制檔案的I/O817
C.4.1 使用DataOutputStream寫
二進制檔案817
C.4.2 使用DataInputStream讀取
二進制檔案821
C.5 File類823
C.6 對象串列化824
附錄D 文檔與程式設計風格828
D.1 命名變數與類828
D.2 縮排828
D.3 注釋829
D.3.1 單行注釋829
D.3.2 注釋塊830
D.3.3 何時寫注釋830
D.3.4 Java文檔注釋830
D.3.5 運行javadoc832
附錄E 自測題答案833
第1章 Java類
第2章 從已有類創建新類
第3章 類的設計
第4章 線性表
第5章 用數組實現線性表
第6章 用鍊表實現線性表
第7章 完成線性表的鍊表實現
第8章 疊代器
第9章 算法的效率
第10章 遞歸
第11章 排序入門
第12章 快速排序算法
第13章 有序表
第14章 繼承與線性表
第15章 可變對象、不可變對象與可克隆對象
第16章 查找
第17章 詞典
第18章 詞典的實現
第19章 散列概述
第20章 用散列實現詞典
第21章 棧
第22章 棧的實現
第23章 佇列、雙端佇列與優先佇列
第24章 佇列、雙端佇列與優先佇列的實現
第25章 樹
第26章 樹的實現
第27章 二叉查找樹的實現
第28章 堆的實現
第29章 平衡查找樹
第30章 圖
第31章 圖的實現

相關詞條

熱門詞條

聯絡我們