前言
數據結構與算法是一門很重要的科目,在目前數據化時代也起著至關重要的作用,在以后面試以及工作中起著至關重要的作用。今天我們就來談一談數據結構與算法中的算法,在百度詞條中,算法是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法代表著用系統的方法描述解決問題的策略機制。通俗的來講,算法就是解決某一實際問題的,如果一個小白想要開始學習算法,怎么做才能最高效呢?
必備基礎
算法的特征:
有窮性(算法的有窮性是指算法必須能在執行有限個步驟之后終止)
確切性(算法的每一步驟必須有確切的定義)
輸入項(一個算法有0個或多個輸入,以刻畫運算對象的初始情況)
輸出項(一個算法有一個或多個輸出,以反映對輸入數據加工后的結果)
可行性(也稱之為有效性)。
影響算法優劣的因素:時間復雜度,空間復雜度,正確性,可讀性,健壯性(也稱容錯性)
這些基礎知識掌握后,就繼續看筆者學習算法的經驗吧。
經驗分享
筆者初學算法的時候是大一想要參加程序競賽,讓自己的大學生活不是那么頹廢,然后就突然覺得學習算法挺有意思的,就學上了,所以興趣是最好的老師,接下來進入正題。
我們要明確算法是有很多種,多到這一輩子都學不完,我們重點是掌握一些常用的算法,這些學會了以后小伙伴們可以根據自己的方向去鉆研。以下這些就是算法學習之路必須攻克的關卡:排序類算法,動態規劃,貪心算法,遞歸,回溯類算法。學好這些其實就兩步,練習過后理解,理解過后再練習,如果覺得沒掌握,就再來一次,反復著來,怎么都可以掌握,這是總體學習的方針。下面針對不同算法來做一下講解吧。
排序類算法
筆者認為排序類算法是眾多算法中最簡單的一類算法,排序本質其實就是比較大小,不同的排序方法只是比較大小的方式有所差異,大家多理解其中的差異就可以很輕松地掌握不同的排序方法,面對眾多的排序算法,就一下幾種常用:冒泡排序,選擇排序,插入排序,快速排序,堆排序。這些排序看理論很好懂,代碼也好懂,大家稍微用一點心就可以看懂的。
動態規劃
重點!在一類問題中,可能會有許多可行解。動態規劃算法可以幫助我們在這些可行解里面找出最優解。其基本思想也是將待求解問題分解成若干個子問題,先求解子問題,然后從這些子問題的解得到原問題的解。我們可以用一個表來記錄所有已解的子問題的答案。不管該子問題以后是否被用到,只要它被計算過,就將其結果填入表中,最后通過這個表來得到最優答案。我們一起來看一道力扣平臺上比較簡單的動態規劃題目:
輸入一個整型數組,數組里有正數也有負數。數組中的一個或連續多個整數組成一個子數組,求所有子數組的和的最大值。
示例1:
輸入: nums = [-2,1,-3,4,-1,2,1,-5,4]
輸出: 6
解釋: 連續子數組 [4,-1,2,1] 的和最大,為 6。
在這道題里,目標是找連續子集的最大和,這道題我們創建數組dp吧,用dp[i]代表以元素 nums[i] 為結尾的連續子數組最大和。所以dp[0]為-2,dp[1]為max[dp[0],dp[0]+nums[1]], dp[2]為max[dp[1],dp[1]+nums[2]],一次類推,最后我們在dp里就找到了和題目相符合的解了,是不是很簡單呀。解決了第一道此類型的題目后,以后的就會感覺輕松很多,練習再理解,理解再練習,反復著來,很快就會了。
貪心算法
貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,算法得到的是在某種意義上的局部最優解。都是最優解,那貪心和上面的動態規劃有什么區別呢?動態規劃最后得到的結果是從整體出發的,而貪心就是從局部,比如平時購物找零錢時,為使找回的零錢的硬幣數最少,不要求找零錢的所有方案,而是從最大面值的幣種開始,按遞減的順序考慮各面額,先盡量用大面值的面額,當不足大面值時才去考慮下一個較小面值,這就是貪心算法。動態規劃則會求出所有方案。如需找零9元時,我們有1元,3元和5元的硬幣,用貪心算法只會得到(5,3,1)一種結果,動態規劃還可以得到(3,3,3)這第二種結果。
下面給大家一道經典的背包問題,大家自己研究怎么貪吧:
有一個背包,背包容量是M=150。有7個物品,物品不可以分割成任意大小。
要求盡可能讓裝入背包中的物品總價值最大,但不能超過總容量。
物品 A B C D E F G
重量 35 30 60 50 40 10 25
價值 10 40 30 50 35 40 30
回溯類算法
這類算法其實就是指深度優先搜索和廣度優先搜索。這兩種道理很簡單,但是實際運用起來會很困難,先用下面的圖來說明一下吧
我們要從A開始然后找到目標點D,我們可以沿著一種特定點進行移動,無法移動時再按照某種方式進行回溯。
如果是深度優先搜索,我們就按著一條線一直往下走,無路可走時再回溯到起點,此時就是A-C-F,再是(A)-(C)-E-G,最后是(A)-B-D,連起來就是A-C-F-E-G-B-D。(括號里是走過的點)廣度優先搜索就是先走當前點可以走的所有點,再走下一個點可到的所有點,此時就是A-B-C,再(C)-E-F,再(B)-D最后(E)-G,連起來就是A-B-C-E-F-D-G這就是回溯類算法最基本的思想,想深入學習,大家就去力扣平臺上練題吧。