貪心演算法經典例子

2021-09-24 20:59:43 字數 1358 閱讀 8140

貪心演算法總是作出在當前看來最好的選擇。也就是說貪心演算法並不從整體最優考慮,它所作出的選擇只是在某種意義上的區域性最優選擇。

基本思想:貪心演算法並不從整體最優上加以考慮,它所做的選擇只是在某種意義上的區域性最優解。

基本要素:最優子結構性質和貪心選擇性質。

和動態規劃區別:

動態規劃演算法中,每步所做的選擇往往依賴於相關子問題的解,因而只有在解出相關子問題時才能做出選擇。而貪心演算法,僅在當前狀態下做出最好選擇,即區域性最優選擇,然後再去解做出這個選擇後產生的相應的子問題。

字首碼:對每乙個字元規定乙個0,1串作為其**,並要求任一字元的**都不是其他字元**的字首。

可以用二叉樹作為字首碼的資料結構:樹葉表示給定字元;從樹根到樹葉的路徑當作該字元的字首碼,如下:

問題:哈夫曼提出構造最優字首碼的貪心演算法,由此產生的編碼方案稱為哈夫曼編碼。

解決思路:

過程如下:

帶權路徑:wpl = 41 + 123 + 133 + 163 + 54 + 94

問題:給定帶權有向圖g=(v,e),其中每條邊的權都是非負數。給定乙個起始頂點,成為源。計算從源到所有其他定點的最短路徑長度。路徑長度是各邊權重之和。該問題稱為單源最短路徑問題。

解題思路:

dijkstra演算法(迪傑斯特拉演算法)是解單源最短路徑問題的貪心演算法。

步驟:(1)建立頂點集合 s ,初始只包含源點;設 u 為貪心選擇的頂點,不斷將 u 新增到 s 中。

(2)建立陣列 dist[i],存源到 i 點的距離。若源與點 i 直接相連,則 dist[i] 等於權重,若源與 i 不直接相連,則 dist[i]=∞。

(3)選取最小的 dist[i] 對應的頂點 u 存入到 s 中。根據 s 中的頂點更新 dist[i]。

(4)重複(3)步驟,直到 s 包含所有頂點時,結束演算法。

問題:在乙個有權連通圖中,生成樹的各邊權值之和稱為生成樹的代價。在網路的所有生成樹中,權值最小的那顆生成樹稱為最小代價生成樹,簡稱為最小生成樹。討論問題就是如何尋找一顆各邊權的總和最小的生成樹。

解決思路:

貪心演算法經典問題 硬幣找零

這是乙個用最少硬幣支付指定額度的問題。一 問題描述 如下圖圖一,設有6種不同面值的硬幣,各硬幣的面值分別為5分 1角 2角 5角 1元 2元。現要用這些面值的硬幣來購物和找錢。購物時規定了可以使用的各種面值的硬幣個數。假定商店裡各面值的硬幣足夠多,顧客也可用多種方式支付,在一次購物中希望使用最少硬幣...

回溯演算法經典例子

例如,對於 n 3 的 01 揹包問題,可以用完全二叉樹表示其解空間 解空間樹的型別 子集樹 當所給問題是從 n 個元素的集合 s 中找出 s 滿足某種性質的子集時,相應的解空間樹稱為子集樹。void backtrack int t 排列樹 當所給問題是確定 n 個元素滿足某種性質的排列時,相應的解...

貪心演算法幾個經典例子 關於貪心演算法,你該了解這些!

回溯結束,貪心正式開始,你準備好了麼?貪心的本質是選擇每一階段的區域性最優,從而達到全域性最優 這麼說有點抽象,來舉乙個例子 例如,有一堆鈔票,你可以拿走十張,如果想達到最大的金額,你要怎麼拿?指定每次拿最大的,最終結果就是拿走最大數額的錢。每次拿最大的就是區域性最優,最後拿走最大數額的錢就是推出全...