參考 : 演算法設計與分析 第三章 蠻力法
接下來的每章中,我們專注於一種特定的演算法設計策略。
蠻力法是一種最簡單和直接的解決問題的辦法,往往是低效的,但我們不應該忽略它的地位,
1)它可以解決廣闊領域的各種問題
2)在規模允許時,多少可以產生一些實用的演算法
3)往往可以以蠻力法為準繩,來衡量高效的演算法,或者找不到其他演算法時,先設計蠻力演算法,再做改進
好了,很簡單,直接切入正題。
3.1 選擇排序和氣泡排序
雖然很簡單,也寫了很多次了,複習一下,提請想一想:
1) 它們是穩定的排序方法嗎嗎?不穩定,穩定
2)改進:如果對列表比較一遍後發現沒有交換元素的位置,那麼此時列表已經有序,可以退出了
3.2 順序查詢和蠻力字串匹配
順序查詢不用說吧
蠻力字串匹配更不用說吧,kmp都寫過了
3.3 最近點對和凸包問題的蠻力演算法
由於在第四章中我們將用分治演算法來解最近點對問題和凸包問題,這裡主要明確一些概念吧,知道什麼是最近點對,凸包問題。
最近點對就沒有什麼說的了,說說凸包:
蠻力解凸包問題就是一條條的線段判斷,若其他所有頂點都在這條線段的同一側,則這條線段的2個端點是凸包的頂點,怎麼判斷是乙個解析幾何的數學問題,不說了。
凸包就不寫了,蠻力的,沒有什麼技術含量,就寫了個最近點對。在分治演算法中再來詳細分析怎樣設計更加精妙的方法。蠻力法的最近點對**:
package幾道習題的思考:section3;
/*第三章蠻力法 3.3 最近點對(蠻力)
*/public
class
nearestpoint
public
static
point nearestpoint(point p)
}
return
nearestpoints;}//
點座標private
static
class
point}}
1)對實在線n個點的x1,x2,.....xn的最近點對問題,能設計乙個比蠻力好的算發嗎? 排序後來解決,時間複雜度nlogn
3.4 窮舉查詢
舉幾個例子,在後面都將用其他演算法技術來解決,這裡不去實現
1)旅行商問題:在圖中找到一條哈公尺爾頓路(每個頂點只經過一次),使其代價最小
列舉所有路徑,比較
2)揹包問題
著名的計算機問題,有一篇博文揹包九講,後面再說
3)分配問題
後面介紹匈牙利方法
總結:除了一些規模較小的問題,蠻力法一般來說是不適用的,這一章也就是舉了幾個例子來說明這種思想而已,
一些常見的類似於智力題的東西,例如上面說到的問題,在規模較小時都可以用列舉,暴力,蠻力的方法,將一切交給計算機。另外一些典型的類似於智力問題的,比如什麼整數劃分,魔方填數,算術謎底什麼的,都可以列舉,當然,對於這些問題,偉大的數學家和計算機科學家們都給出了更為美妙和高效的演算法。這是後面要說的。
從下一章開始,介紹一些高階的演算法設計技術。
演算法設計與分析之蠻力法
蠻力法是指採用遍歷 掃瞄 技術,即採用一定的策略將待求解問題的所有元素依次處理一次,從而找出問題的解。依次處理所有元素是蠻力法的關鍵,為了避免陷入重複試探,應保證處理過的元素不再被處理。1 蠻力法 列舉法 窮舉法 暴力法 要求設計者找出所有可能的情況,然後選擇其中一種情況,若該情況不可行 或不是最優...
演算法分析與設計 蠻力法0 1揹包
蠻力法是一種簡單直接解決問題的方法,常常直接基於問題的描述,所以蠻力法也是最容易應用的方法。蠻力法所依賴 的基本技術是遍歷,即採用一定的策略依次處理待求解問題的所有元素,從而找出問題的解。由於其需要依次窮舉待處理的元素,因此蠻力法是一種典型的指數級時間演算法。給定n個重量為 價值為的物品和乙個容量為...
演算法設計之蠻力法
1.蠻力法 也叫窮舉法 是一種直接解決問題的方法,常常直接基於問題的描述和所涉及的概念及定義。2.蠻力法優點 邏輯清晰,相對於高效的 巧妙的演算法,實現和構思簡單。同時蠻力法也是很多高效演算法的基礎。可以作為其他高效演算法的衡量標準。對於一些重要的問題,它可以產生一些合理的演算法。可以解決一些小規模...