演算法複習——貪心
阿新 • • 發佈:2020-12-27
部分揹包問題、Huffman編碼、活動選擇
提出貪心策略:觀察問題特徵,構造貪心選擇
證明策略正確:假設最優方案,通過替換證明
1 部分揹包
按價效比大小從小到大排序,先選擇價效比高的物品;
def F_Knapsack(n,p,v,C) { 把所有物品按照價值/體積的比升序; //排序時間複雜度nlogn i = 1; ans = 0; while(C>0 and i<=n) { if(v[i] <= C) { ans += p[i]; C -= v[i]; } else { ans += C*(p[i]/v[i]); C = 0; } i = i + 1; } return ans; }
時間複雜度\(O(nlogn)\)
2 Huffman編碼
def Huffman(F, n) { 將F按遞增排序; // 排序 新建節點陣列P[1..n], Q[1..n]; for(i=1 to n) { P[i].freq = F[i]; P[i].left = NULL; P[i].right = NULL; } Q = {}; for(i=1 to n) { x = Extract(P, Q); y = Extract(P, Q); z.freq = x.freq + y.freq; z.left = x; z.right = y; Q.add(z); } return Extract(P, Q); }
時間複雜度為:\(O(nlogn)\)
3 活動選擇問題
想要選擇儘可能多的活動,每次選擇最早完成時間的專案
def ActivitySelection(S{a1, a2,..., an}, s[1..n], f[1..n]) { 把所有活動按完成時間升序排序; Ans = {a1}; k = 1; for(i=2 to n) { if(si >= fk) { k = i; //更新為當前的活動 Ans = Ans + {ai} } } return Ans; }
時間複雜度\(O(nlong)\)