1. 程式人生 > >Java資料結構和演算法中文第二版.pdf免費下載

Java資料結構和演算法中文第二版.pdf免費下載

.   ● 2-3樹
● 揹包問題
● 從n個事物中取k個的組合方案
● 雜湊函式的數字摺疊法
● 基數排序
章末問題
每章結束後都會有幾個簡短的問題,它們涵蓋了該章的所有重點。在附錄C“問題答案”中可以找到相應的答案。這些問題是用來給讀者自測的,以確保他們已經基本理解該章的內容。
實驗
本書中收入了一些希望讀者去做的活動。這些實驗經常包括使用專題applet或通過示例程式來檢查某演算法的一些特性,當然有些實驗只需要使用紙和筆,或只需要“思維實驗”。
程式設計作業
最重要的是,在每章的結尾收入了一些(經常是五道)富有挑戰性的程式設計題目。它們的難度各不相同,簡單的題只是示例程式的變形,最有挑戰性的是那些在該章中討論過的但並沒有樣例的程式問題。本書沒有附程式設計作業的答案和解法,但可以看下面的註釋。
註釋
程式設計作業是為教師在留作業時提供參考用的。為此,那些有資格證明的教師可以得到程式設計作業題的參考解法的源程式和可執行檔案。請訪問Sams Web網站獲取相關資訊。
本書相關內容
本書是一本有關計算機程式設計中所應用的資料結構和演算法的書。資料結構是指資料在計算機儲存空間中(或磁碟中)的安排方式。演算法是指軟體程式用來操作這些結構中的資料的過程。
幾乎所有的計算機程式都使用資料結構和演算法,即使最簡單的程式也不例外。比如設想一個列印地址標籤的程式,這個程式使用一個數組來儲存地址,並且使用一個簡單的for迴圈來遍歷陣列,列印每一個地址。
在上面例子中的陣列就是一個數據結構,用for迴圈來順序訪問該陣列,這就構造了一個簡單的演算法。對於一個僅有少量資料的簡單程式來說,上述的這種方法已經足夠了。但是如果用程式來處理中等規模以上的資料或解決那些不太平常的問題時,就需要用一些更加復.雜的技術來應付它們。僅僅知道諸如Java或C++等計算機語言的語法是遠遠不夠的。
本書提供了學完一門程式語言後進一步需要知道的知識。本書所涵蓋的內容通常作為大學或學院中計算機系二年級的課程,在學生掌握了程式設計的基礎後才開始本書的學習。
本書的不同之處
有關資料結構和演算法的書很多,本書的不同之處有如下三條:
● 我們在寫書過程中的主要目標是使本書所涉及到的知識儘可能地容易理解。
● 書中稱作專題applet(Workshop applet)的演示程式可以將知識生動化,它可以一步一步地通過“活動的影象”來展示資料結構和演算法是如何工作的。
● 示例程式是用Java編寫的,它比那些傳統的用來演示計算機問題的語言,如C、C++或Pascal更好理解。
讓我們來更加詳細地討論上述特性。
容易理解
傳統的計算機課本中充滿了理論、數學公式和抽象的程式碼示例。而本書將精力集中在那些可以解決現實問題的技術和方法的解釋上,竭力避免那些複雜的證明和笨重的數學公式。本書中還有許多圖表,它們可以增加文字所不能表達的效果。
許多資料結構和演算法的書都包括了大量的軟體工程內容。軟體工程是一門有關設計和實現大型複雜的軟體專案的學科。
然而我們認為資料結構和演算法除去這些附加的規則後也是相當的複雜,所以我們在本書中故意不強調軟體工程的知識。(我們會在第1章中討論資料結構和演算法與軟體工程的關係。)
當然,我們在本書中使用了面向物件的方法,隨著討論的深入,會涉及到面向物件設計的各個方面,本書在第1章中還包含一個關於OOP的小教程。但是,我們的重點還是在資料結構和演算法本身。
專題applet
Sams Web網站上可以下載由涉及本書中所討論主題的Java應用小程式(applet)組成的演示程式。這些小程式(我們稱之為”專題applet”)可以在絕大多數Web瀏覽器中執行(請參閱附錄A)。專題applet通過“慢動作”的影象演示使讀者能更好地理解一個演算法的執行過程。
例如,在一個專題applet中,每按一下按鈕,柱狀圖會按照由小到大的順序進行一步排列。圖中顯示了排序演算法中變數的值,圖中的文字表明瞭正在進行的步驟,這樣使讀者能夠清楚地看到在演算法執行時計算機程式碼是如何工作的。
另一個小程式模擬了一棵二叉樹。通過觀察箭頭的上下移動,可以跟蹤插入或刪除樹中節點的每一步。本書中有20多個專題applet,每一章至少會有一個。
專題applet可以將資料結構和演算法的真實一面清晰地表達出來,這比文字描述要好得多。當然,我們在本書中同樣會給出文字描述。通過專題applet、文字和圖例的結合,可使讀者更容易理解書中的知識。
這些專題applet是可獨立執行的圖形化程式,可以把它們當作學習工具來補充書中的材料。請注意這些程式與我們下面要討論的示例程式碼是不太一樣的。
註釋
關於專題applet,在Sams網站(http://www.samspublishing.com/)中有Java.class形式的檔案。
請在輸入框中輸入本書的ISBN號(沒有連字元),然後點選搜尋。 當本書的名稱顯示出來後,請點選可以下載小程式那頁的連結。
Java示例程式碼
Java語言比C和C++等語言都簡單易懂且易寫。最大的原因就在於它沒有指標。有些人很驚訝為什麼在建造複雜資料結構和演算法時不需要指標。事實上,取消指標不僅意味著程式碼更加易寫易懂,還為程式提供了更高的安全性和更少的出錯可能性。
Java是一門現代的面向物件的語言,這意味著可以使用面向物件的方法來進行程式設計。這一點非常重要,因為面向物件程式設計(OOP)不僅比過去的面向過程的方法擁有更多毋庸置疑的好處和優點,而且在正式的程式開發中正在迅速地取代面向過程的方法。讀者如果對面向物件程式設計(OOP)不太熟悉的話,請不必驚慌,因為它並不那麼難懂,尤其是通過象Java這種沒有指標的語言環境採學習就更方便了。第1章將講述面向物件程式設計的基礎。
註釋
與專題applet一樣,示例程式(原始碼和可執行檔案)可以在Sams網站中下載。
本書的讀者物件
本書可以用來當作資料結構和演算法課程的課本,它通常是電腦科學課程表中二年級的課程。當然,它還適用於專業程式設計師和那些雖然僅有一些程式語言基礎但是還想更上一層樓的人。本書還可以作為其他正式教科書的補充教材。
在閱讀前所需的知識
在開始閱讀本書之前,只需要知道一些程式語言的知識。
儘管示例程式碼是用Java寫的,但是並不是只有懂得Java才能明白我們在解釋什麼。Java也不難懂,況且我們儘可能使用了普通的語法,避開形式複雜的或Java專用的結構。
當然,如果對Java已經很熟悉,那是最好。因為Java的語法規則與C++分接近,所以如果會用C++,對閱讀本書也同樣有幫助。對於示例程式來說,Java和C++的區別不大(只是對指標的接受程度不同),第1章中會討論這兩種語言。
閱讀本書所需的軟體
執行專題applet需要諸如Microsoft Internet Explorer或Netscape Communicator等Web瀏覽器,還可以使用applet察看工具,在許多的Java開發系統中都可以找到這些工具,包括在附錄A中討論的Sun公司的免費系統。
可以使用Microsoft Windows中的MS-DOS環境(使用MS-DOS命令)或類似的文字環境來執行示例程式。
如果希望對示例程式進行修改或編寫自己的程式,還需要一個Java開發系統。這些系統有的是收費的,當然還可以從Sun公司下載一個優秀的免費系統,請參閱附錄A。
本書的組織結構
本節是為教師和那些希望快速瞭解本書內容的人而準備的。下面的內容假定讀者對資料結構和演算法中的問題和術語已經相當熟悉。
前兩章試圖使讀者儘可能輕鬆地進入資料結構和演算法的世界。
第1章“綜述”,給讀者一個各主題的總體印象並介紹少量後面要用到的術語。對於那些對面向物件程式設計不太熟悉的讀者,本章總結了一些相關的知識。對於那些知道C++而不熟悉Java的程式設計師,本章對這兩種語言的主要差別進行了描述。
第2章“陣列”,集中討論陣列。這裡麵包含有兩層意思:如何使用類來對資料儲存結構進行封裝和類的介面。其中包括陣列和有序陣列的查詢、插入、刪除、線性查詢和二分查詢。專題applet通過對無序和有序的陣列進行操作來解釋上述演算法。
第3章“簡單排序”介紹三種簡單的(但是慢速的)排序方法:氣泡排序、選擇排序和插入排序。每一種排序都有一個相應的專題applet。
第4章“棧和佇列”涉及到三種可以被認為是抽象資料型別(ADT)的資料結構:棧、隊和優先順序佇列。這些結構在本書中大量重複出現,是許多演算法的基礎。每一種結構都有一個相應的專題applet。ADT的概念也會在本章中討論。
第5章“連結串列”介紹了連結串列中的雙向連結串列和雙端連結串列。本章還解釋了Java中被稱作“無痛指標”的使用,並用一個專題applet演示了連結串列的插入、查詢和刪除是如何進行的。
第6章“遞迴”探索了遞迴的知識,這是書中僅有的非資料結構的幾章之一。本章給出了大量的遞迴例子,包括漢諾塔問題和歸併排序,它們都有相應的專題applet。
第7章“高階排序”研究了幾種高階的排序方法:希爾排序和快速排序。專題applet演示了希
爾排序,快速排序的基礎一一劃分(partitioning)和兩種形式的快速排序。
第8章“二叉樹”開始了對樹的探索。本章中介紹了最簡單最通用的樹型結構:不平衡的二叉搜尋樹。一個專題applet演示了此類樹的插入、刪除和遍歷是如何進行的。
第9章“紅-黑樹”解釋了紅-黑樹,它是最有效的平衡樹之一。專題applet演示了平衡這種樹所需的旋轉和顏色轉換。
第10章“2-3-4樹和外部儲存”將2-3—4樹作為多叉樹的一個例子進行了講解。專題applet會演示它們是如何工作的。我們還將討論2-3樹和2-3-4樹與B樹的關係,這些知識對於儲存外部(磁碟)的檔案十分有用。
第11章“雜湊表”轉到雜湊表這個新的討論領域。專題applet演示了幾種方法:線性、二次探測和再雜湊及鏈地址法。本章中還討論了雜湊表方法在組織外部檔案方面的應用。
第12章“堆”討論了一種特殊的樹——堆,用它作為優先佇列的一種有效的實現手段。
第13章“圖”和第14章“帶權圖”處理圖的相關問題,前者處理未加權圖和簡單的查詢演算法,後者處理帶權圖和更加複雜的演算法,如最小生成樹和最短路徑。
第15章“應用場合”總結了前幾章描述過的各種資料結構,還著重討論瞭如何在給定情況下應用合適的資料結構的問題。
附錄A“執行專題applet和示例程式”提供瞭如何使用這兩種軟體的細節。此部分同時講解了如何使用來自Sun公司的軟體開發工具集,可以用它來修改示例程式或開發自己的程式,還可以通過它來執行專題applet和示例程式。
附錄B“進一步學習”介紹了一些關於資料結構和相關內容的進階書籍。
附錄C“問題答案”包括了書中章末問題的解答。
請好好享受吧!
希望我們能使學習的過程儘可能地沒有痛苦,依我們的理想,學習的過程甚至應該是快樂的。如果我們實現了這個理想,請讓我們一起分享你所得到的快樂;如果沒有,請告訴我們何處應該改進。
本書可幫助讀者:
通過由基於Java的演示程式所組成的可視專題討論來掌握資料結構和演算法
學會如何為常見和不太常見的程式設計條件選擇正確的演算法
利用資料結構和演算法為現實世界的處理過程建模
瞭解不同的資料結構的優勢和弱點,考慮如何利用它們改進程式設計的效率
學會如何用面向物件的程式設計簡化資料結構和演算法
本書以一種易懂的方式教授如何安排和操縱資料的問題,其中不乏一些難題;瞭解這些知識以期使計算機的應用獲得最好的表現;不管使用何種語言或平臺,掌握了資料結構和演算法將改程序序的質量和效能:
書中提供了一套獨創的可視討論專題用以闡明主要的論題;它使用Java語言說明重要的概念,而避免了C/C++語言的複雜性,以便集中精力論述資料結構和演算法。
經驗豐富的作者Robert Lafore先生提供了許多簡單明瞭的例子,避免了對於這類命題常見的冗長、繁瑣的數學證明 在第二版中,他利用Java語言最新特性,修改並擴充了他的例子在每一章後都有問題和練習,使讀者有機會測試自己的理解程度