zoukankan      html  css  js  c++  java
  • 算法复习——贪心

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

  • 相关阅读:
    Sqlite—修改语句(Update)
    Python—图形界面开发
    Django—模型
    Sqlite—删除语句(Delete)
    Shell—详解$( )、$(( ))、``与${ }的区别
    Shell—详解$0、$1、$2、$#、$*、$@、$?、$$变量
    排名靠前的博客
    系统架构--逻辑层
    互联网系统的通用架构笔记
    各类开源协议总结
  • 原文地址:https://www.cnblogs.com/VanHa0101/p/14197373.html
Copyright © 2011-2022 走看看