# 前言
> 原文:[Preface](http://greenteapress.com/thinkdast/html/thinkdast001.html)
> 譯者:[飛龍](https://github.com/wizardforcel)
> 協議:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻譯](https://translate.google.cn/)
## 本書背后的哲學
數據結構和算法是過去 50 年來最重要的發明之一,它們是軟件工程師需要了解的基礎工具。但是在我看來,這些話題的大部分書籍都過于理論,過于龐大,也是“自底向上”的:
過于理論
算法的數學分析基于許多簡化假設,它們限制了實踐中的可用性。這個話題的許多描述都掩蓋了簡化,并專注于數學。在這本書中,我介紹了這個話題的最實際的子集,并省略或不強調其余的內容。
過于龐大
這些話題的大多數書籍至少有 500 頁,有些超過 1000 頁。通過關注我認為對軟件工程師最有用的話題,我把這本書限制在 200 頁以下。
過于“自底向上”
許多數據結構的書籍著重于數據結構如何工作(實現),而不是使用它們(接口)。在這本書中,我從接口開始,“自頂向下”。讀者在學習如何使用 Java 集合框架中的結構之后,再了解它們的工作原理。
最后,有些書將這個材料展示在上下文之外,缺少動機:這只是另一個數據結構!我試圖使之生動起來,通過圍繞一個應用 - 網頁搜索 - 來組織這些話題,它廣泛使用數據結構,并且是一個有趣和重要的話題。
這個應用激發了一些話題,通常不會在介紹性數據結構的課中涵蓋,包括 Redis 的持久化數據結構。
我已經做出了一些艱難的決定,來進行取舍,但我也做了一些妥協。我包括了大多數讀者永遠不會使用的一些話題,但是可能在技術面試中,你需要知道這些話題。對于這些話題,我提出了傳統的觀點和我懷疑的理由。
本書還介紹了軟件工程實踐的基本方面,包括版本控制和單元測試。大多數章節都包括一個練習,允許讀者應用他們學到的內容。每個練習都提供自動化測試,來檢查解決方案。對于大多數練習,我在下一章的開頭展示我的解決方案。
### 0.1 預備條件
本書面向計算機科學及相關領域的大學生,專業軟件工程師,軟件工程培訓人員和技術面試準備人員。
在你開始讀這本書之前,你應該很熟悉 Java,尤其應該知道如何定義一個擴展現有類的新類,或實現一個`interface`。如果你不熟悉 Java 了,這里有兩本書可以用于起步:
+ Downey 和 Mayfield,《Think Java》(O'Reilly Media,2016),它面向以前從未編程過的人。
+ Sierra 和 Bates,《Head First Java》(O'Reilly Media,2005),它適用于已經知道另一種編程語言的人。
如果你不熟悉 Java 中的接口,你可能需要在 <http://thinkdast.com/interface> 上完成一個名為“什么是接口”的教程 。
一個詞匯注解:“接口”這個詞可能會令人困惑。在應用編程接口(API)的上下文中,它指代一組提供某些功能的類和方法。
在 Java 的上下文中,它還指代一個與類相似的語言特性,它規定了一組方法。為了避免混淆,我將使用正常字體中的“接口”來表示接口的一般思想,代碼字體的`interface`用于 Java 語言特性。
你還應該熟悉類型參數和泛型類型。例如,你應該知道如何使用類型參數創建對象,如`ArrayList<Integer>`。如果不是,你可以在 <http://thinkdast.com/types> 上了解類型參數。
你應該熟悉 Java 集合框架(JCF??),你可以閱讀 <http://thinkdast.com/collections>。特別是,你應該知道`List interface`,以及`ArrayList`和`LinkedList`類。
理想情況下,你應該熟悉 Apache Ant,它是 Java 的自動化構建工具。你可以在 <http://thinkdast.com/anttut> 上閱讀 Ant 的更多信息。
你應該熟悉 JUnit,它是 Java 的單元測試框架。你可以在 <http://thinkdast.com/junit> 上閱讀更多信息。
## 處理代碼
本書的代碼位于 <http://thinkdast.com/repo> 上的 Git 倉庫中 。
Git 是一個“版本控制系統”,允許你跟蹤構成項目的文件。Git 控制下的文件集合稱為“倉庫”。
GitHub 是一個托管服務,為 Git 倉庫提供存儲和方便的 Web 界面。它提供了幾種使用代碼的方法:
+ 你可以通過按下`Fork`(派生)按鈕,在 GitHub 上創建倉庫的副本。如果你還沒有 GitHub 帳戶,則需要創建一個。派生之后,你可以在 GitHub 上擁有你自己的倉庫,你可以使用它們來跟蹤你編寫的代碼。然后,你可以“克隆”倉庫,它將文件的副本下載到你的計算機。
+ 或者,你可以克隆倉庫而不進行派生。如果你選擇此選項,則不需要 GitHub 帳戶,但你無法將更改保存在 GitHub 上。
+ 如果你不想使用 Git,你可以使用 GitHub 頁面上的`Download`(下載)按鈕或此鏈接<http://thinkdast.com/zip>,以 ZIP 壓縮包格式下載代碼。
克隆倉庫或解壓 ZIP 文件后,你應該有一個名為`ThinkDataStructures`的目錄,其中有一個名為`code`的子目錄。
本書中的示例是使用 Java SE 7 開發和測試的。如果你使用的是較舊的版本,一些示例將無法正常工作。如果你使用的是更新版本,那么它們都應該能用。
## 貢獻者
這本書是我為紐約市 Flatiron School 寫的課程的一個改編版,它提供了編程和網頁開發相關的各種在線課程。他們提供基于這個材料的課程,提供在線開發環境,來自教師和其他學生的幫助,以及結業證書。你可以在 <http://flatironschool.com>上找到更多信息 。
+ 在 Flatiron School,Joe Burgess,Ann John 和 Charles Pletcher 通過實現和測試,提供了來自初始規范的指導,建議和更正。謝謝你們!
+ 我非常感謝我的技術審校員 Barry Whitman, Patrick White 和 Chris Mayfield,他提出了許多有用的建議,并捕獲了許多錯誤。當然,任何剩余的錯誤都是我的錯,而不是他們的錯!
+ 感謝 Olin College 的數據結構和算法課程中的教師和學生,他們讀了這本書并提供了有用的反饋。
如果你對文本有任何意見或建議,請發送至:<feedback@greenteapress.com>。