贪心算法-简单了解

来源:互联网 发布:sql limit 1 offset 1 编辑:程序博客网 时间:2024/05/22 03:20

转自:http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741375.html  感谢原作者的辛苦工作!




1、  找零钱:拿尽可能少的硬币。

2、  装载问题:能够承载的重量是固定的,装尽可能多的箱子。那么就从最轻的箱子开始装起。

 

贪心算法就是做出当前看来最好的选择。贪心算法不一定能够达到全局最优,但是有些问题中可以实现全局最优。

 

1、 可分割的背包问题:优先选择单位价值最高的物品装包。

 

贪心算法主要用于处理优化问题。每个优化问题都是由目标函数和约束条件组成。满足约束条件的解成为可行解,使得目标函数最大的解是最优解。确定贪心准则是使用贪心算法的核心问题。

 

2、 活动安排问题:K个活动都有自己的开始时间和结束时间,现在要公用统一资源,安排尽量多的活动。先把结束时间按从小到大的顺序排序。找满足约束条件结束最早的活动即可。

3、 带期限的单机作业调度问题:

很多作业都要在一个机器上进行操作,每个完成之后的效益值为Ki,每个作业必须在Ti之前完成,请问如何安排这些任务,才能使得效益值最大。

首先先把所有的任务按照效益值进行排序,把效益值高的排上,只要保证每一个任务所完成的时间不晚于其执行时间就可以。

    4、最优生成树问题

      即在一个无向带权的图上,如何选择出一个最小权值生成树。也可以把顶点看成是城市,边看成是道路,如何最小成本的使得城市之间可以关联起来。

          有两种方法:Prim和Kruskal算法

          Prim算法的步骤是先选出权值最小的路径,然后从该路径两端节点所连接的路径中选择权值最小的路径,不断的循环选择【选择的过程中,保证不能出现圈】。

          COST:邻接矩阵,就是能够通过COST[i][j]便可以知道两个结点之间的距离。

          Near[N]:数组,用于记录每一个节点到已选择边结点中哪个距离更近一些。

          T[i][j]数组:用来记录树的每一条边

 

          Kruskal算法步骤就是不断的选择权值最小的边,然后保证所选出来的边不构成圈就可以了。

 

5、 单点源最短路径问题

已知一个赋权有向图,求由指定顶点到其他顶点的最短路径。思路就是找到迄今已生成的所有路径长度之和为最小。算法思想叫Dijkstra(迪克斯特拉)算法。

COST:邻接矩阵,用于记录边之间的权重。

S[i]:用于记录是否已经被考虑过了,即是否已经计算出了从指定点到这点的最短路径。

Parent[i]:用于记录某个节点的父亲节点是什么。

Dist[i]:用于记录从指定结点到该节点的路径。

 

首先进行初始化,Dist[i]都初始化为从指定结点到结点i的权重;初始化指定节点,即Dist设置为0,parent指向-1;

然后进入循环,选出S[i]中为所有没有被选中的元素中的dist[i]最小的w;然后对于其他所有点,更新其Dist,因为有可能从指定点路过w到某点的距离小于直接从指定点到某点的距离。然后不但更新。

    

6、 Huffman编码

哈夫曼编码是用于数据文件压缩的十分有效的编码方法,其压缩率通常在20%-90%之间。

就是如何编造一个字符集的前缀编码,即每一个字符的前面部分是不一样的,这样才能达到区分字符的效果。

通过频率把所有的字符进行排序,然后不断的合并字符,合并之后频率加和,然后再排序,再合并,知道结束为止。



0 0
原创粉丝点击