- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
贪婪算法在程序设计中的应用
高兵兵1,尹志敏 2
摘 要:本文是一篇介绍贪婪算法的文章,贪婪算法的思想是很容易理解的,因此本文的重点是“应用”上。本文首先对贪婪算法 的思想进行了剖析,提出其内涵以及算法设计的框架,随后通过几个例子说明了贪婪算法在程序设计中的应用。在选取例子时,笔者优先选取了在《数据结构》课程中学到的几个应用贪婪思想的例子,并把这些例子用C语言实现了(在Dev-C++编译器下通过,并给出了测试数据)。在对例子说明的同时,本文给出了贪婪算法的适用范围,并举出了范例(如3—1)来说明贪婪策略的局限性。最后对贪婪策略的应用进行了总结,提出了用贪婪策略的注意事项。
关键词:贪婪法;程序设计;应用;局部最优
贪婪法的思想
贪婪法又叫登山法,它的根本思想是逐步到达山顶,即逐步获得最优解,是解决最优化问题时的一种简单但适用范围有限的策略。在解得范围可以确定的情况下,蛮力枚举或递归搜索算法的效率是非常低的,可能在有限的时间内是找不到问题的解得。这时,可以考虑使用贪心的策略,选取那些最可能到达解得情况来考虑。“贪婪”可以理解为以逐步的局部最优,达到最终的全局最优。在这里,一定要注意的是:算法设计的关键是贪婪策略的选择问题。选择的贪婪策略要具有无后向性,即某阶段的状态一旦确定以后,只与当前状态有关,不受这个状态以后的决策影响。因此,适用于贪婪策略解决的问题类型较少,对所采用的贪婪策略一定要仔细分析其是否满足无后向性。
贪婪策略算法设计框架
贪婪的基本思路
从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能的求得最好的解。当达到某算法中的某一步不需要在继续前进时,算法停止。
该策略下的算法框架
从问题的某一初始解出发;
While(能朝给定目标前进一步)
{
利用可行的决策,求出可行解的一个解元素
}
由解元素组合成问题的一个可行解。
算法的应用实例及其适用性
贪婪算法是一个适用性有限的策略。因此该部分分为三个部分分别举例并指出其适用性。
可绝对贪婪问题:
例1—1:
求最小生成树的prim算法和kruskal算法:
由于求最小生成树的算法的思想在数据结构的课程中已给出详细解释,笔者不再赘述,只是通过具体的代码来分析其核心的思想是贪心算法。
此例子中的图论图形如下所示:
Prim:
#include stdio.h
#include stdlib.h
#define MAX 100
#define MAXCOST 0x7fffffff
int graph[MAX][MAX];
int Prim(int graph[][MAX], int n)
{
int lowcost[MAX];
int mst[MAX];
int i, j, min, minid, sum = 0;
for (i = 2; i = n; i++)
{
/* 最短距离初始化为其他节点到1号节点的距离 */
lowcost[i] = graph[1][i];
/* 标记所有节点的起点皆为默认的1号节点 */
mst[i] = 1;
}
/* 标记1号节点加入生成树 */
mst[1] = 0;
for (i = 2; i = n; i++)
{
min = MAXCOST;
minid = 0;
/* 找满足条件的最小权值边的节点minid,进行贪婪选择 */
for (j = 2; j = n; j++)
{
if (lowcost[j] min lowcost[j] != 0)
{
min = lowcost[j];
minid = j;
}
}
printf(%c - %c : %d\n, mst[minid] + A - 1, minid + A - 1, min);
sum += min;
lowcost[minid] = 0;
for (j = 2; j = n; j++)
{
if (graph[minid][j] lowcost[j])
{
lowcost[j] = graph[minid][j];
mst[j] = minid;
}
}
}
return sum;
}
int main()
{
int i, j, k, m, n;
int x, y, cost;
char chx, chy;
scanf(%d%d, m, n);
getchar();
for (i = 1; i = m; i++)
{
for (j = 1; j = m; j++)
{
graph[i][j] = MAXCOST;
文档评论(0)