我爱普洱茶 发表于 2024-12-26 22:56:26

C语言中的贪心算法



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

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

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

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


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

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

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

标题形貌

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


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

以下是运动选择标题的 C 语言实现代码:
#include <stdio.h>
#include <stdlib.h>

// 定义活动结构体
typedef struct {
    int start;
    int end;
} Activity;

// 比较函数,用于按结束时间排序
int compare(const void *a, const void *b) {
    Activity *activity1 = (Activity *)a;
    Activity *activity2 = (Activity *)b;
    return activity1->end - activity2->end;
}

// 贪心算法选择活动
void selectActivities(Activity activities[], int n) {
    // 按结束时间排序
    qsort(activities, n, sizeof(Activity), compare);

    printf("选择的活动如下:\n");
    int lastEndTime = 0;

    for (int i = 0; i < n; i++) {
      if (activities.start >= lastEndTime) {
            printf("活动[%d]: 开始时间 = %d, 结束时间 = %d\n", i + 1, activities.start, activities.end);
            lastEndTime = activities.end;
      }
    }
}

int main() {
    Activity activities[] = {
      {1, 3},
      {2, 5},
      {4, 6},
      {6, 7},
      {5, 9},
      {8, 9}
    };
    int n = sizeof(activities) / sizeof(activities);

    selectActivities(activities, n);

    return 0;
}
代码分析


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

输入运动:


[*]运动1:开始时间=1,结束时间=3
[*]运动2:开始时间=2,结束时间=5
[*]运动3:开始时间=4,结束时间=6
[*]运动4:开始时间=6,结束时间=7
[*]运动5:开始时间=5,结束时间=9
[*]运动6:开始时间=8,结束时间=9
输出运动:
选择的活动如下:
活动: 开始时间 = 1, 结束时间 = 3
活动: 开始时间 = 4, 结束时间 = 6
活动: 开始时间 = 6, 结束时间 = 7
活动: 开始时间 = 8, 结束时间 = 9
总结


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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: C语言中的贪心算法