C语言中的贪心算法

打印 上一主题 下一主题

主题 784|帖子 784|积分 2352



贪心算法(Greedy Algorithm)是一种在每一步选择中都接纳当前最优解的算法,希望通过局部最优解的选择,最终得到全局最优解。它常用于办理最优化标题,如最小天生树、最短路径等。本文将从理论到实践,逐步引导初学者掌握贪心算法在 C 语言中的实现。

什么是贪心算法?

贪心算法的核心是 贪心选择性质最优子布局

  • 贪心选择性质:每次选择当前看起来最优的解。
  • 最优子布局:标题的最优解可以通过子标题的最优解归并得到。
举个例子:假如你需要用最少的硬币找零,每次选择最大面值的硬币就是贪心的思绪。

贪心算法的适用场景

贪心算法并不总是能找到全局最优解,适用场景包括:


  • 最小天生树标题(如 Prim、Kruskal 算法)
  • 运动选择标题
  • 最短路径标题(如 Dijkstra 算法,固然不是纯贪心,但核心思想类似)

贪心算法的实现步调

以下是实现贪心算法的通用步调:

  • 分析标题是否满意贪心选择性质和最优子布局
  • 排序:根据特定规则对标题的元素进行排序(通常需要一个比较函数)。
  • 逐步选择:重新开始,选择符合条件的元素,直到满意目的。
  • 验证效果:确保效果满意标题的要求。

示例:运动选择标题

标题形貌

给定一组运动,每个运动有一个开始时间和结束时间。你需要选择尽可能多的运动,且这些运动之间不能重叠。
贪心思绪


  • 按运动的结束时间升序排序(结束得越早,留给后续运动的时间越多)。
  • 依次选择每个运动,如果它的开始时间不早于上一个已选运动的结束时间,则选择它。

C语言实现

以下是运动选择标题的 C 语言实现代码:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. // 定义活动结构体
  4. typedef struct {
  5.     int start;
  6.     int end;
  7. } Activity;
  8. // 比较函数,用于按结束时间排序
  9. int compare(const void *a, const void *b) {
  10.     Activity *activity1 = (Activity *)a;
  11.     Activity *activity2 = (Activity *)b;
  12.     return activity1->end - activity2->end;
  13. }
  14. // 贪心算法选择活动
  15. void selectActivities(Activity activities[], int n) {
  16.     // 按结束时间排序
  17.     qsort(activities, n, sizeof(Activity), compare);
  18.     printf("选择的活动如下:\n");
  19.     int lastEndTime = 0;
  20.     for (int i = 0; i < n; i++) {
  21.         if (activities[i].start >= lastEndTime) {
  22.             printf("活动[%d]: 开始时间 = %d, 结束时间 = %d\n", i + 1, activities[i].start, activities[i].end);
  23.             lastEndTime = activities[i].end;
  24.         }
  25.     }
  26. }
  27. int main() {
  28.     Activity activities[] = {
  29.         {1, 3},
  30.         {2, 5},
  31.         {4, 6},
  32.         {6, 7},
  33.         {5, 9},
  34.         {8, 9}
  35.     };
  36.     int n = sizeof(activities) / sizeof(activities[0]);
  37.     selectActivities(activities, n);
  38.     return 0;
  39. }
复制代码

代码分析


  • 数据布局:用 struct 定义运动的开始和结束时间。
  • 排序:用 qsort 对运动按结束时间升序排列。
  • 贪心选择:逐一遍历排序后的运动,如果运动的开始时间不与上一次选择的运动辩论,就将其参加效果。

输入输出示例

输入运动:


  • 运动1:开始时间=1,结束时间=3
  • 运动2:开始时间=2,结束时间=5
  • 运动3:开始时间=4,结束时间=6
  • 运动4:开始时间=6,结束时间=7
  • 运动5:开始时间=5,结束时间=9
  • 运动6:开始时间=8,结束时间=9
输出运动:
  1. 选择的活动如下:
  2. 活动[1]: 开始时间 = 1, 结束时间 = 3
  3. 活动[3]: 开始时间 = 4, 结束时间 = 6
  4. 活动[4]: 开始时间 = 6, 结束时间 = 7
  5. 活动[6]: 开始时间 = 8, 结束时间 = 9
复制代码

总结


  • 贪心算法的核心是找到局部最优解,逐步迫近全局最优解。
  • 关键在于分析标题是否得当贪心策略,排序规则是实现的基础。
  • 通过运动选择标题,初学者可以掌握贪心算法的基本思想。
实行多练习一些经典的贪心标题,如背包标题、最短路径标题等,你会发现贪心算法是一种高效且优雅的办理标题方法!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

我爱普洱茶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表