網絡上流傳着一句段子“程序員兩條腿,一條是算法,一條是英文,想跑的更遠,這兩條腿都不能弱”。英文,我們暫且不談,我們先來談談算法。
算法之難,在于将精巧的邏輯,通過合适的數據結構,用編程語言展開。在某種程度上,數據結構和算法可以說是計算機應用領域的底層邏輯,它也是程序員修煉内功的必備,是其中最為基礎的。
大部分有過計算機學習經驗的人都聽過“算法 數據結構 = 程序”,但現在很多的程序員隻知道做 CRUD BOY,用着别人封裝好的函數、類、庫、API,并認為數據結構和算法沒用,程序隻是搭積木而已。
然而,事實真的是這樣嗎?先不說數據結構和算法本身的魅力,數據結構與算法毫無疑問是大廠面試題中的常客、是進入大廠的敲門磚,如果不想被行業抛棄,想進入更大的名企,在 IT 道路上拿着高薪、走得更遠,掌握數據結構與算法是非常有必要的。
為了小夥伴們金三銀四沖刺大廠,小編特此分享一份字節内網數據結構與算法刷題筆記!
因文章篇幅限制,下面僅給大家展示目錄及部分内容,完整版已備好,需要獲取學習的朋友,麻煩幫忙點贊轉發下,後台私信【算法】,獲取完整内容免費下載方式。
基礎知識
在學習數據結構和算法方面的内容之前,本章先介紹有關數據結構的基本概念,幫助讀者為今後的學習掃清障礙。
線性表
線性表是- -種最基本、最常用的數據結構,表中的元素呈線性關系。線性表、棧、隊列和串都屬于線性結構,線性結構的特點是:除了第- -個元素沒有直接前驅元素,最後一個元素沒有直接後繼元素外,其他元素有唯一的前驅元素和唯一的後繼元素。
棧
棧(stack)是一種操作受限的線性表。棧具有線性表的結構特點:除了第一個元素和最後-一個元素外,其他元素隻有一個前驅元素和一個後繼元素。棧的限制在于它隻允許在表的一端進行插入和删除操作。在日常生活中,有許多棧的例子,進制轉換、表達式求值、括号匹配使用的都是棧的“後進先出”設計思想。.
隊列
隊列作為- -種操作受限的線性表,它隻允許在表的一端進行插入, 另一端進行删除。隊列具有“先進先出”的特性,其應用非常廣泛,主要應用在樹的層次遍曆、圖的廣度優先遍曆、鍵盤的輸入緩沖區、操作系統的資源分配等方面。
串
字符串,簡稱串,它也是一-種重要的線性結構。計算機中處理的大部分數據是串數據,例如學生學籍信息系統中的姓名、性别、家庭住址、院系名稱等數據都屬于串數據。串廣泛應用于各行各業的信息管理、信息檢索、問答系統、機器翻譯等系統的處理中。
數組
前面幾章介紹的線性表、棧、隊列和串都屬于線性結構,本章的數組和下一章的廣義表可看作線性結構的推廣。數組中的元素本身可以具有某種結構,而且元素的結構相同。數組中的元素可以是單個元素也可以是一個線性表。
廣義表
與數組一樣,廣義表也是線性表的一一種推廣。它是-種遞歸定義的數據結構,但其數據元素的類型可以不.同,其元素可以是普通元素,也可以是廣義表。廣義表被廣泛應用于人工智能等領域的表處理語言LISP中, .它把廣義表作為基本的數據結構,就連程序也表示成一系列的廣義表。
樹
本章讨論的樹、二叉樹等樹形結構(簡稱樹)屬于非線性數據結構。具體地講,樹是一-種層次結構,這種層次結構的特點是如果存在前驅節點,則一定是唯一的:如果存在後繼節點,則可以是多個。簡言之,樹中的節點之間是一-對多的關系。樹在日常生活中得到了廣泛應用,如文件管理中的目錄結構、人類社會的族譜和各種社會機構的組織都可用樹來形象表示。
圖
圖(graph) 是- -種網狀結構,是比樹更複雜的非線性結構。在圖中,任意兩個節點之間都可能相關,即.節點之間的鄰接關系可以是任意的。每個節點既可有多個直接前驅,也可有多個直接後繼。圖被應用于描述各種複雜的數據對象,在自然科學、社會科學和人文科學等領域和日常生活中有着非常廣泛的應用,如化學分子結構分析、遺傳學、通信線路、交通航線等。
查找算法
查找也稱檢索,是指從一批記錄中找到指定記錄的過程。查找算法是程序設計過程中處理非數值問題常用的操作之- -。例如,從英漢詞典中查找某個單詞的含義,從聯系人中查找朋友的聯系方式等。常用的查找算法包括基于線性表的查找、基于樹的查找、哈希表的查找。
第10章 排序算法
排序算法是程序設計中最常用的算法之一。排序(sorting)是程序設計中的一-種重要技術,它将由若幹數據元素(或記錄)組成的無序序列重新排列成一-個按關鍵字排列的有序序列。-般來說,排序算法按照排序策略可分為插入排序、交換排序、選擇排序、歸并排序和基數排序。
遞推算法
遞推算法是一種比較簡單的算法,即通過已知條件,利用特定關系得到中間結論,然後得到最後結果的算法。遞推算法通常利用計算機運算速度快、适合進行重複操作的特點,讓計算機對- -組操作重複執行,每次執行時都使用變量的新值代替舊值,不斷叠代對問題進行求解。遞推算法可分為順推法和逆推法兩種,本章通過幾個典型的實例來說明遞推算法的應用。
遞歸算法
遞歸就是自己調用自己,它是設計和描述算法的一種有力的工具,常常用來解決比較複雜的問題。遞歸是-種分而治之、将複雜問題轉換為簡單問題的求解方法。一般情況下,能采用遞歸描述的算法通常有以下特征:為求解規模為N的問題,設法将它分解成規模較小的問題,從小問題的解更容易構造出大問題的解,并且這些規模較小的問題也能采用同樣的分解方法,分解成規模更小的問題,并能從這些更小問題的解構造出規模較大問題的解。- -般情況下,規模N=1時,問題的解是已知的。
以上求解過程也利用了分治算法的思想。分治算法将一個大規模問題分解為若幹子問題,子問題相互獨立,然後将子問題的解合并就可得到原問題的解。分治算法具體可以使用遞歸實現。
枚舉算法
枚舉算法,也稱窮舉算法,它是編程中常用的-種算法。在解決某些問題時,可能無法按照-定規律從衆多的候選解中找出正确的解。此時,可以從衆多的候選解中逐一-取出候選解,并驗證候選解是否為正确的解。我們将這種方法稱為枚舉算法。
枚舉算法的缺點是運算量比較大,解題效率不高。如果枚舉範圍太大,那麼就會耗費過多。枚舉算法的優點是思路簡單,程序編寫和調試方便。因此,如果問題的規模不是很大,且要求在規定的時間和空間下能夠求出解,那麼我們最好采用枚舉算法,而不需要太在意是否還有更快的算法。
貪心算法
貪心算法(greedy algorithm)是一種不追 求最優解,隻希望找到較滿意解的算法。貪心算法省去了為找最優解要窮盡所有可能而必須耗費的大量時間,因此它一般可以快速得到比較滿意的解。貪心算法常以當前情況為基礎做最優選擇,而不考慮各種可能的整體情況,所以貪心算法不需要回溯。
貪心算法的典型應用包括找零錢問題、最優裝載問題、哈夫曼編碼加油站問題、背包問題等。例如,平時購物找零錢時,為使找回的零錢的硬币數最少,不要求窮舉出找零錢的所有方案,而是從最大面值的币種開始,按遞減的順序考慮各面額。先盡量用大面值的面額,當不足大面值時才去考慮下一個較小面值,這就是應用了貪心算法的思想。
回溯算法
回溯(backracking) 算法,又稱為試探算法,實際上類似于枚舉的搜索嘗試過程。它在搜索嘗試過程中尋找問題的解,當發現不滿足求解條件時,就“回溯"返回,嘗試其他路徑。回溯算法是- -種選優搜索法,按選優條件向前搜索,以達到目标。但當搜索到某一步時,發現原先的選擇并不優或達不到目标,就退回上- -步重新選擇。這種走不通就退回再走的方法稱為回溯,而滿足回溯條件的某個狀态的點稱為“回溯點”。許多複雜的、規模較大的問題都可以使用回溯算法求解,回溯算法有“通用解題算法"的美稱。
數值算法
數值算法是指使用計算機求解數學問題近似解的算法,并在求解過程中考慮誤差、收斂性和穩定性等問題。這些數學問題主要包括解方程或方程組、計算定積分等。數值算法計算的結果是離散的,存在一-定誤差,主要運用有限逼近的思想進行誤差運算。
實用算法
除了前文介紹的常用算法外,在日常生活中,一些與實際生活緊密相關的問題可能會涉及數據結構和相關算法方面的知識。例如大小寫金額的轉換、大整數相乘、求算術表達式的值等。
常見錯誤與程序調試技術
在設計數據結構與實現算法時,即使是算法思想是正确的,也常常會遇到各種類型的錯誤。因此程序調試成為必不可少的環節之一,隻有當程序能正确運行出結果,才說明算法或程序是正确的。程序調試不僅可以驗證算法思想和程序的正确性,還可以提高我們的算法設計和程序編寫水平。因此,程序調試和算法設計兩者是相輔相成的。
Visual C 6.0是一個常用且功能強大的程序調試工具,它可以幫助我們找出程序中的各種錯誤。本章主要介紹常見的錯誤類型及如何使用Visual C 6.0調試程序。
需要獲取完整版數據結構與算法刷題筆記的小夥伴:點贊 轉發文章後,私信我【算法】即可
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!