<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          5 個(gè)牛逼的算法設(shè)計(jì),你知道幾個(gè)?

          共 3229字,需瀏覽 7分鐘

           ·

          2021-03-14 10:40


          上一篇:3600萬(wàn)中國(guó)人在抖音“上清華”

          1、分治法

          概念:

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

          思想策略:

          對(duì)于一個(gè)規(guī)模為n的問(wèn)題,若該問(wèn)題可以容易地解決(比如說(shuō)規(guī)模n較小)則直接解決,否則將其分解為k個(gè)規(guī)模較小的子問(wèn)題,這些子問(wèn)題互相獨(dú)立且與原問(wèn)題形式相同,遞歸地解這些子問(wèn)題,然后將各子問(wèn)題的解合并得到原問(wèn)題的解。

          特征:

          1. 該問(wèn)題的規(guī)模縮小到一定的程度就可以容易地解決
          2. 該問(wèn)題可以分解為若干個(gè)規(guī)模較小的相同問(wèn)題,即該問(wèn)題具有最優(yōu)子結(jié)構(gòu)性質(zhì)。
          3. 利用該問(wèn)題分解出的子問(wèn)題的解可以合并為該問(wèn)題的解;
          4. 該問(wèn)題所分解出的各個(gè)子問(wèn)題是相互獨(dú)立的,即子問(wèn)題之間不包含公共的子子問(wèn)題。

          第一條特征是絕大多數(shù)問(wèn)題都可以滿足的,因?yàn)閱?wèn)題的計(jì)算復(fù)雜性一般是隨著問(wèn)題規(guī)模的增加而增加;

          第二條特征是應(yīng)用分治法的前提它也是大多數(shù)問(wèn)題可以滿足的,此特征反映了遞歸思想的應(yīng)用;

          第三條特征是關(guān)鍵,能否利用分治法完全取決于問(wèn)題是否具有第三條特征,如果具備了第一條和第二條特征,而不具備第三條特征,則可以考慮用貪心法或動(dòng)態(tài)規(guī)劃法。

          第四條特征涉及到分治法的效率,如果各子問(wèn)題是不獨(dú)立的則分治法要做許多不必要的工作,重復(fù)地解公共的子問(wèn)題,此時(shí)雖然可用分治法,但一般用動(dòng)態(tài)規(guī)劃法較好。

          基本步驟:

          1 分解:將原問(wèn)題分解為若干個(gè)規(guī)模較小,相互獨(dú)立,與原問(wèn)題形式相同的子問(wèn)題;

          2 解決:若子問(wèn)題規(guī)模較小而容易被解決則直接解,否則遞歸地解各個(gè)子問(wèn)題 

          3 合并:將各個(gè)子問(wèn)題的解合并為原問(wèn)題的解。

          適用分治法求解的經(jīng)典問(wèn)題:

          • 1)二分搜索
          • 2)大整數(shù)乘法
          • 3)Strassen矩陣乘法
          • 4)棋盤(pán)覆蓋
          • 5)合并排序
          • 6)快速排序
          • 7)線性時(shí)間選擇
          • 8)最接近點(diǎn)對(duì)問(wèn)題
          • 9)循環(huán)賽日程表
          • 10)漢諾塔

          2、動(dòng)態(tài)規(guī)劃

          概念:

          每次決策依賴于當(dāng)前狀態(tài),又隨即引起狀態(tài)的轉(zhuǎn)移。一個(gè)決策序列就是在變化的狀態(tài)中產(chǎn)生出來(lái)的,所以,這種多階段最優(yōu)化決策解決問(wèn)題的過(guò)程就稱為動(dòng)態(tài)規(guī)劃。

          思想策略:

          將待求解的問(wèn)題分解為若干個(gè)子問(wèn)題(階段),按順序求解子階段,前一子問(wèn)題的解,為后一子問(wèn)題的求解提供了有用的信息。

          在求解任一子問(wèn)題時(shí),列出各種可能的局部解,通過(guò)決策保留那些有可能達(dá)到最優(yōu)的局部解,丟棄其他局部解。

          依次解決各子問(wèn)題,最后一個(gè)子問(wèn)題就是初始問(wèn)題的解。

          特征:

          能采用動(dòng)態(tài)規(guī)劃求解的問(wèn)題的一般要具有3個(gè)性質(zhì):

          (1) 最優(yōu)化原理:如果問(wèn)題的最優(yōu)解所包含的子問(wèn)題的解也是最優(yōu)的,就稱該問(wèn)題具有最優(yōu)子結(jié)構(gòu),即滿足最優(yōu)化原理。

          (2) 無(wú)后效性:即某階段狀態(tài)一旦確定,就不受這個(gè)狀態(tài)以后決策的影響。也就是說(shuō),某狀態(tài)以后的過(guò)程不會(huì)影響以前的狀態(tài),只與當(dāng)前狀態(tài)有關(guān)。

          (3) 有重疊子問(wèn)題:即子問(wèn)題之間是不獨(dú)立的,一個(gè)子問(wèn)題在下一階段決策中可能被多次使用到。(該性質(zhì)并不是動(dòng)態(tài)規(guī)劃適用的必要條件,但是如果沒(méi)有這條性質(zhì),動(dòng)態(tài)規(guī)劃算法同其他算法相比就不具備優(yōu)勢(shì))

          基本步驟:

          (1)分析最優(yōu)解的性質(zhì),并刻畫(huà)其結(jié)構(gòu)特征。

          (2)遞歸的定義最優(yōu)解。

          (3)以自底向上或自頂向下的記憶化方式(備忘錄法)計(jì)算出最優(yōu)值 

          (4)根據(jù)計(jì)算最優(yōu)值時(shí)得到的信息,構(gòu)造問(wèn)題的最優(yōu)解

          適用動(dòng)態(tài)規(guī)劃求解的經(jīng)典問(wèn)題:

          • 矩陣連乘,
          • 走金字塔
          • 最長(zhǎng)公共子序列(LCS) ,
          • 最長(zhǎng)遞增子序列(LIS) ,
          • 凸多邊形最優(yōu)三角剖分 ,
          • 背包問(wèn)題 ,
          • 雙調(diào)歐幾里得旅行商問(wèn)題

          3、貪心法

          概念:

          在對(duì)問(wèn)題求解時(shí),總是做出在當(dāng)前看來(lái)是最好的選擇。也就是說(shuō),不從整體最優(yōu)上加以考慮,他所做出的僅是在某種意義上的局部最優(yōu)解。

          思想策略:

          貪心算法沒(méi)有固定的算法框架,算法設(shè)計(jì)的關(guān)鍵是貪心策略的選擇。必須注意的是,貪心算法不是對(duì)所有問(wèn)題都能得到整體最優(yōu)解,選擇的貪心策略必須具備無(wú)后效性,即某個(gè)狀態(tài)以后的過(guò)程不會(huì)影響以前的狀態(tài),只與當(dāng)前狀態(tài)有關(guān)。所以對(duì)所采用的貪心策略一定要仔細(xì)分析其是否滿足無(wú)后效性。

          基本步驟:

          1. 建立數(shù)學(xué)模型來(lái)描述問(wèn)題。

          2. 把求解的問(wèn)題分成若干個(gè)子問(wèn)題。

          3. 對(duì)每一子問(wèn)題求解,得到子問(wèn)題的局部最優(yōu)解。

          4. 把子問(wèn)題的解局部最優(yōu)解合成原來(lái)解問(wèn)題的一個(gè)解。

          適用貪心法求解的經(jīng)典問(wèn)題:

          • 活動(dòng)選擇問(wèn)題,
          • 錢(qián)幣找零問(wèn)題,
          • 再論背包問(wèn)題,
          • 小船過(guò)河問(wèn)題,
          • 區(qū)間覆蓋問(wèn)題,
          • 銷(xiāo)售比賽,
          • Huffman編碼,
          • Dijkstra算法(求解最短路徑),
          • 最小生成樹(shù)算法

          4、回溯法

          概念:

          回溯算法實(shí)際上一個(gè)類(lèi)似枚舉的搜索嘗試過(guò)程,主要是在搜索嘗試過(guò)程中尋找問(wèn)題的解,當(dāng)發(fā)現(xiàn)已不滿足求解條件時(shí),就“回溯”返回,嘗試別的路徑。回溯法是一種選優(yōu)搜索法,按選優(yōu)條件向前搜索,以達(dá)到目標(biāo)。

          但當(dāng)探索到某一步時(shí),發(fā)現(xiàn)原先選擇并不優(yōu)或達(dá)不到目標(biāo),就退回一步重新選擇,這種走不通就退回再走的技術(shù)為回溯法,而滿足回溯條件的某個(gè)狀態(tài)的點(diǎn)稱為“回溯點(diǎn)”。

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

          思想策略:

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

          特征:

          (1)針對(duì)所給問(wèn)題,確定問(wèn)題的解空間:首先應(yīng)明確定義問(wèn)題的解空間,問(wèn)題的解空間應(yīng)至少包含問(wèn)題的一個(gè)(最優(yōu))解。

          (2)確定結(jié)點(diǎn)的擴(kuò)展搜索規(guī)則 

          (3)以深度優(yōu)先方式搜索解空間,并在搜索過(guò)程中用剪枝函數(shù)避免無(wú)效搜索。

          適用回溯法求解的經(jīng)典問(wèn)題:

          • 八皇后問(wèn)題,
          • 圖的著色問(wèn)題,
          • 裝載問(wèn)題,
          • 批處理作業(yè)調(diào)度問(wèn)題,
          • 再再論背包問(wèn)題,
          • 最大團(tuán)問(wèn)題,
          • 連續(xù)郵資問(wèn)題,
          • 符號(hào)三角形問(wèn)題,

          5、分支限界法

          概述:

          類(lèi)似于回溯法,也是一種在問(wèn)題的解空間樹(shù)T上搜索問(wèn)題解的算法。但在一般情況下,分支限界法與回溯法的求解目標(biāo)不同。

          回溯法的求解目標(biāo)是找出T中滿足約束條件的所有解,而分支限界法的求解目標(biāo)則是找出滿足約束條件的一個(gè)解,或是在滿足約束條件的解中找出使某一目標(biāo)函數(shù)值達(dá)到極大或極小的解,即在某種意義下的最優(yōu)解。

          策略:

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

          與回溯法的區(qū)別:

          回溯法:【方式不同】深度優(yōu)先搜索堆棧活結(jié)點(diǎn)的所有可行子結(jié)點(diǎn)被遍歷后才被從棧中彈出找出滿足約束條件的所有解【目標(biāo)不同】。

          分支限界法:【方式不同】廣度優(yōu)先或最小消耗優(yōu)先搜索隊(duì)列、優(yōu)先隊(duì)列每個(gè)結(jié)點(diǎn)只有一次成為活結(jié)點(diǎn)的機(jī)會(huì)找出滿足約束條件的一個(gè)解或特定意義下的最優(yōu)解【目標(biāo)不同】。

          本文鏈接:https://blog.csdn.net/ght886/article/details/80289142


          關(guān)注微信公眾號(hào):互聯(lián)網(wǎng)架構(gòu)師,在后臺(tái)回復(fù):2T,可以獲取我整理的教程,都是干貨。


          猜你喜歡

          1、GitHub 標(biāo)星 3.2w!史上最全技術(shù)人員面試手冊(cè)!FackBoo發(fā)起和總結(jié)

          2、如何才能成為優(yōu)秀的架構(gòu)師?

          3、從零開(kāi)始搭建創(chuàng)業(yè)公司后臺(tái)技術(shù)棧

          4、程序員一般可以從什么平臺(tái)接私活?

          5、37歲程序員被裁,120天沒(méi)找到工作,無(wú)奈去小公司,結(jié)果懵了...

          6、滴滴業(yè)務(wù)中臺(tái)構(gòu)建實(shí)踐,首次曝光

          7、不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵(lì)志故事

          8、15張圖看懂瞎忙和高效的區(qū)別

          9、2T架構(gòu)師學(xué)習(xí)資料干貨分享


          瀏覽 40
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  免费黄色1级毛片。 | 三级理论网站 | 在线中文字幕亚洲三级片 | 婷婷激情视频在线播放 | 大吊操黑B |