算法复习——贪心

部分背包问题、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)\)

posted @ 2020-12-27 15:10  VanHope  阅读(78)  评论(0编辑  收藏  举报