演算法導論(六)之貪婪演算法

2021-08-30 02:41:42 字數 3556 閱讀 4897

動態規劃是先分析子問題,再做選擇。而貪心演算法則是先做貪心選擇,做完選擇後,生成了子問題,然後再去求解子問題

活動集合s(si為

開始時間

,fi為

結束時間

s_i為開始時間,f_i 為結束時間

si​為開始

時間,f

i​為結

束時間):

i123

4567

891011

s

is_i

si​130

5356

88212

f

if_i

fi​456

78910

1112

1314

//***********活動編號已經按結束時間排序**********

//遞迴

rec-act-sel (s, f, i, n)

m ← i + 1

while m ≤ n and s[m] < f[i] //find the first activity in s(i) to finish

do m ← m + 1

if m ≤ n

then return and rec-act-sel(s, f, m, n)

else return null

t(n

)=θ(

n)

t(n) = \theta(n)

t(n)=θ

(n)

/**

* 貪心演算法的遞迴解:活動編號已經按結束時間排序

** @param s 活動的開始時間

* @param f 活動的結束時間

* @param i 要求解的子問題 s(i)

* @param n 活動集合s的數量

* @param activities 結果記錄

* @return 返回 s(i) 的最大相容活動集

*/public static arraylistrecursiveactivityselection(int s, int f, int i, int n, arraylistactivities)

if (m < n)

return activities;

}public static void main(string args) ;

int f = ;

arraylist arr = jobschedule.recursiveactivityselection(s, f, 0, s.length, new arraylist<>());

for (int i = 0; i < arr.size(); i++)

}

//***********活動編號已經按結束時間排序**********

//迭代

greedy-activity-selector(s, f)

n = s.length

a ←

k ← 1

for m ← 2 to n

do if s[m] ≥ f[k] //activity a(m) is compatible with a(k)

then a ← a and

k ← m // a(i) is most recent addition to a

return a

t(n

)=θ(

n)

t(n) = \theta(n)

t(n)=θ

(n)

/**

* 貪心演算法的迭代解:活動編號已經按結束時間排序

** @param s 活動的開始時間

* @param f 活動的結束時間

* @param activities 結果記錄

* @return 返回 s(i) 的最大相容活動集

*/public static arraylistgreedyactivityselection(int s, int f, arraylistactivities)

}return activities;

}public static void main(string args) ;

int f = ;

arraylist arr = jobschedule.greedyactivityselection(s, f, new arraylist<>());

for (int i = 0; i < arr.size(); i++)

}}

//筆者為看懂,望大神指教

編碼檔案需要的二進位制位: b(t

)=∑c

∈cc.

freq

∗dt(

c)

b(t) = \sum_

b(t)=c

∈c∑​

c.fr

eq∗d

t​(c

)

huffman(c)

n = |c|

q = c

for i = 1 to n – 1

do allocate a new node z

z.left = x = extract-min(q)

z.right = y = extract-min(q)

z.freq = x.freq + y.freq

insert (q, z)

return extract-min(q)

t(n

)=o(

n∗lo

gn

)t(n) = o(n * logn)

t(n)=o

(n∗l

ogn)

public class huffman 

@override

public int compareto(treenode o) else if (this.weight < o.weight) else }}

public static treenode huffman(treemapdata)

while (tnodes.size() > 1)

return tnodes.first();

}//得到字元編碼

private static void code(treenode t)

if (t.right != null)

}//列印字元編碼結果

public static void print(treenode root) else }}

public static void main(string args)

}

問題描述:給定一組物品,每種物品都有自己的重量和**,在限定的總重量內,我們如何選擇,才能使得物品的總**最高

演算法之貪婪演算法

雖然設計乙個好的求解演算法更像是一門藝術,而不像是技術,但仍然存在一些行之有效的能夠用於解決許多問題的演算法設計方法,你可以使用這些方法來設計演算法,並觀察這些演算法是如何工作的。一般情況下,為了獲得較好的效能,必須對演算法進行細緻的調整。但是在某些情況下,演算法經過調整之後效能仍無法達到要求,這時...

Python之貪婪演算法

np完全問題 找不到快速演算法的問題。識別np完全問題,以免浪費時間去尋找解決它們的快速演算法 沒辦法判斷問題是不是np完全問題,但還是有一些蛛絲馬跡可循的。1 元素較少時演算法的執行速度非常快,但隨著元素數量的增加,速度會變得非常慢。2 涉及 所有組合 的問題通常是np完全問題。3 不能將問題分成...

常用演算法設計方法 六 貪婪法

貪婪法是一種不追求最優解,只希望得到較為滿意解的方法。貪婪法一般可以快速得到滿意的解,因為它省去了為找最優解要窮盡所有可能而必須耗費的大量時間。貪婪法常以當前情況為基礎作最優選擇,而不考慮各種可能的整體情況,所以貪婪法不要回溯。例如平時購物找錢時,為使找回的零錢的硬幣數最少,不考慮找零錢的所有各種發...