當前位置:編程學習大全網 - 遊戲軟體 - 程序員都應該精通的六種算法,妳會了嗎?

程序員都應該精通的六種算法,妳會了嗎?

對於壹名優秀的程序員來說,面對壹個項目的需求的時候,壹定會在腦海裏浮現出最適合解決這個問題的方法是什麽,選對了算法,就會起到事半功倍的效果,反之,則可能會使程序運行效率低下,還容易出bug。因此,熟悉掌握常用的算法,是對於壹個優秀程序員最基本的要求。

那麽,常用的算法都有哪些呢?壹般來講,在我們日常工作中涉及到的算法,通常分為以下幾個類型:分治、貪心、叠代、枚舉、回溯、動態規劃。下面我們來壹壹介紹這幾種算法。

壹、分治算法

分治算法,顧名思義,是將壹個難以直接解決的大問題,分割成壹些規模較小的相同問題,以便各個擊破,分而治之。

分治算法壹般分為三個部分:分解問題、解決問題、合並解。

分治算法適用於那些問題的規模縮小到壹定程度就可以解決、並且各子問題之間相互獨立,求出來的解可以合並為該問題的解的情況。

典型例子比如求解壹個無序數組中的最大值,即可以采用分治算法,示例如下:

def pidAndConquer(arr,leftIndex,rightIndex):

if(rightIndex==leftIndex+1 || rightIndex==leftIndex){

return Math.max(arr[leftIndex],arr[rightIndex]);

}

int mid=(leftIndex+rightIndex)/2;

int leftMax=pidAndConquer(arr,leftIndex,mid);

int rightMax=pidAndConquer(arr,mid,rightIndex);

return Math.max(leftMax,rightMax);

二、貪心算法

貪心算法是指在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的僅是在某種意義上的局部最優解。

貪心算法的基本思路是把問題分成若幹個子問題,然後對每個子問題求解,得到子問題的局部最優解,最後再把子問題的最優解合並成原問題的壹個解。這裏要註意壹點就是貪心算法得到的不壹定是全局最優解。這壹缺陷導致了貪心算法的適用範圍較少,更大的用途在於平衡算法效率和最終結果應用,類似於:反正就走這麽多步,肯定給妳壹個值,至於是不是最優的,那我就管不了了。就好像去菜市場買幾樣菜,可以經過反復比價之後再買,或者是看到有賣的不管三七二十壹先買了,總之最終結果是菜能買回來,但搞不好多花了幾塊錢。

典型例子比如部分背包問題:有n個物體,第i個物體的重量為Wi,價值為Vi,在總重量不超過C的情況下讓總價值盡量高。每壹個物體可以只取走壹部分,價值和重量按比例計算。

貪心策略就是,每次都先拿性價比高的,判斷不超過C。

三、叠代算法

叠代法也稱輾轉法,是壹種不斷用變量的舊值遞推新值的過程。叠代算法是用計算機解決問題的壹種基本方法,它利用計算機運算速度快、適合做重復性操作的特點,讓計算機對壹組指令(或壹定步驟)進行重復執行,在每次執行這組指令(或這些步驟)時,都從變量的原值推出它的壹個新值。最終得到問題的結果。

叠代算法適用於那些每步輸入參數變量壹定,前值可以作為下壹步輸入參數的問題。

典型例子比如說,用叠代算法計算斐波那契數列。

四、枚舉算法

枚舉算法是我們在日常中使用到的最多的壹個算法,它的核心思想就是:枚舉所有的可能。枚舉法的本質就是從所有候選答案中去搜索正確地解。

枚舉算法適用於候選答案數量壹定的情況。

典型例子包括雞錢問題,有公雞5,母雞3,三小雞1,求m錢n雞的所有可能解。可以采用壹個三重循環將所有情況枚舉出來。代碼如下:

五、回溯算法

回溯算法是壹個類似枚舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。

許多復雜的,規模較大的問題都可以使用回溯法,有“通用解題方法”的美稱。

典型例子是8皇後算法。在8 8格的國際象棋上擺放八個皇後,使其不能互相攻擊,即任意兩個皇後都不能處於同壹行、同壹列或同壹斜線上,問壹***有多少種擺法。

回溯法是求解皇後問題最經典的方法。算法的思想在於如果壹個皇後選定了位置,那麽下壹個皇後的位置便被限制住了,下壹個皇後需要壹直找直到找到安全位置,如果沒有找到,那麽便要回溯到上壹個皇後,那麽上壹個皇後的位置就要改變,這樣壹直遞歸直到所有的情況都被舉出。

六、動態規劃算法

動態規劃過程是:每次決策依賴於當前狀態,又隨即引起狀態的轉移。壹個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。

動態規劃算法適用於當某階段狀態給定以後,在這階段以後的過程的發展不受這段以前各段狀態的影響,即無後效性的問題。

典型例子比如說背包問題,給定背包容量及物品重量和價值,要求背包裝的物品價值最大。

  • 上一篇:指點江山什麽意思
  • 下一篇:八個涼菜八個熱菜菜譜
  • copyright 2024編程學習大全網