標籤:style blog http 使用 strong 檔案 資料 問題 log
問題表述:設有n個活動的集合E = {1,2,…,n},其中每個活動都要求使用同一資源,如演講會場等,而在同一時間內只有一個活動能使用這一資源。每個活i都有一個要求使用該資源的起始時間si和一個結束時間fi,且si < fi 。如果選擇了活動i,則它在半開時間區間[si, fi)內佔用資源。若區間[si, fi)與區間[sj, fj)不相交,則稱活動i與活動j是相容的。也就是說,當si >= fj或sj >= fi時,活動i與活動j相容。
由於輸入的活動以其完成時間的非減序排列,所以演算法greedySelector每次總是選擇具有最早完成時間的相容活動加入集合A中。直觀上,按這種方法選擇相容活動為未安排活動留下儘可能多的時間。也就是說,該演算法的貪心選擇的意義是使剩餘的可安排時間段極大化,以便安排儘可能多的相容活動。
演算法greedySelector的效率極高。當輸入的活動已按結束時間的非減序排列,演算法只需O(n)的時間安排n個活動,使最多的活動能相容地使用公用資源。如果所給出的活動未按非減序排列,可以用O(nlogn)的時間重排。
例:設待安排的11個活動的開始時間和結束時間按結束時間的非減序排列如下:
演算法greedySelector 的計算過程如所示。圖中每行相應於演算法的一次迭代。陰影長條表示的活動是已選入集合A的活動,而空白長條表示的活動是當前正在檢查相容性的活動。
若被檢查的活動i的開始時間Si小於最近選擇的活動j的結束時間fi,則不選擇活動i,否則選擇活動i加入集合A中。
貪心演算法並不總能求得問題的整體最優解。但對於活動安排問題,貪心演算法greedySelector卻總能求得的整體最優解,即它最終所確定的相容活動集合A的規模最大。這個結論可以用數學歸納法證明。
活動安排問題實現:
...
哈夫曼編碼
哈夫曼編碼是廣泛地用於資料檔案壓縮的十分有效編碼方法。其壓縮率通常在20%~90%之間。哈夫曼編碼演算法用字元在檔案中出現的頻率表來建立一個用0,1串表示各字元的最優表示方式。
給出現頻率高的字元較短的編碼,出現頻率較低的字元以較長的編碼,可以大大縮短總碼長。
|
|
a |
b |
c |
d |
e |
f |
|
頻率(千次) |
45 |
13 |
12 |
16 |
9 |
5 |
|
定長碼 |
000 |
001 |
010 |
011 |
100 |
101 |
|
變長碼 |
0 |
101 |
100 |
111 |
1101 |
1100 |
定長碼:
3*(45+13+12+16+9+5) = 300 千位
變長碼:
1*45+3*13+3*12+3*16+4*9+4*5 = 224 千位
貪心演算法_活動安排問題_哈弗曼編碼