前言 數(shù)據(jù)結(jié)構(gòu)與算法是一門很重要的科目,,在目前數(shù)據(jù)化時代也起著至關(guān)重要的作用,,在以后面試以及工作中起著至關(guān)重要的作用。今天我們就來談一談數(shù)據(jù)結(jié)構(gòu)與算法中的算法,,在百度詞條中,,算法是指解題方案的準(zhǔn)確而完整的描述,是一系列解決問題的清晰指令,,算法代表著用系統(tǒng)的方法描述解決問題的策略機(jī)制,。通俗的來講,,算法就是解決某一實(shí)際問題的,如果一個小白想要開始學(xué)習(xí)算法,,怎么做才能最高效呢,? 必備基礎(chǔ) 算法的特征: 有窮性(算法的有窮性是指算法必須能在執(zhí)行有限個步驟之后終止) 輸出項(xiàng)(一個算法有一個或多個輸出,,以反映對輸入數(shù)據(jù)加工后的結(jié)果) 可行性(也稱之為有效性),。 影響算法優(yōu)劣的因素:時間復(fù)雜度,空間復(fù)雜度,,正確性,,可讀性,健壯性(也稱容錯性) 這些基礎(chǔ)知識掌握后,,就繼續(xù)看筆者學(xué)習(xí)算法的經(jīng)驗(yàn)吧,。 經(jīng)驗(yàn)分享 筆者初學(xué)算法的時候是大一想要參加程序競賽,讓自己的大學(xué)生活不是那么頹廢,,然后就突然覺得學(xué)習(xí)算法挺有意思的,,就學(xué)上了,所以興趣是最好的老師,,接下來進(jìn)入正題,。 我們要明確算法是有很多種,多到這一輩子都學(xué)不完,,我們重點(diǎn)是掌握一些常用的算法,,這些學(xué)會了以后小伙伴們可以根據(jù)自己的方向去鉆研。以下這些就是算法學(xué)習(xí)之路必須攻克的關(guān)卡:排序類算法,,動態(tài)規(guī)劃,,貪心算法,遞歸,,回溯類算法,。學(xué)好這些其實(shí)就兩步,練習(xí)過后理解,,理解過后再練習(xí),,如果覺得沒掌握,就再來一次,,反復(fù)著來,,怎么都可以掌握,這是總體學(xué)習(xí)的方針,。下面針對不同算法來做一下講解吧。 排序類算法 筆者認(rèn)為排序類算法是眾多算法中最簡單的一類算法,,排序本質(zhì)其實(shí)就是比較大小,,不同的排序方法只是比較大小的方式有所差異,大家多理解其中的差異就可以很輕松地掌握不同的排序方法,面對眾多的排序算法,,就一下幾種常用:冒泡排序,,選擇排序,插入排序,,快速排序,,堆排序。這些排序看理論很好懂,,代碼也好懂,,大家稍微用一點(diǎn)心就可以看懂的。 動態(tài)規(guī)劃 重點(diǎn),!在一類問題中,,可能會有許多可行解。動態(tài)規(guī)劃算法可以幫助我們在這些可行解里面找出最優(yōu)解,。其基本思想也是將待求解問題分解成若干個子問題,,先求解子問題,然后從這些子問題的解得到原問題的解,。我們可以用一個表來記錄所有已解的子問題的答案,。不管該子問題以后是否被用到,只要它被計(jì)算過,,就將其結(jié)果填入表中,,最后通過這個表來得到最優(yōu)答案。我們一起來看一道力扣平臺上比較簡單的動態(tài)規(guī)劃題目:
貪心算法 貪心算法(又稱貪婪算法)是指,,在對問題求解時,總是做出在當(dāng)前看來是最好的選擇,。也就是說,,不從整體最優(yōu)上加以考慮,算法得到的是在某種意義上的局部最優(yōu)解,。都是最優(yōu)解,,那貪心和上面的動態(tài)規(guī)劃有什么區(qū)別呢?動態(tài)規(guī)劃最后得到的結(jié)果是從整體出發(fā)的,,而貪心就是從局部,,比如平時購物找零錢時,為使找回的零錢的硬幣數(shù)最少,,不要求找零錢的所有方案,,而是從最大面值的幣種開始,按遞減的順序考慮各面額,,先盡量用大面值的面額,,當(dāng)不足大面值時才去考慮下一個較小面值,這就是貪心算法,。動態(tài)規(guī)劃則會求出所有方案,。如需找零9元時,我們有1元,,3元和5元的硬幣,,用貪心算法只會得到(5,3,,1)一種結(jié)果,,動態(tài)規(guī)劃還可以得到(3,3,,3)這第二種結(jié)果,。 下面給大家一道經(jīng)典的背包問題,大家自己研究怎么貪吧:
回溯類算法 這類算法其實(shí)就是指深度優(yōu)先搜索和廣度優(yōu)先搜索。這兩種道理很簡單,,但是實(shí)際運(yùn)用起來會很困難,,先用下面的圖來說明一下吧 我們要從A開始然后找到目標(biāo)點(diǎn)D,,我們可以沿著一種特定點(diǎn)進(jìn)行移動,無法移動時再按照某種方式進(jìn)行回溯,。 |
|