第一章 導論程序員
1.1 關於本書算法
本書主要講述的是基本的數據結構和算法,它們是組成大型和複雜軟件產品的基本元素。若是要對數據結構有充分的理解,你須要作三件事情:第一,你必須知道信息在計算機內存中的存在和組織形式;第二,你必須熟悉不一樣數據結構中的信息的操做算法;第三,你必須理解不一樣數據結構的性能特性,使你在特定的應用中可以選擇合適的數據結構,作出正確的決策。編程
本書也闡述了面向對象的設計理念,對廣泛經常使用的面向對象設計模式進行了強化。本書涉及的算法和數據結構都是Python語言的形式呈現的。大多數的數據結構都是基於類層次結構的,這樣的設計使後面章節的程序基於前面章節的所出現過的程序。設計模式
1.2 面向對象的設計數組
傳統的軟件設計模式基本上面向數據或者面向過程的設計模式。面向數據的設計理念強調的是信息的表現形式和局部及所屬總體的關係;另外一方面,面向過程的設計理念強調的是軟件產品的動做過程,數據處於次要地位。數據結構
如今廣泛觀點認爲,在處理設計大型複雜軟件產品的複雜性方面,面向對象的方法論比面向數據和麪向過程都更有效率。這是由於數據和過程是同等重要的,對象的使用將數據和對數據的處理過程聯繫了起來。使用對象的主要優點在於,它提供了抽象和封裝的方法。數據結構和算法
1.2.1 抽象函數
抽象能夠看作是一種在抑制不相干的具體細節的同時對相關特性進行強調的機制。抽象的最大的好處是可使程序員在思考要解決的問題時更加簡單容易。工具
例如,過程抽象使軟件設計者只需思考要執行的動做步驟而不須要擔憂這些動做具體是怎麼實現執行的。同理,數據抽象使軟件設計者只須要考慮性能
程序中的對象以及對象之間的交互,不須要考慮對象是怎麼實現的。
抽象也有不一樣的級別層次,低層次的抽象會暴露更多的實現細節,而高這次的抽象會將之隱藏起來。
1.2.2 封裝
封裝在軟件設計中輔助設計者將信息強制隱藏起來。對象是將數據及數據的相應的操做過程進行封裝。在某種意義上,對象將具體的實現細節在對象的使用者面前進行隱藏。
這樣作主要有兩大好處:概念獨立性和物理獨立性。
概念獨立性是在對象的使用中將對象的實現隱藏的結果。所以在對象的使用過程當中,沒法對一個對象作出任何改動,這是由對象的實現過程決定的。這是很是使人滿意的,這樣的設計使得當對象的實現有改動時沒必要對使用該對象的代碼作出修改。
物理獨立性,對象的行爲是由對象自己決定的,不會受到外部實體的影響。所以,在對一個對象進行操做時,不會產生意外的反作用。
1.3 類層次和設計模式
面向對象的程序設計不只僅是簡單的將一些數據和它們的處理過程封裝到對象中。面向對象的方法也對對象的分類和不一樣類的對象之間的關係進行處理。
用於表示對象類的關係的主要工具是派生,新的類能夠從現有的類派生出來。使派生如此有用的是繼承的概念,派生出來的類能夠繼承父類的特徵。另外,繼承的函數能夠被重寫,你也能夠再派生類中自定義新的函數。
本書的一大特色就是文中展示的全部的數據結構都是基於類層次結構的。實際上,類層次結構是對數據結構的一種分類。特定的抽象數據結構的不一樣的實現都來自於相同的抽象基類。相互關聯的基類則是由抽象和封裝了它們共同特性的一些類派生而來的。
除了相關聯的類分層設計外,有經驗的面向對象設計者對不相關類之間的交互也會當心注意。在經驗的幫助下,一個優秀的設計者能發現對象交互過程當中的循環(重複)模式,經過使用這些模式,你的面向對象設計將會更加靈活和可重用。
最近,程序員對這些通用設計模式進行了命名歸類,這些設計模式的分類目錄已經被編輯發佈出來。
1.3.1 容器
容器是一種能夠將其餘對象放入其中的對象。容器自己有容量,能夠是滿的或者空的;其餘的對象能夠插入容器或者從容器中取出。另外,可搜索容器是一種支持效率搜索操做的容器。
1.3.2 迭代器
迭代器提供了一種對容器中的不一樣對象同一時間只能訪問一個的方法。全部的迭代器都共享一個接口,隱蔽了用戶所使用的容器的底層實現。
1.3.3 訪客
訪客表示的是一種對容器中全部對象均可以進行的操做。全部的訪客都共享同一個接口,並對容器隱藏所要進行的操做。同時,訪客的定義是單獨於容器的,所以,一個特定的訪客能夠在任何容器中使用。
1.3.4 指針
指針表示的是在一個有序容器中某對象的位置。指針給使用者提供給一個方法來指定將要進行的操做位於什麼位置,而沒必要了解該位置表明的什麼東西。
1.3.5 適配器
適配器能夠將類的接口形式轉換爲其使用者所須要的的接口形式。這樣使得非兼容接口的類在所需接口不一致的狀況下仍然可使用。
1.3.6 單例模式
單例模式是一個類只能有一個實例。這樣的類保證了只能有一個實例被建立,並提供了訪問該實例的方法。
1.4 你須要知道的Python特性
本書不是對編程基礎的教學。本書的讀者應該已經有必定的編程基礎,並學過如何使用Python編寫程序。那就表示,你已經清楚了Python的語法規則,知道如何編寫Python語句來初步解決程序設計問題。接下來的內容將更充分的簡述你所應該熟悉的Python程序設計的各個要點。
1.4.1 對象,值和類型
你應該對對象是數據的抽象形式這樣的概念感到舒心,一個對象有他的屬性,例如:標示(一致性),類型和值。
1.4.2 命名和捆綁
你應該理解對象名和對象自己之間的不一樣。具體就是,賦值語句將對象名和一個對象捆綁起來,而該賦值語句不會對對象自己的值作任何修改。
1.4.3 參數傳遞
Python中的參數傳遞是引用傳遞。重要的是,當一個函數被調用時,函數定義中給定的形參名和函數調用中的實際參數指定的對象綁定。
1.4.4 類
Python中的類封裝了一組值和一組操做。類的值和操做以類的屬性來表示。Python中的類定義了一個新的類型。類的實例被稱爲對象。
1.4.5 繼承
在Python中 ,類能夠派生出其餘類。派生類繼承了父類的全部屬性。另外,在派生類中能夠對繼承的屬性進行重寫,也能夠自定義新的屬性。你應該瞭解Python虛擬機是如何決定代碼執行時調用特定的方法。
1.4.6 新型類
Python提供了兩種風格的類:經典類和新型類。在這本書中,咱們僅使用Python的新型類。新型類支持屬性特性,並提供了知足局部優先排序和單調性約束的方法解析順序。
1.4.7 其餘特性
本書也使用了Python的其餘特性,如異常處理和生成器。你能夠經過本書學到這些內容。
1.5 本書的章節組織
1.5.1 模型和漸進分析
要分析一個算法的性能,咱們必須瞭解計算機的模型。第2章主要展現了3種計算機模型,按展現順序,精確程度遞減,可是使用也更加簡單。這些模型都比較類似,使用時要注意對算法的執行注意當心。
接下來第3章主要講的是漸進分析,這是很是有用的一項數學方法,由於它極大的簡便了對算法的分析。漸進分析使咱們沒必要對算法的具體執行特別關注,同時能得出廣泛(大致)的結論。
1.5.2 基礎數據結構
當咱們要實現一種數據結構時,咱們首先要決定是否使用數組或鏈表做爲底層的組織結構。所以,數組和鏈表有被稱爲基礎數據結構。第4章也包含了多維數組和矩陣的內容。
1.5.3 抽象數據類型和類層次結構
第5章介紹了抽象數據類型的概念。本書中討論的全部的數據結構都是以各類抽象數據類型的實例的形式展示的。第5章也介紹了類層次結構,同時對相關的迭代器和訪客的概念進行了闡述。
1.5.4 數據結構
第6章介紹了堆棧,隊列,雙端隊列的內容。第7章介紹了有序列表和排序列表。第8章介紹了散列法的概念,覆蓋了許多不一樣的對象類型的哈希函數的設計,最後介紹了哈希表和散射表。
樹和搜索樹的內容分別位於第9章和第10章。樹是最重要的非線性數據結構之一。第10章包含多種樹的遍歷,包括深度優先遍歷和廣度優先遍歷。第1
1章講述了優選隊列,第12章講述了集合,多重集和劃分。
Python運行時間系統的必要組成部分是動態分配的存儲池。第13章提出了許多用於實現垃圾回收的不一樣方法,在這個過程當中,說明與動態存儲分配相關聯的實際開銷。
1.5.5 算法
相比於數據結構,最後三章更多關注於算法方面。第14章是不一樣算法模式的綜述,經過引入一個抽象的問題求解的概念,咱們展現了其相關的模式。第15章經過類似的方法引出了各類分類算法。咱們經過一個抽象的分類器,展現了其相關的分類算法。
最後,第16章簡單介紹了圖的概念和圖的算法,本章結合前面章節討論過的類層次結構和14章各類算法綜合運用。