贪心算法(算法篇)

算法之贪心算法

贪心算法

概念

  • 贪心算法是一种思想 ,并不是一种算法,贪心算法是分阶段地工作,在每一个阶段,可以认为所作决定是好的,而不考虑将来地后果。
  • 算法的每个阶段总是选择当前阶段最优 ,这种策略希望当算法终止时,能够将每一次的局部最优变成全局最优。

调度问题

概念

  • 调度问题 就是安排一个完成任务的顺序使得全部任务完成的平均完成的时间能够最小化

单个处理器

  • 调度任务的方式我们一般使用非预占调度一旦开始一个任务,就必须将这个任务运行到完成
  • 调度问题一般都是最短任务最先进行 ,这样将会产生出每个阶段最优的调度,使得达到全局最优的调度。
  • 操作系统调用程序一般把优先权赋予那些更短的任务。

多处理器

  • 如果我们有多个处理器,并且任务是有序的(按照最短时间排序),这个时候的任务调度问题需要进行小部分的改变,但跟单个处理器的思想是一样的
  • 假设我们有p个处理器 ,则我们选择前p个任务分配给各个处理器各一个 ,然后第p+1任务分配给第一个处理器 ,然后后面的就是按照这个规则分配。
  • 第二个最优解,是将任务分组分配给各个处理器 ,且任务个数能整除处理器个数 ,是对于0<=i<N/p ,p为处理器个数,N为任务总数,i为处理器序号,我们从任务i*p+1直到任务(i+1)*p的每个任务放到编号为i的处理器中。

Huffman编码

概念

  • 哈夫曼(Huffman)编码是一种压缩文件的编码 ,根据文件出现的字符使用一种将数据存在树叶上的二叉树来表示每个字符的二进制代码
  • 每个字符通过从根节点开始用0指示左分支用1表示右分支而以记录路径的方法表示出来 。如果字符c~i~在深度d~i~处并且出现f~i~次,那么该字符代码的值为对d~i~f~i~的求和。
  • 一个最优的哈夫曼编码 是一种满二叉树所有的节点或者是树叶,或者有两个子节点。
  • 而贪心算法在这里就是根据字符出现的频率找出总价值最小的满二叉树 ,其中所有字符位于树叶。就是将出现次数少的放在深度深的地方(编码位数较多),将出现最多放在最浅的地方(编码位数较少)
  • 例如图10-9,字符a压缩后所表示的二进制代码为000

哈夫曼算法

  • 为了生成最优的哈夫曼编码树,哈夫曼提出了哈夫曼算法,这个算法也是使用了贪心的策略
  • 假设字符个数为C ,算法的描述如下:算法对一个由树组成的森林进行。一棵树的权等于它的树叶(字符)的频率的和任意选取最小权的两棵树T1和T2 ,并任意形成以T1和T2为子树的新树将这样的过程进行C-1次 。在算法的开始存在C课单节点树 --每个字符一颗树。在算法结束时得到一棵树,这棵树就是最优哈夫曼编码树。

实现代码:

cpp 复制代码
//树的结构体
struct tree{
    char data;   //存字符
    tree* left;
    tree* right;
    int weight;    //权重
};

//用来定义优先队列的比较规则
struct cmp{
    bool operator()(tree *a, const tree* b){
        return a->weight<b->weight;
    }
};

//需要将数据先存入优先队列中
priority_queue<tree*,vector<tree*>,cmp>pq;


tree* createNode(char data,int weight){
    tree* p=new tree;
    p->data=data;
    p->left= nullptr;
    p->right= nullptr;
    p->weight=weight;
    return p;
}

tree* merge(tree* &t1,tree* &t2){
    int n=t1->weight+t2->weight;
    tree* p= createNode(0,n);
    p->left=t1;
    p->right=t2;
    return p;
}

tree* Huffman(){
    tree* p;
    while (!pq.empty()){
        tree* t1=pq.top();
        pq.pop();
        tree* t2=pq.top();
        pq.pop();
        p=merge(t1,t2);
        pq.push(p);
    }
    return p;
}
相关推荐
JingHongB5 分钟前
代码随想录算法训练营Day55 | 图论理论基础、深度优先搜索理论基础、卡玛网 98.所有可达路径、797. 所有可能的路径、广度优先搜索理论基础
算法·深度优先·图论
weixin_432702268 分钟前
代码随想录算法训练营第五十五天|图论理论基础
数据结构·python·算法·深度优先·图论
小冉在学习11 分钟前
day52 图论章节刷题Part04(110.字符串接龙、105.有向图的完全可达性、106.岛屿的周长 )
算法·深度优先·图论
Repeat71511 分钟前
图论基础--孤岛系列
算法·深度优先·广度优先·图论基础
小冉在学习14 分钟前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论
武子康26 分钟前
大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和
大数据·人工智能·学习·算法·机器学习·数据挖掘
passer__jw7671 小时前
【LeetCode】【算法】283. 移动零
数据结构·算法·leetcode
Ocean☾1 小时前
前端基础-html-注册界面
前端·算法·html
顶呱呱程序1 小时前
2-143 基于matlab-GUI的脉冲响应不变法实现音频滤波功能
算法·matlab·音视频·matlab-gui·音频滤波·脉冲响应不变法
爱吃生蚝的于勒2 小时前
深入学习指针(5)!!!!!!!!!!!!!!!
c语言·开发语言·数据结构·学习·计算机网络·算法