1. 程式人生 > >算法的設計基本方法的理解

算法的設計基本方法的理解

算法的設計基本方法的理解

  1. 算法設計基本方法有什麽好處?

    了解常見的算法設計方法以及它們之間的區別,有利於構建算法思維的廣度,有充分的理論知識。當然,如果算法思維的深度再好的話,將來你見識的算法越多,天下之間所有的算法,都會融入到你的理論和實踐當中。

  2. 常見算法分類

    窮舉法(暴力法,蠻力法)它的基本思想是分別列出所有各種可能解,測試其是否滿足條件,若是則輸出。

    回溯法:有通用的解題法之稱,是一種將問題的所有解組織的僅僅有條,能避免不必要的窮舉搜索,采用的思維是,深度遍歷,中間再加兩個約束條件和限界函數,不行就回溯,轉其他結點,繼續深度優先。

    遞推法:分為兩種,一種是順推,另外一種是逆推,都是根據已知條件,推導出未知條件。

    叠代法輾轉法

    ):是一種不斷用變量的舊值遞推新值的過程,跟叠代法相對應的是直接法,即一次性解決問題。叠代法又分為精確叠代和近似叠代。“二分法”和“牛頓叠代法”屬於近似叠代法。叠代算法是用計算機解決問題的一種基本方法。它利用計算機運算速度快、適合做重復性操作的特點,讓計算機對一組指令(或一定步驟)進行重復執行,在每次執行這組指令(或這些步驟)時,都從變量的原值推出它的一個新值。叠代法常常用於求方程或方程組近似根,在設計叠代式時,要特別註意收斂問題,對於非收斂的式子不能用作叠代式。

遞歸法:是指在定義自身的同時又出現了對自身的調用,在一個函數內直接調用自己,則稱為直遞歸函數,如果函數經過一系列調用的語句,通過其他函數間接調用自己,則其稱為間接遞歸。不斷的通過將一個大問題,轉化為一個規模小的問題,將規模小的問題,在轉換成更規模小的問題,遞歸有時候可以理解成嵌套中的嵌套。小問題,解決好了,向上返回結果,通常在遞歸的時候,有遞歸和非遞歸說法,非遞歸需要借助棧。遞歸法是很多其他高級算法的基礎。

分治法就是把一個復雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合並。

貪婪法:總是做出在當前看來最好的選擇,也就是說,貪心算法並不從整體最優考慮,它所做的選擇只是在某種意義上的局部最優選擇。當然,希望貪心算法得到的最終結果也是整體最優的,雖然貪心算法不能對所有問題得到整體最優解,但對許多問題能產生整體最優解。

動態規劃法:動態規劃法與分治法和回溯法都有某些類似,也是基於問題的劃分解決(多步決策,遞增生成子解)的。但是在遞增生成子解的過程中,力圖朝最優方向進行,而且也不回溯。因此動態規劃法效率更高,且常用來求最優解,而不像回溯法那樣可直接求全解。

只從過程來看,可以簡單地把動態規劃法看做是回溯法去掉了回溯(這個可以容易理解)或者嚴格叠代分治法。這個怎麽理解,也就是說,把一個問題的解決分成多個步驟(分治法),每個步驟都是在前面的步驟基礎上,得到一個新的子解,字解隨著步驟的進行,進而逐步擴大,最後一步得到完整的解。

模擬法:通常都是利用隨機函數來模擬自然界中發生的不可預測的情況。Java中random,c中srand

3.常見算法之間的區別

1)分治法和動態規劃算法的區別

動態規劃算法在遇到重疊子問題顯示出了相當大的優勢,如果這個問題沒有重疊子問題,可以考慮分治法,如果有重疊子問題,動態規劃算法效率更高。

2)貪心發和動態規劃法的區別

個人感覺貪心發是動態規劃算法的一個特例,都具有最優子結構特征。

3)回溯法和窮舉法的區別

都是生成解空間,回溯法一般主要用來解決三類問題(子集問題,排列問題,組合問題)回溯法,多了約束條件和限界條件,因此避免了無謂的搜索。

4)回溯法和遞歸法的區別?

5)動態規劃和貪心算法以及回溯法的區別

,這些方法所要解決的問題,一般都是決策問題。而貪心法一般是來求解最優問題的,而且他們其實都是在對問題的狀態空間樹進行搜索,在這個狀態空間樹中搜索最佳的路徑以便求出最優策略。而貪心法是從上到下只進行深度搜索的,也就是說它是一口氣走到黑的,一口氣吃成胖子的,它的代價取決於子問題的數目,也就是樹的高度,每次在當前問題的狀態上作出的選擇都是1,也就是說,它其實是不進行廣度搜索的,這也造成了它的一個缺點:它得出的解不一定是最優解,很有可能是近似最優解。

動態規劃法在最優子結構的前提下,從狀態空間樹的葉子節點開始向上進行搜索,並且在每一步都根據葉子節點的當前問題的狀況作出選擇,從而作出最優決策,所以她的代價就是子問題的個數和可選擇的數目,所以它求出的解一定是最優解。

相比回溯法它它去掉了回溯的過程,因而效率較高。

4.解決問題的思路

1.如果這個問題不好求得,就將其轉換成另外一個問題,比如數學當中的往往求最優化問題,將其轉化為對偶問題,計算機中,交通燈問題,將其轉換成圖的找色問題。最短路徑問題,轉換成借電腦問題;你要班級中借5臺電腦,你肯定將你關系好的人,排個序,然後從最好的人去接,第二步就是將你第二關系好的人,和讓你第一關系好多人幫你借電腦,第三就是讓你第三關系好的人和你第二關系好的人和他關系好的人以及他的第二關系好的人去向他第一個關系好的人借電腦。

2.如果這個問題可以容易解,那就可以使用很多種方法去解。

本文出自 “簡答生活” 博客,謝絕轉載!

算法的設計基本方法的理解