5 個牛逼的算法設計思想,你知道幾個?

分治法

概念:

將一個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。

思想策略:

對於一個規模爲n的問題,若該問題可以容易地解決(比如說規模n較小)則直接解決,否則將其分解爲k個規模較小的子問題,這些子問題互相獨立且與原問題形式相同,遞歸地解這些子問題,然後將各子問題的解合併得到原問題的解。

特徵:

  1. 該問題的規模縮小到一定的程度就可以容易地解決
  2. 該問題可以分解爲若干個規模較小的相同問題,即該問題具有最優子結構性質。
  3. 利用該問題分解出的子問題的解可以合併爲該問題的解;
  4. 該問題所分解出的各個子問題是相互獨立的,即子問題之間不包含公共的子子問題。

第一條特徵是絕大多數問題都可以滿足的,因爲問題的計算複雜性一般是隨着問題規模的增加而增加; 第二條特徵是應用分治法的前提它也是大多數問題可以滿足的,此特徵反映了遞歸思想的應用;、 第三條特徵是關鍵,能否利用分治法完全取決於問題是否具有第三條特徵,如果具備了第一條和第二條特徵,而不具備第三條特徵,則可以考慮用貪心法或動態規劃法。 第四條特徵涉及到分治法的效率,如果各子問題是不獨立的則分治法要做許多不必要的工作,重複地解公共的子問題,此時雖然可用分治法,但一般用動態規劃法較好。

基本步驟:

1 分解:將原問題分解爲若干個規模較小,相互獨立,與原問題形式相同的子問題; 2 解決:若子問題規模較小而容易被解決則直接解,否則遞歸地解各個子問題 3 合併:將各個子問題的解合併爲原問題的解。

適用分治法求解的經典問題:

  • 1)二分搜索
  • 2)大整數乘法
  • 3)Strassen矩陣乘法
  • 4)棋盤覆蓋
  • 5)合併排序
  • 6)快速排序
  • 7)線性時間選擇
  • 8)最接近點對問題
  • 9)循環賽日程表
  • 10)漢諾塔

動態規劃

概念:

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

思想策略:

將待求解的問題分解爲若干個子問題(階段),按順序求解子階段,前一子問題的解,爲後一子問題的求解提供了有用的信息。在求解任一子問題時,列出各種可能的局部解,通過決策保留那些有可能達到最優的局部解,丟棄其他局部解。依次解決各子問題,最後一個子問題就是初始問題的解。

特徵:

能採用動態規劃求解的問題的一般要具有3個性質: (1) 最優化原理:如果問題的最優解所包含的子問題的解也是最優的,就稱該問題具有最優子結構,即滿足最優化原理。 (2) 無後效性:即某階段狀態一旦確定,就不受這個狀態以後決策的影響。也就是說,某狀態以後的過程不會影響以前的狀態,只與當前狀態有關。 (3)有重疊子問題:即子問題之間是不獨立的,一個子問題在下一階段決策中可能被多次使用到。(該性質並不是動態規劃適用的必要條件,但是如果沒有這條性質,動態規劃算法同其他算法相比就不具備優勢)

基本步驟:

(1)分析最優解的性質,並刻畫其結構特徵。 (2)遞歸的定義最優解。 (3)以自底向上或自頂向下的記憶化方式(備忘錄法)計算出最優值 (4)根據計算最優值時得到的信息,構造問題的最優解

適用動態規劃求解的經典問題:

  • 矩陣連乘,
  • 走金字塔
  • 最長公共子序列(LCS) ,
  • 最長遞增子序列(LIS) ,
  • 凸多邊形最優三角剖分 ,
  • 揹包問題 ,
  • 雙調歐幾里得旅行商問題

貪心法

概念:

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

思想策略:

貪心算法沒有固定的算法框架,算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無後效性,即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。所以對所採用的貪心策略一定要仔細分析其是否滿足無後效性。

基本步驟:

1.建立數學模型來描述問題。 2.把求解的問題分成若干個子問題。 3.對每一子問題求解,得到子問題的局部最優解。 4.把子問題的解局部最優解合成原來解問題的一個解。

適用貪心法求解的經典問題:

  • 活動選擇問題,
  • 錢幣找零問題,
  • 再論揹包問題,
  • 小船過河問題,
  • 區間覆蓋問題,
  • 銷售比賽,
  • Huffman編碼,
  • Dijkstra算法(求解最短路徑),
  • 最小生成樹算法

回溯法

概念:

回溯算法實際上一個類似枚舉的搜索嘗試過程,主要是在搜索嘗試過程中尋找問題的解,當發現已不滿足求解條件時,就“回溯”返回,嘗試別的路徑。 回溯法是一種選優搜索法,按選優條件向前搜索,以達到目標。但當探索到某一步時,發現原先選擇並不優或達不到目標,就退回一步重新選擇,這種走不通就退回再走的技術爲回溯法,而滿足回溯條件的某個狀態的點稱爲“回溯點”。 許多複雜的,規模較大的問題都可以使用回溯法,有“通用解題方法”的美稱。

思想策略:

在包含問題的所有解的解空間樹中,按照深度優先搜索的策略,從根結點出發深度探索解空間樹。當探索到某一結點時,要先判斷該結點是否包含問題的解,如果包含,就從該結點出發繼續探索下去,如果該結點不包含問題的解,則逐層向其祖先結點回溯。(其實回溯法就是對隱式圖的深度優先搜索算法)。 若用回溯法求問題的所有解時,要回溯到根,且根結點的所有可行的子樹都要已被搜索遍才結束。

特徵:

(1)針對所給問題,確定問題的解空間:首先應明確定義問題的解空間,問題的解空間應至少包含問題的一個(最優)解。 (2)確定結點的擴展搜索規則 (3)以深度優先方式搜索解空間,並在搜索過程中用剪枝函數避免無效搜索。

適用回溯法求解的經典問題:

  • 八皇后問題,
  • 圖的着色問題,
  • 裝載問題,
  • 批處理作業調度問題,
  • 再再論揹包問題,
  • 最大團問題,
  • 連續郵資問題,
  • 符號三角形問題,

分支限界法

概述:

類似於回溯法,也是一種在問題的解空間樹T上搜索問題解的算法。但在一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出T中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的一個解,或是在滿足約束條件的解中找出使某一目標函數值達到極大或極小的解,即在某種意義下的最優解。

策略:

在擴展結點處,先生成其所有的兒子結點(分支),然後再從當前的活結點表中選擇下一個擴展對點。爲了有效地選擇下一擴展結點,以加速搜索的進程,在每一活結點處,計算一個函數值(限界),並根據這些已計算出的函數值,從當前活結點表中選擇一個最有利的結點作爲擴展結點,使搜索朝着解空間樹上有最優解的分支推進,以便儘快地找出一個最優解。

與回溯法的區別:

回溯法:【方式不同】深度優先搜索堆棧活結點的所有可行子結點被遍歷後才被從棧中彈出找出滿足約束條件的所有解【目標不同】。

分支限界法:【方式不同】廣度優先或最小消耗優先搜索隊列、優先隊列每個結點只有一次成爲活結點的機會找出滿足約束條件的一個解或特定意義下的最優解【目標不同】。

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。本文鏈接:https://blog.csdn.net/ght886/article/details/80289142 近期熱文推薦:

1.600+ 道 Java面試題及答案整理(2021最新版)

2.終於靠開源項目弄到 IntelliJ IDEA 激活碼了,真香!

3.阿里 Mock 工具正式開源,幹掉市面上所有 Mock 工具!

4.Spring Cloud 2020.0.0 正式發佈,全新顛覆性版本!

5.《Java開發手冊(嵩山版)》最新發布,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章