1. 程式人生 > 實用技巧 >演算法複習——貪心

演算法複習——貪心

部分揹包問題、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)\)