日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

算法范式

發(fā)布時間:2023/11/22 综合教程 22 生活家
生活随笔 收集整理的這篇文章主要介紹了 算法范式 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

算法:按步驟解決問題的過程。

An algorithm is a step-by-step procedure for solving a problem.

范式:思考問題的模式。

"Pattern of thought" which governs scientific apprehension during a certain period of time.

算法范式:為問題構(gòu)建高效解決方案的常規(guī)方法。

General approaches to the construction of efficient solutions to problems。

算法范式可以被看做為解決一類問題的高層算法。

  • 算法范式提供的模板可適用于解決更廣泛的問題。
  • 通過最高層的語言可以將范式轉(zhuǎn)換成通用的組件或數(shù)據(jù)結(jié)構(gòu)。
  • 對算法產(chǎn)生結(jié)果所需的時間和空間的需求可以做精確的分析。

常見的算法范式有:

  • 暴力破解法(Brute Force Paradigm)
  • 分治法(Divide and Conquer Paradigm)
  • 動態(tài)規(guī)劃法(Dynamic Programming Paradigm)
  • 貪心算法(Greedy Paradigm)
  • 回溯法(Backtracking Paradigm)
  • 分支限界法(Branch and Bound?Paradigm)

暴力破解法(Brute Force Paradigm)

暴力破解法簡單直接,根據(jù)問題聲明的定義,找到所有可變化的因子(Divisor),窮舉所有可能解決問題的方法,逐個嘗試。

所以,根據(jù)暴力破解法的定義,理論上講任何問題都可以使用暴力破解法來解決,只是在實際應(yīng)用中算法對時間和空間的需求則無法滿足。

將暴力破解法應(yīng)用于數(shù)據(jù)查找,由于查找比較次數(shù)與給定目標(biāo)的規(guī)模直接相關(guān),所以也稱為線性查找(Linear Search)。

線性查找有很多典型應(yīng)用:

  • 選擇排序(Selection Sort)
  • 冒泡排序(Bubble Sort)
  • 順序查找(Sequential Search)
  • 暴力字符串匹配(Naive String Match)

分治法(Divide and Conquer Paradigm)

分治法(Divide-and-Conquer),即 "分而治之",是將原問題劃分成 n 個規(guī)模較小而結(jié)構(gòu)與原問題相似的子問題,遞歸地解決這些問題,然后再合并其結(jié)果,以得到原問題的解。

當(dāng)我們遇到一個大問題時,總是習(xí)慣把問題的規(guī)模變小,這樣便于分析討論。這些規(guī)模變小后的問題和原來的問題是同質(zhì)的,除了規(guī)模變小,其它的都是一樣的,本質(zhì)上它還是同一個問題,規(guī)模變小后的問題其實是原問題的子問題。

分治模式在每一層上都有三個步驟:

  1. 分解(Divide):將原問題分解成一系列與原問題同質(zhì)的子問題;
  2. 解決(Conquer):遞歸地解決各個子問題。若子問題足夠小,則直接求解;
  3. 合并(Combine):將子問題的結(jié)果合并成原問題的解。

分治法所能解決的問題一般具有以下幾個特征:

  1. 可以將問題分解為若干個規(guī)模較小的相同問題;
  2. 問題的規(guī)模縮小到一定程度后就可以很容易地解決;
  3. 問題分解出的子問題的解可以合并為該問題的解;
  4. 問題所分解出的各個子問題是相互獨立的,即子問題之間不再包含公共的孫問題。

符合 1,2,3 條特征是使用分治法的關(guān)鍵,而特征 4 將涉及到分治法的效率問題。而如果不符合 3,4 特征的問題可以嘗試考慮使用動態(tài)規(guī)劃或貪心算法來解決。

分治法的典型應(yīng)用:

  • 合并排序(Merge Sort)
  • 快速排序(Quick Sort)
  • 二分查找(Binary Search)

動態(tài)規(guī)劃法(Dynamic Programming Paradigm)

動態(tài)規(guī)劃的過程可以描述為多階段最優(yōu)化解決問題的過程,每一次的決策依賴于當(dāng)前的狀態(tài),隨即又引起狀態(tài)的轉(zhuǎn)移,以此類推在變化的狀態(tài)中產(chǎn)生出決策序列。

動態(tài)規(guī)劃算法通常基于一個遞推公式及一個或多個初始狀態(tài),當(dāng)前子問題的解將由上一次子問題的解推出。使用動態(tài)規(guī)劃來解題通常只需要多項式時間復(fù)雜度,所以會比回溯法、暴力法等要快許多。

動態(tài)規(guī)劃方法中的關(guān)鍵詞包括:階段(Stage)、狀態(tài)(State)、決策(Decision)、遞推關(guān)系(Recurrent Relation)。

動態(tài)規(guī)劃首先將待求解的問題分解為若干個子問題(階段),按順序求解子問題。前一子問題的解為后一子問題的求解提供了有用的信息。在求解任一子問題時,列出各種可能的局部解,通過決策保留那些有可能達(dá)到最優(yōu)的局部解,丟棄其他局部解。以此類推解決各子問題,最后一個子問題的解就是初始問題的解。

動態(tài)規(guī)劃與分治法最大的差別是:適合于用動態(tài)規(guī)劃法求解的問題,經(jīng)分解后得到的子問題往往不是互相獨立的(即下一個子問題的求解是建立在上一個子問題的解的基礎(chǔ)上,進(jìn)行進(jìn)一步的求解)。

動態(tài)規(guī)劃所能解決的問題一般具有以下幾個特征:

  1. 最優(yōu)化原理(Mathematical Optimization):如果問題的最優(yōu)解所包含的子問題的解也是最優(yōu)的,就稱該問題具有最優(yōu)子結(jié)構(gòu)(Optimal Substructure),即滿足最優(yōu)化原理。
  2. 無后效性:即某階段狀態(tài)一旦確定,就不受這個狀態(tài)以后決策的影響。也就是說,某狀態(tài)以后的過程不會影響以前的狀態(tài),只與當(dāng)前狀態(tài)有關(guān)。
  3. 有重疊子問題(Overlapping Subproblems):即子問題之間是不獨立的,一個子問題在下一階段決策中可能被多次使用到。

特征 3 并不是動態(tài)規(guī)劃適用的必要條件,但是如果沒有這條性質(zhì),動態(tài)規(guī)劃算法同其他算法相比就不具備優(yōu)勢。

動態(tài)規(guī)劃的基本步驟:

  1. 劃分階段:按照問題的時間或空間特征,把問題分為若干個階段。注意劃分后的階段一定要是有序的或者是可排序的,否則問題就無法求解。
  2. 確定狀態(tài)和狀態(tài)變量:將問題發(fā)展到各個階段時所處于的各種客觀情況用不同的狀態(tài)表示出來。狀態(tài)的選擇要滿足無后效性。
  3. 確定決策并寫出狀態(tài)轉(zhuǎn)移方程:因為決策和狀態(tài)轉(zhuǎn)移有著天然的聯(lián)系,狀態(tài)轉(zhuǎn)移就是根據(jù)上一階段的狀態(tài)和決策來導(dǎo)出本階段的狀態(tài)。所以如果確定了決策,狀態(tài)轉(zhuǎn)移方程也就可寫出。但事實上常常是反過來做,根據(jù)相鄰兩個階段的狀態(tài)之間的關(guān)系來確定決策方法和狀態(tài)轉(zhuǎn)移方程。
  4. 尋找邊界條件:給出的狀態(tài)轉(zhuǎn)移方程是一個遞推式,需要一個遞推的終止條件或邊界條件。

貪心算法(Greedy Paradigm)

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

貪心算法沒有固定的算法框架,算法設(shè)計的關(guān)鍵是貪心策略的選擇。貪心策略適用的前提是:局部最優(yōu)策略能導(dǎo)致產(chǎn)生全局最優(yōu)解。所以實際上,貪心算法適用的情況很少。

貪心算法不是對所有問題都能得到整體最優(yōu)解,選擇的貪心策略必須具備無后效性,即某個狀態(tài)以后的過程不會影響以前的狀態(tài),只與當(dāng)前狀態(tài)有關(guān)。所以對所采用的貪心策略一定要仔細(xì)分析其是否滿足無后效性。

貪心算法的基本思路:

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

回溯法(Backtracking Paradigm)

回溯法描述了一種選優(yōu)搜索過程,按選優(yōu)條件向前搜索,以達(dá)到目標(biāo)。但當(dāng)探索到某一步時,發(fā)現(xiàn)原先的選擇并不優(yōu)或達(dá)不到目標(biāo),就退回一步重新選擇,這種走不通就退回再走的方法稱為回溯法,而滿足回溯條件的某個狀態(tài)的點稱為 "回溯點"。

回溯法可以理解為隱式的深度優(yōu)先搜索算法。其在包含問題的所有解的解空間樹中,按照深度優(yōu)先搜索的策略,從根節(jié)點出發(fā)深度探索解空間樹。當(dāng)探索到某一節(jié)點時,要先判斷該節(jié)點是否包含問題的解,如果包含,就從該節(jié)點出發(fā)繼續(xù)探索下去,如果該節(jié)點不包含問題的解,則逐層向其祖先節(jié)點回溯。

許多復(fù)雜的,規(guī)模較大的問題都可以使用回溯法,有 "通用解題方法" 的美稱。

回溯法的一般步驟:

  1. 針對給定問題,確定問題的解空間,問題的解空間應(yīng)至少包含問題的一個(最優(yōu))解;
  2. 確定節(jié)點的擴(kuò)展搜索規(guī)則;
  3. 以深度優(yōu)先方式搜索解空間,并在搜索過程中用剪枝函數(shù)避免無效搜索;

分支限界法(Branch and Bound Paradigm)

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

所謂 "分支" 就是采用廣度優(yōu)先搜索算法,依次搜索節(jié)點的所有分支,拋棄不滿足約束條件的節(jié)點,然后從余下的節(jié)點中選擇一個節(jié)點作為下一個搜索節(jié)點繼續(xù)搜索。

由于求解目標(biāo)不同,導(dǎo)致分支限界法與回溯法在解空間樹上的搜索方式也不相同。回溯法以深度優(yōu)先的方式搜索解空間樹,而分支限界法則以廣度優(yōu)先或以最小耗費優(yōu)先的方式搜索解空間樹。

分支限界法的搜索策略是:在擴(kuò)展節(jié)點處,先生成其所有的兒子節(jié)點(分支),然后再從當(dāng)前的活節(jié)點表中選擇下一個擴(kuò)展節(jié)點。為了有效地選擇下一擴(kuò)展節(jié)點,以加速搜索的進(jìn)程,在每一活節(jié)點處,計算一個函數(shù)值(限界),并根據(jù)這些已計算出的函數(shù)值,從當(dāng)前活節(jié)點表中選擇一個最有利的節(jié)點作為擴(kuò)展節(jié)點,使搜索朝著解空間樹上有最優(yōu)解的分支推進(jìn),以便盡快地找出一個最優(yōu)解。

參考資料

  • 動態(tài)規(guī)劃:從新手到專家
  • 動態(tài)規(guī)劃之背包問題
  • 最長遞增子序列 O(NlogN)算法
  • 五大常用算法之一:分治算法
  • 五大常用算法之二:動態(tài)規(guī)劃算法
  • 五大常用算法之三:貪心算法
  • 五大常用算法之四:回溯法
  • 五大常用算法之五:分支限界法
  • 通過金礦模型介紹動態(tài)規(guī)劃
  • 漫談算法(三)NP問題
  • 基礎(chǔ)算法系列總結(jié):動態(tài)規(guī)劃
  • 基礎(chǔ)算法系列總結(jié):貪心算法
  • 基礎(chǔ)算法系列總結(jié):回溯算法
  • 基礎(chǔ)算法系列總結(jié):分支限界算法
  • Dynamic Programming | Set 1 (Overlapping Subproblems Property)
  • Dynamic Programming | Set 2 (Optimal Substructure Property)
  • Dynamic Programming | Set 3 (Longest Increasing Subsequence)
  • Dynamic Programming | Set 4 (Longest Common Subsequence)
  • Dynamic Programming | Set 5 (Edit Distance)
  • Dynamic Programming | Set 6 (Min Cost Path)
  • 6.006- Introduction to Algorithms - Lecture 18

總結(jié)

以上是生活随笔為你收集整理的算法范式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。