2022年贪婪算法在程序设计中的应用分享 .pdf
《2022年贪婪算法在程序设计中的应用分享 .pdf》由会员分享,可在线阅读,更多相关《2022年贪婪算法在程序设计中的应用分享 .pdf(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、贪婪算法在程序设计中的应用高兵兵1,尹志敏2摘 要:本文是一篇介绍贪婪算法的文章,贪婪算法的思想是很容易理解的,因此本文的重点是“应用”上。本文首先对贪婪算法的思想进行了剖析,提出其内涵以及算法设计的框架,随后通过几个例子说明了贪婪算法在程序设计中的应用。在选取例子时,笔者优先选取了在数据结构课程中学到的几个应用贪婪思想的例子,并把这些例子用C语言实现了(在Dev-C+编译器下通过,并给出了测试数据)。在对例子说明的同时,本文给出了贪婪算法的适用范围,并举出了范例(如31)来说明贪婪策略的局限性。最后对贪婪策略的应用进行了总结,提出了用贪婪策略的注意事项。关键词: 贪婪法;程序设计;应用;局部
2、最优一 贪婪法的思想贪婪法又叫登山法,它的根本思想是逐步到达山顶,即逐步获得最优解,是解决最优化问题时的一种简单但适用范围有限的策略。在解得范围可以确定的情况下,蛮力枚举或递归搜索算法的效率是非常低的,可能在有限的时间内是找不到问题的解得。这时, 可以考虑使用贪心的策略,选取那些最可能到达解得情况来考虑。“贪婪”可以理解为以逐步的局部最优,达到最终的全局最优。在这里,一定要注意的是:算法设计的关键是贪婪策略的选择问题。选择的贪婪策略要具有无后向性,即某阶段的状态一旦确定以后,只与当前状态有关,不受这个状态以后的决策影响。因此, 适用于贪婪策略解决的问题类型较少,对所采用的贪婪策略一定要仔细分析
3、其是否满足无后向性。二 贪婪策略算法设计框架1. 贪婪的基本思路从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能的求得最好的解。当达到某算法中的某一步不需要在继续前进时,算法停止。2. 该策略下的算法框架从问题的某一初始解出发;While (能朝给定目标前进一步) 利用可行的决策,求出可行解的一个解元素 由解元素组合成问题的一个可行解。三 算法的应用实例及其适用性贪婪算法是一个适用性有限的策略。因此该部分分为三个部分分别举例并指出其适用性。1. 可绝对贪婪问题:例 11:求最小生成树的prim 算法和 kruskal算法:由于求最小生成树的算法的思想在数据结构的
4、课程中已给出详细解释,笔者不再赘述, 只是名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 12 页 - - - - - - - - - 通过具体的代码来分析其核心的思想是贪心算法。此例子中的图论图形如下所示:Prim: #include #include #define MAX 100 #define MAXCOST 0 x7fffffff int graphMAXMAX; int Prim(int graphMAX, int n) int lowcostMAX; int
5、 mstMAX; int i, j, min, minid, sum = 0; for (i = 2; i = n; i+) /* 最短距离初始化为其他节点到1 号节点的距离 */ lowcosti = graph1i; /* 标记所有节点的起点皆为默认的1 号节点 */ msti = 1; /* 标记 1 号节点加入生成树 */ mst1 = 0; for (i = 2; i = n; i+) 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 12 页 - - - - -
6、 - - - - min = MAXCOST; minid = 0; /* 找满足条件的最小权值边的节点minid ,进行贪婪选择 */ for (j = 2; j = n; j+) if (lowcostj min & lowcostj != 0) min = lowcostj; minid = j; printf(%c - %c : %dn, mstminid + A - 1, minid + A - 1, min); sum += min; lowcostminid = 0; for (j = 2; j = n; j+) if (graphminidj lowcostj) lowcost
7、j = graphminidj; mstj = 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+) graphij = MAXCOST; for (k = 0; k n; k+) scanf(%c %c %d, &chx, &chy, &cost); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - -
8、 - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 12 页 - - - - - - - - - getchar(); i = chx - A + 1; j = chy - A + 1; graphij = cost; graphji = cost; cost = Prim(graph, m); printf(Total:%dn, cost); system(pause); return 0; Kruskal: #include #include #define MAX 100 typedef struct int x, y; int w; edge; ed
9、ge eMAX; int rankMAX; int fatherMAX; int sum; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 12 页 - - - - - - - - - /* 比较函数,按权值( 相同则按x 坐标 ) 非降序排序 */ int cmp(const void *a, const void *b) if (*(edge *)a).w = (*(edge *)b).w) return (*(edge *)a).x - (*(edge *)b).x
10、; return (*(edge *)a).w - (*(edge *)b).w; void Make_Set(int x) fatherx = x; rankx = 0; int Find_Set(int x) if (x != fatherx) fatherx = Find_Set(fatherx); return fatherx; void Union(int x, int y, int w) if (x = y) return; if (rankx ranky) fathery = x; else if (rankx = ranky) ranky+; fatherx = y; sum
11、+= w; int main() int i, n; int x, y; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 12 页 - - - - - - - - - char chx, chy; scanf(%d, &n); getchar(); for (i = 0; i n; i+) scanf(%c %c %d, &chx, &chy, &ei.w); getchar(); ei.x = chx - A; ei.y = chy - A; Make_Set(i);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年贪婪算法在程序设计中的应用分享 2022 贪婪 算法 程序设计 中的 应用 分享
限制150内