數(shù)據(jù)結(jié)構(gòu)與算法Java語言描述
定 價:38 元
- 作者:[美]Allen B. Downey(艾倫 B. D.)
- 出版時間:2018/9/1
- ISBN:9787519821944
- 出 版 社:中國電力出版社
- 中圖法分類:TP311.12
- 頁碼:
- 紙張:膠版紙
- 版次:
- 開本:16開
本書作者強(qiáng)調(diào)實踐知識和技能勝過理論,在書中為你展示了怎樣使用數(shù)據(jù)結(jié)構(gòu)實現(xiàn)有效的算法,并分析和測試了算法的性能。在本書中你將探索Java集合框架(JCF)中重要的類,它們是如何實現(xiàn)的,以及如何執(zhí)行。書中的每一章都提供了動手練習(xí)及其在線測試代碼。本書主要內(nèi)容有:學(xué)習(xí)使用列表和映射等數(shù)據(jù)結(jié)構(gòu)并理解它們是如何工作的。構(gòu)建一個應(yīng)用程序,用于讀取維基百科頁、解析頁面內(nèi)容并導(dǎo)航結(jié)果樹。通過分析代碼預(yù)測其運(yùn)行時間和所需的內(nèi)存空間。分別使用哈希表和二叉搜索樹編寫實現(xiàn)Map接口的類。創(chuàng)建一個簡單的Web搜索引擎,包括一個網(wǎng)絡(luò)爬蟲、一個存儲Web頁面內(nèi)容的索引器和一個返回用戶查詢結(jié)果的檢索器。
如果你是一名正在學(xué)習(xí)計算機(jī)科學(xué)的學(xué)生,或者你是一個正在準(zhǔn)備技術(shù)面試的軟件開發(fā)者,本書將以一種更清晰、更具體,以及更吸引人的方式幫助你學(xué)習(xí)并回顧軟件工程中*重要的部分-----數(shù)據(jù)結(jié)構(gòu)和算法。
前言本書背后的哲理數(shù)據(jù)結(jié)構(gòu)與算法是過去幾十年來最重要的創(chuàng)新之一,是軟件工程師需要掌握 的基礎(chǔ)工具。但在我看來,大部分有關(guān)數(shù)據(jù)結(jié)構(gòu)與算法的書籍都太過于理論化、 太厚而且太自底向上化了: 太過于理論化 算法的數(shù)學(xué)分析基于簡化的假設(shè),這些假設(shè)限制了它在實踐中的實用性。 很多關(guān)于數(shù)據(jù)結(jié)構(gòu)與算法的講解都忽略了其簡單化而關(guān)注其數(shù)學(xué)基礎(chǔ)。在 本書中,我對這部分提出了最實用的講解而省略或不再強(qiáng)調(diào)其他方面內(nèi)容。太厚許多有關(guān)數(shù)據(jù)結(jié)構(gòu)與算法的書籍至少有 500 頁,一些甚至超過 1000 頁。 我重點(diǎn)關(guān)注的是我認(rèn)為對軟件工程師最有用的話題,這樣使得本書厚度很 薄。 太自底向上化 許多講述數(shù)據(jù)結(jié)構(gòu)的書關(guān)注于它是怎樣工作的(實現(xiàn)),而很少涉及怎樣 使用它們(接口)。在本書中,我采取了自頂向下策略,從接口開始講起。 你在學(xué)習(xí) Java 集合框架中結(jié)構(gòu)的工作原理細(xì)節(jié)之前,先學(xué)到怎么使用它們。最后,有些書在講解這一話題時脫離了上下文而且沒有吸引力:只是一個又 一個煩人的數(shù)據(jù)結(jié)構(gòu)!我嘗試結(jié)合一個 Web 搜索應(yīng)用來組織這個話題,從而 使其變得生動有趣。Web 搜索應(yīng)用廣泛使用了數(shù)據(jù)結(jié)構(gòu),并且是一個有趣而 重要的話題。Web 搜索應(yīng)用還帶來了一些通常不在初學(xué)數(shù)據(jù)結(jié)構(gòu)類的部分涉及的主題,包 括 Redis 的持久性數(shù)據(jù)結(jié)構(gòu)。對于該放棄什么內(nèi)容,我已經(jīng)做出了艱難的決定,但我已經(jīng)做出了一些妥協(xié)。 在本書中包括幾個大多數(shù)人永遠(yuǎn)不會使用的主題,但他們可能在技術(shù)面試中 需要知道這些內(nèi)容。對于這些主題,我既提出了傳統(tǒng)的做法,同時也給出了 我懷疑的理由。本書還介紹了軟件工程實踐的基本知識,包括版本控制和單元測試。大多數(shù) 章節(jié)包括一個練習(xí),你可實踐所學(xué)的知識。每個練習(xí)都提供了檢查解決方案 的自動測試。對于大多數(shù)練習(xí),我在下一章的開頭都介紹了我的解決方法。必備知識本書適用的讀者包括計算機(jī)科學(xué)及相關(guān)領(lǐng)域的大學(xué)生、專業(yè)的軟件工程師、 軟件工程培訓(xùn)師以及正在準(zhǔn)備技術(shù)面試的相關(guān)人員。在讀本書之前,你需要有很好的 Java 基礎(chǔ)。具體說,你應(yīng)當(dāng)知道怎么定義一 個從已有類擴(kuò)展的新類或怎么實現(xiàn)一個接口。如果你對 Java 編程已經(jīng)不熟悉 了,這里有兩本書你需要先學(xué)習(xí)一下: Downey 和 Mayfield 編寫的《Think Java》(OReilly Media,2016),適用 于沒有一點(diǎn)編程基礎(chǔ)的人。 Sierra 和 Bates 編寫的《Head First Java》 (OReilly Media,2005),適用 于學(xué)過另一種編程語言的人。如果你不熟悉 Java 的接口,你可能需要學(xué)習(xí) http://thinkdast.com/interface 上 提供的教程What Is an Interface?。詞匯方面的注釋:Interface(接口)一詞比較容易使人混淆。在應(yīng)用程序接口(API)中,它指提供一定功能的一組類和方法。在 Java 語言中,Interface(接口)還指一種語言特征,它與類相似,定義了 一組方法。你也應(yīng)該熟悉類型參數(shù)與通用類型。比如,你應(yīng)知道怎樣創(chuàng)建一個有類型 參數(shù)的對象,如 ArrayList。如果你對類型參數(shù)不熟悉,請參閱 http://thinkdast.com/types。你應(yīng)該熟悉 Java 集合框架(JCF),可參閱 http://thinkdast.com/collections。 特別是,你應(yīng)熟悉 List 接口、ArrayList 類和 LinkedList 類。你最好也應(yīng)該熟悉 Apache 的 Ant,它是 Java 的自動編譯工具,可參閱 http:// thinkdast.com/anttut。你也應(yīng)該熟悉 JUnit,它是 Java 的單元測試框架,可參閱 http://thinkdast.com/ junit。使用書中的代碼本書的代碼在一個 Git 庫中,參見 http://thinkdast.com/repo。Git 是一個版本控制系統(tǒng),它允許你跟蹤組成項目的文件。Git 控制下的一個 文件集稱為一個倉庫(repository)。GitHub 是一個主機(jī)服務(wù),為 Git 倉庫提供了存儲空間和便捷的 Web 接口。它 提供了以下幾種使用代碼的方式: ? 可以按下 Fork 按鈕創(chuàng)建一個 Git Hub 倉庫的備份。如果你還沒有一個 GitHub 賬戶,需要注冊一個。備份后,你將在 GitHub 上擁有自己的倉庫, 可以使用它跟蹤你編寫的代碼。然后你可以克隆這個倉庫,將文件的一個 備份下載到你的計算機(jī)上。 ? 另一個做法是,可以不使用 Fork 備份而直接克隆倉庫。如果你選擇這么做, 就不需要 GitHub 賬戶,但不能在 GitHub 上保存你的修改。 ? 如果你一點(diǎn)也不想使用 Git,可以按下 GitHub 頁或鏈接 http://think dast. com/zip 上的 Download 按鈕下載代碼的 ZIP 壓縮包。當(dāng)你克隆倉庫或?qū)?ZIP 文件解壓后,就會找到一個 ThinkDataStructures 目錄, 其下有一個子目錄 code。本書中的例子使用 Java 開發(fā)工具包 7(Java SE Development Kit 7)開發(fā)和測 試。如果你使用的是舊開發(fā)版本,有些例子將不能運(yùn)行。如果你在使用一個 更新的版本,這些代碼都應(yīng)當(dāng)能正常運(yùn)行。本書使用約定本書使用以下排版約定:斜體(Italic)表示強(qiáng)調(diào)、按鍵、菜單選項、URL 網(wǎng)址和 email 地址。 黑體(Bold) 表示首次定義的新術(shù)語。 等寬字體(Constant width) 表示程序代碼清單,以及段落內(nèi)的文件名、文件擴(kuò)展,程序中的元素如變 量、函數(shù)名、數(shù)據(jù)類型、語句和關(guān)鍵字。等寬黑體 (Constant width bold)表示由用戶輸入的命令或其他文本。Safari 圖書在線Safari 圖書在線(www.safaribooksonline.com)是一個應(yīng)需而變的數(shù)字圖書館, 它以書籍和視頻的形式提供了來自全球范圍內(nèi)技術(shù)和企業(yè)領(lǐng)域資深作者撰寫 的專業(yè)內(nèi)容。專業(yè)技術(shù)人員、軟件開發(fā)人員、網(wǎng)頁設(shè)計師、商業(yè)和創(chuàng)意專業(yè)人士使用 Safari圖書在線作為研究解決問題、學(xué)習(xí)和認(rèn)證培訓(xùn)的首要資源。Safari 圖書在線為企業(yè)、政府機(jī)構(gòu)、教育機(jī)構(gòu)和個人提供了一系列計劃和定價 方案。訂閱者可在一個快捷搜索的數(shù)據(jù)庫中獲得成千上萬的書籍、培訓(xùn)視頻和 出版前的手稿,如 OReilly Media,Prentice Hall Professional,Addison- Wesley Professional,Microsoft Press,Sams,Que,Peachpit Press,F(xiàn)ocal Press,Cisco Press,John Wiley & Sons,Syngress,Morgan Kaufmann,IBM Redbooks,Packt,Adobe Press,F(xiàn)T Press,Apress,Manning,New Riders, McGraw-Hill,Jones & Bartlett,Course Technology 以及其他數(shù)百家出版社。 有關(guān) Safari 圖書在線的更多信息,請訪問我們的網(wǎng)站。聯(lián)系方式請將您發(fā)現(xiàn)的問題以及建議及時報告給出版商:美國:OReilly Media,Inc.1005 Gravenstein Highway North Sebastopol,CA 95472中國:北京市西城區(qū)西直門南大街2號成銘大廈C座807室(100035) 奧萊利技術(shù)咨詢(北京)有限公司發(fā)表評論或咨詢有關(guān)本書的技術(shù)問題,請發(fā)送電子郵件至 bookquestions@ oreilly.com。關(guān)于我們的書籍、課程、會議和新聞的更多信息,請參閱我們的網(wǎng)站:http://www.oreilly.comhttp://www.oreilly.com.cn我們的 Facebook:http://facebook.com/oreilly。 我們的 Twitter:http://twitter.com/oreillymedia。我們的 YouTube:http://www.youtube.com/oreillymedia。致謝這本書是我在紐約 Flatiron 學(xué)校編寫的全部課程內(nèi)容的一個改編版,這所學(xué)校 提供了各種與編程和 Web 開發(fā)相關(guān)的在線課堂。他們基于這個材料有一個課 堂,提供在線開發(fā)環(huán)境、來自講師和其他學(xué)生的幫助,以及結(jié)業(yè)證書。你可 在網(wǎng)站 http://flatironschool.com 上找到更多信息。 在 Flatiron 學(xué)校,Joe Burgess、Ann John 和 Charles Pletcher 提供了指導(dǎo)、 建議以及對初始版本從實現(xiàn)到測試整個過程的修改。感謝你們! 非常感謝技術(shù)評論員 Barry Whitman、Patrick White 以及 Chris Mayfield, 他們發(fā)現(xiàn)了許多錯誤并提供了許多有幫助的建議。當(dāng)然,書中還有錯誤的 話,那是我的過失,與他們無關(guān)! ? 感謝 OlinCollege 學(xué)院數(shù)據(jù)結(jié)構(gòu)與算法課程的指導(dǎo)教師與學(xué)生們,他們閱 讀了本書并給出了有益的反饋意見。Charles Roumeliotis 為 OReilly 公司編輯了本書并作出了許多改進(jìn)。 如果你對本書有看法或評論,請發(fā)郵件到 feedback@greenteapress.com。
Allen B. Downey是奧林工程學(xué)院計算機(jī)科學(xué)領(lǐng)域的教授,曾經(jīng)在韋爾斯利學(xué)院、科爾比學(xué)院和伯克利大學(xué)執(zhí)教。他擁有伯克利大學(xué)計算機(jī)科學(xué)博士學(xué)位及麻省理工學(xué)院碩士和學(xué)士學(xué)位。他編寫的其他書籍有:《Think Java》、《Think Python》、《Think Stats》和《Think Bayes》。
目錄前言1第 1 章 接口7為什么有兩種列表?8List 接口9練習(xí) 111第 2 章 算法分析14選擇排序算法15大 O 表示法17練習(xí) 218第 3 章 ArrayList 類22對 MyArrayList 類中方法的分類22對 add 方法分類24問題規(guī)模26鏈接數(shù)據(jù)結(jié)構(gòu)27練習(xí) 329關(guān)于垃圾回收的注記32第 4 章 LinkedList 類33MyLinkedList 方法的分類33比較 MyArrayList 和 MyLinkedList36性能分析36結(jié)果的解釋39練習(xí) 441第 5 章 雙向鏈表43結(jié)果的性能分析43分析 LinkedList 方法的性能45在 LinkedList 末尾添加47雙向鏈表48選擇一個結(jié)構(gòu)49第 6 章 樹的遍歷51搜索引擎51解析 HTML52使用 JSOUP54遍歷 DOM 樹56深度優(yōu)先搜索57Java 棧58迭代 DFS59第 7 章 到達(dá)哲學(xué)61準(zhǔn)備開始61Iterable 接口和 Iterator 類62WikiFetcher64練習(xí) 565第 8 章 索引器68選擇數(shù)據(jù)結(jié)構(gòu)68TermCounter70練習(xí) 672第 9 章 Map 接口77實現(xiàn) MyLinearMap77練習(xí) 778分析 MyLinearMap79第 10 章 哈希方法82哈希方法82哈希方法是如何工作的?84哈希方法和變體86練習(xí) 887第 11 章 HashMap89練習(xí) 989分析 MyHashMap90權(quán)衡考慮92對 MyHashMap 的性能分析93修改 MyHashMap94UML 類圖96第 12 章 TreeMap98哈希方法有什么問題?98二叉搜索樹99練習(xí) 10101實現(xiàn) TreeMap102第 13 章 二叉搜索樹106一個簡單的 MyTreeMap106搜索值107實現(xiàn) put108中序遍歷算法110對數(shù)方法111自平衡樹114另一個練習(xí)114第 14 章 持久性115Redis116Redis 客戶端和服務(wù)器117構(gòu)建一個 Redis 支持的索引118Redis 數(shù)據(jù)類型120練習(xí) 11122更多建議123一些設(shè)計提示125第 15 章 爬行維基百科126Redis 支持的索引器126查找的分析129索引分析129圖的遍歷130練習(xí) 12131第 16 章 布爾搜索135爬蟲解決方案135信息檢索137布爾搜索138練習(xí) 13139Comparable 和 Comparator 接口141擴(kuò)展部分143第 17 章 排序145插入排序146練習(xí) 14148合并排序的分析149基數(shù)排序151堆排序153有界堆155空間復(fù)雜性156