開篇
數據結構是計算機科學與技術專業非常重要的一門核心基礎課,計算機科學各個領域以及各種應用軟件都要使用相關的數據結構和算法。
本篇的主要目的不是提供關於數據結構和算法的定理及證明。本書采用的模式是利用不同的復雜度改善問題的解決(對於每個問題,你將發現多個具有不同復雜度及降低復雜度的解法)。基本上,這一思路就是列舉某個問題的所有可能性。通過這種方式,即使你遇到一個新問題,它也能夠向你指明如何思考該問題所有可能的結果。對於正在准備面試、參加選拔性考試以及校園面試的讀者很有幫助。
祝君在2021年金九銀十中幫助你找到一份心儀的工作!
本篇關於數據結構與算法所講到的所有問題,面試相關以及文檔文末可查看免費獲取方式!
一、遞歸和回溯
什么是遞歸
任何調用自身的函數稱為遞歸。用遞歸方法求解問題,要點在於遞歸函數調用自身去解決一個規模比原始問題小-些的問題。這個過程稱為遞歸步驟。遞歸步驟會導致更多的遞歸調用。因此,保證遞歸過程能夠終止是很重要的。每次函數都會用比原問題規模更小的問題來調用自身。問題是隨着規模不斷變小必須能最終收斂到基本情形。
二、鏈表
什么是鏈表
鏈表是一種用於存儲數據集合的數據結構。
三、棧
什么是棧
棧是一種用於存儲數據的簡單數據結構(與鏈表類似)。數據入棧的次序是棧的關鍵。可以把自助餐廳中的一-堆盤子看作-一個棧的例子。當盤子洗干凈后,它們會添加到棧的頂端。當需要盤子時,也是從棧的頂端拿取。所以第一個放人棧中的盤子最后才能被拿取。
四、列隊
什么是列隊
隊列是一種用於存儲數據的數據結構(與鏈表和棧類似)。數據到達的次序是隊列的關鍵。在日常生活中隊列是指從序列的開始按照順序排列等待服務的一隊人或物。
五、數
什么是數
樹是一種類似於鏈表的數據結構,不過鏈表的結點是以線性方式簡單地指向其后繼結點,而樹的一個結點可以指向許多個結點。樹是一種典型的非線性結構。樹結構是表達具有層次特性的圖結構的一種方法。對於樹ADT(抽象數據類型),元素的順序不是考慮的重點。如果需要用到元素的順序信息,那么可以使用鏈表、棧、隊列等線性數據結構。
六、優先隊列和堆
什么是優先隊列
在有些情況下,可能需要找到元素集合中的最小或最大的元素。可以利用優先隊列ADT來完成該操作。優先隊列ADT是一-種數據結構,它支持插入(Insert)和刪除最小值(DeleteMin)操作(返回並刪除最小元素)或刪除最大值(DeleteMax)操作(返回並刪除最大元素)。
這些操作等價於隊列的EnQueue和DnQueue操作。區別在於,對於優先隊列,元素進入隊列的順序可能與其被操作的順序不同。作業調度是優先隊列的一一個應用實例,它根據優先級高低而不是先到先服務的方式來進行調度。
七、並查集ADT
八、圖算法
在現實世界中,許多問題是由對象以及它們之間的聯系所描述的。例如,在航空地圖中,我們可能對這樣的問題感興趣:“從海 德拉巴去紐約,哪種方式最快?”或者“哪種方式價格最便宜?”為了回答這些問題,需要關於對象(城鎮)之間的聯系(飛行路線)信息。圖就是用來解決這類問題的數據結構。
九、排序
什么是排序
排序是按照某種順序(升序或降序)排列序列元素的一種算法。排序的輸出是輸入的排列或重新排序。
十、查找
什么是查找
在計算機科學中,查找(或稱為搜索)就是從一個項目的集合中尋找某個具有特定屬性的項目的過程。項目可以是存儲在數據庫中的記錄、數組中的簡單數據元素、文件中的文本、樹中的結點、圖中的頂點和邊,或者其他搜索空間的元素。
十一、選擇算法( 中位數 )
什么是選擇算法
選擇算法是在某個列表中尋找第k個最小/最大數字(也稱為第k個順序統計量)的算法法。這包括查找最小值、最大值和中位數。對於查找第k個順序統計量,有多種不同的復雜的解決方案,本章將列舉所有這些可能的解決方案。
十二、符號表
符號表是關聯值和鍵值的一種數據結構
十三、散列
什么是散列
散列是一種用以實現信息存儲和快速檢索的技術。它常用於執行優化搜索和符號表的實現。
十四、字符串算法
十五、算法設計技術
前面的章節針對不同的問題介紹了各種算法。在求解一個新問題時,通常的思路是尋找當前問題與已解決問題之間的相似之處,從而輕松找到新問題的求解方法。
十六、貪婪算法
首先通過對一個簡單理論的討論,初步理解貪婪的思想。以下棋為例,每一步都有決策都需要考慮對后續棋局的影響。而在網球(或排球)比賽中,選手的行為僅取決於當前的狀況,選擇當下最為正確的動作,而不關心后續的影響。這說明在某些情況下選擇當下最佳行為的決策,可以得到一個最優解(貪婪),但並非所有情況都如此,貪婪策略適用於上述第二類問題。
十七、分治算法
對於第17章列舉的許多問題,貪婪策略不能提供最優解。而其中的某些問題可通過分治(Divid and Conquer, D&.C)法來輕松求解。分治法是一種重要的基於遞歸的算法設計技術,分治算法遞歸地將問題分解為兩個或多個同類型的子問題,直至這些子問題簡.單到能夠直接求解,然后再將這些子問題的解合成為原始問題的解。
十八、動態規划算法
十九、復雜度類型
在前面的各章中,描述了不同問題求解的復雜度。某些算法隨着問題規模的增加其復雜度的增長速率較低,而另一些則有比較高的增長速率。對於具有較低增長率的問題,稱為簡單問題(或易求解問題);對於具有較高復雜度的問題,稱為難問題(或難求解的問題)。該分類是基於求解某個問題時算法的運行時間(或者占用內存)決定的。
總結(特點)
- 所有代碼用Java實現。
- 數據結構難點啟發思考。
- 為每個問題列舉可能的解決辦法。
- 基於不同復雜度提供多種巧妙的解決方法。
- 覆蓋所有競爭性考試的主題。
- 囊括數據結構和算法的面試問題。
- 可作為大學本科生或碩士研究生課程的預習教材。
- 可為IT頂尖公司(微軟、谷歌、亞馬遜、雅虎、甲骨文、臉譜、蘋果等)的求職者提供指導。
關注我,添加V:tulingQY 備注“666”即可免費領取《數據結構與算法》!
