1. 程式人生 > >算法設計與分析報告

算法設計與分析報告

斐波那契數 n-1 整數 部分 記得 出現問題 表示 nbsp 意義

  這門課主要講了貪心、遞歸、回溯、分支定界、動態規劃等幾種算法。

  在進行學習之前有做過相關題目,所以在聽課的時候感覺好理解了許多。沒學這門課的時候總是想因為沒學ACM課感到惋惜。

  1.貪心算法

    貪心算法算是DP問題的一個分支了。確定貪心思路,確定貪心標準是其核心。貪心算法的特點在於通過局部最優達到總體最優。也可以理解貪心算法並不是從總體上考慮,它所做出的選擇只是在某種意義上的局部最優解算法。

    從全局來看,貪心算法只是每一步都確定當前最優的選擇然後進行下一步的選擇,並沒有回溯過程。所以後面的每一步都是當前看似最佳的選擇並不一定能產生整體的最優,這就限制了它只能適用於部分問題的解決。

    貪心算法雖然局限性比較大,但是思慮清晰,運算容易。貪心類的題目,按照一定的貪心標準求解時出現問題則要考慮是否是貪心標準有誤。考慮是否缺少某種情況和是否需要更換貪心標準。

    貪心算法可適用於以下幾種問題:

      1.背包問題:給定背包容量M,n件物品,物品有屬性體積Wi,價值Vi,使得背包所裝價值最大。以體積W或者以價值V作為貪心的標準均有缺陷。那麽性價比則是最合適的貪心標準。

      2.最優裝載問題: 有一批集裝箱要裝到一艘重量為c的輪船,其中集裝箱i的重量為wi,最優裝載問題要求確定在裝載體積不受限制的情況下,盡可能多的集裝箱裝上輪船。

      3.連續最值子和問題:(大)給定數組A[ ],求該數組的連續子和的最大值?

      4.最短路徑問題

      .......

  2.遞歸算法

    說實話,我感覺遞歸算法是最高深最有操作的一種算法。為什麽這麽說?DFS算法也可以看成一種遞歸。而且遞歸也可以用來DP,記得Project Euler做過一道題,題意大體是:給定一個整數n,n可以被表示為下述多種情況

        1+1+1+1+.....+1(n個1相加)

        2+1+1+.....+1

        2+2+.....+1

        .......

        (n-1)+1

        n

    也就是說n可以被表示成任意個正整數的和,求可以被表示的情況數。每個階段都是在拆分n, n-1和1,n-2和2........n-x和x。拆成n-x和x的時候,計算n-x的情況數和x的情況數。很討厭的一道題。可不得不說,遞歸就是牛。還有一道數乘積的問題,也是用遞歸求解,像這種題目做起來應該會不好受。

    話說回來,遞歸算法就是在函數體內重復調用該函數。所以一定要先想好思路,遞歸的出口、滿足各種條件該進行的操作。

    遞歸操作有不少,有許多普通操作和“騷操作“,像一些普通的數學公式、斐波那契數列、階乘或回溯。這類一眼大體能看出來的就比較容易想,不太會迷糊。確定出口就可以了。所謂的“騷操作”就比如上述的例子。情況多變,求解特別復雜的那種。

    設計思路:

      遞歸算法的設計思路就是要解決一個規模為n的問題,先看規模為n-1(或者n-k或者n/2,總之是比原問題規模小)的問題是否和原問題有同樣的性質,如果性質相同,那這個問題應該可以用遞歸算法解決。

算法設計與分析報告