贪心算法篇——万千抉择中的唯一考量,最优解追寻的跬步累积(1)

贪心算法篇——万千抉择中的唯一考量,最优解追寻的跬步累积(1)

文章目录

在这里插入图片描述

引言:在选择的海洋中

在人生的旅途上,每个人都要面临无数的选择。每一个选择,都是一次抉择;每一次抉择,都是命运的交汇点。数学与计算机科学的世界里,贪心算法正是对这种“选择”的一种深刻体现。在一系列的选择面前,贪心算法如同一位睿智的旅行者,始终秉持着最优的哲学:每一次决策都应基于局部最优,以期在最后抵达全局最优的境地。

贪心算法(Greedy Algorithm),正如其名所示,是一种每次都选择当前看起来最优解的算法。这种算法策略简单却充满智慧,常常能够解决很多看似复杂的问题。它通过一种局部的、贪婪的方式,一步步走向最终解。然而,正如智慧的旅行者需要对道路有所预见一样,贪心算法也有其适用的范围,只有在满足某些条件时,它才能发挥出最优解的魅力。

在这篇报告中,我们将深入探讨贪心算法的基本理念、适用范围、经典应用,并通过具体的代码示例,揭开这一算法的神秘面纱。

贪心算法的哲学:局部最优,全球最优

“从来没有人能够通过偷懒来获得全局的成功。”——贪心算法的核心思想可以总结为这一句话:
在每一个步骤中,我们都做出当前最优的选择,期待最后能获得最优的整体解。贪心算法仿佛在告诉我们,在面临选择时,我们无需过多的回顾过往,也不必过分担忧未来,我们只需要关注眼前,做出最合适的决策。

贪心算法的步骤

  • 问题分解:将问题分解为若干个子问题。
  • 贪心选择:在每个子问题中,选择一个局部最优的解。
  • 问题求解:通过局部最优的选择构建全局最优解。
  • 验证最优性:检查贪心选择是否真的能带来全局最优解。

适用条件:贪心选择性质和最优子结构
贪心算法能够成功地解决某些问题,但并非适用于所有问题。其适用条件是:

贪心选择性质:局部最优解可以构成全局最优解。即,做出局部最优决策的过程中,并不会错过最终最优解。

最优子结构:问题的最优解包含了子问题的最优解。换句话说,大问题的最优解可以通过合并其子问题的最优解获得。

只有在满足这两个条件时,贪心算法才能保证全局最优解。

贪心算法的经典应用

贪心算法并不是一种“万能钥匙”,它并不能解决所有问题。但在某些经典问题中,贪心算法往往能以一种简单而高效的方式,提供令人满意的答案。以下是一些典型的应用场景:

1. 活动选择问题

  • 问题描述:给定一组活动,每个活动都有一个开始时间和结束时间,如何选择活动使得所选活动互不重叠,且选择的活动数最大。
  • 贪心策略:每次选择结束时间最早的活动,以便为后续活动留出更多的时间。

2. 最小生成树问题
问题描述:给定一个图,如何选择一些边使得图成为连通图,且边的权值之和最小。

贪心策略:每次选择当前权值最小的边,加入生成树中。

3. 背包问题(贪心近似)

  • 问题描述:给定一个背包容量和若干物品,每个物品有重量和价值,如何选择物品放入背包使得总价值最大。
  • 贪心策略:每次选择单位重量价值最大的物品,直到背包满。

活动选择问题的实现:一次简单的抉择
为了更好地理解贪心算法的应用,以下我们通过“活动选择问题”来展示贪心算法的具体实现。

问题描述
假设有多个活动,每个活动都有一个开始时间和结束时间。我们希望选择尽可能多的活动,使得这些活动之间没有重叠。

贪心算法实现
我们可以根据活动的结束时间进行排序,每次选择结束时间最早的活动,并确保它与之前的活动不重叠。这个策略是贪心的,因为每次选择结束时间最早的活动能够为后续的活动留下最多的时间空间。

代码实现

#include<stdio.h>#include<stdlib.h>// 结构体定义,表示每个活动的开始时间和结束时间typedefstruct{int start;int finish;int index;} Activity;// 比较函数,用于根据活动的结束时间进行排序intcompare(constvoid*a,constvoid*b){return((Activity *)a)->finish -((Activity *)b)->finish;}// 活动选择函数,返回选择的活动索引voidactivity_selection(int start[],int finish[],int n){ Activity activities[n];// 将活动的开始时间、结束时间和索引存储到结构体数组中for(int i =0; i < n; i++){ activities[i].start = start[i]; activities[i].finish = finish[i]; activities[i].index = i;}// 按照结束时间进行排序qsort(activities, n,sizeof(Activity), compare);// 存储选择的活动int last_end_time =-1;// 记录最后一个选择活动的结束时间printf("选择的活动索引:");for(int i =0; i < n; i++){// 如果当前活动的开始时间大于等于上一个活动的结束时间if(activities[i].start >= last_end_time){// 选择该活动printf("%d ", activities[i].index); last_end_time = activities[i].finish;// 更新结束时间}}printf("\n");}intmain(){// 示例输入:活动的开始时间和结束时间int start[]={1,3,0,5,8,5};int finish[]={2,4,6,7,9,9};int n =sizeof(start)/sizeof(start[0]);// 计算活动的数量// 调用活动选择函数activity_selection(start, finish, n);return0;}

代码解析

  • 活动结构体:使用结构体 Activity 存储每个活动的开始时间 (start)、结束时间 (finish) 和索引 (index)。
  • 排序函数:compare 是一个用于 qsort 排序的比较函数。它根据活动的结束时间进行排序,确保我们可以优先选择结束时间最早的活动。
  • 活动选择:通过 qsort 排序后,我们遍历所有活动,选择那些开始时间大于等于最后选择活动结束时间的活动。
  • 输出选择的活动:在 activity_selection 函数中,我们选择符合条件的活动并打印其索引。

示例输出:

选择的活动索引:0 134

这意味着我们选择的活动是索引为 0, 1, 3, 4 的活动,它们的时间区间没有重叠。

贪心算法的局限与挑战

贪心算法的最大挑战在于如何做出正确的贪心选择。并非所有问题都能通过贪心策略得到全局最优解,尤其是在某些复杂问题中,局部最优解可能会导致整体的次优解

因此,在使用贪心算法时,我们需要仔细分析问题的结构,确保贪心选择性质和最优子结构成立。

结语:智者的选择,最优的未来

贪心算法,作为计算机科学中最具“智慧”的算法之一,它通过简洁直接的策略解决了许多看似复杂的问题。它的每一次选择,都是对局部最优的追求,而这一追求,最终汇聚成了全局最优的结果。在面对问题时,贪心算法教给我们一个深刻的道理——在合适的时刻,做出最好的选择,最终的道路会更加宽广和光明。

然而,正如人生中的许多选择并非总是简单易得,贪心算法并不是每一个问题的灵丹妙药。它适用于那些满足特定条件的问题,而对于其他问题,我们需要更加复杂和精密的算法。贪心算法不仅仅是一个算法,它更像是一种哲学,让我们在每一个选择的瞬间,都能以一种智慧的眼光看待前方的路。

本篇关于贪心算法的介绍就暂告段落啦,希望能对大家的的学习产生帮助,欢迎各位佬前来支持斧正!!!

在这里插入图片描述

Read more

华为光猫HN8145X6N R023软件版本补全并改公版

华为光猫HN8145X6N R023软件版本补全并改公版

【前言】 先前发过R022及一下软件版本的光猫补全 改公版 改光模式和补全文件等调试方法 今天带来的是R023完整的补全文件 就以华为HN8145X6N V5R023C00S120软件版本的光猫为例 【对HN8145X6N进行Shell补全】 先准备好R023的Shell补全文件和华为253工具 【开始刷机】 用华为的253工具选择R023补全文件 然后刷入 等待半分钟后 状态灯常亮 成功补全了R023 【253工具刷入补全的显示状态】 【补全成功好无法登录公版】 光猫补全Shell已经成功了 然后固定电脑IP为192.168.100.10后无法登录公版页面的解决方案: 用root admin登录Telnet后输入 在Shell下执行equipmode.sh off命令即可 【固定电脑网卡IP后成功登录华为公版页面】 补全成功后不需要像是R022及一下一样需要登录Telnet输入改公版的命令 R023补全好了直接就是Telnet强开和改公版 【输入超密登录公版页面】 教程就到这里了 其实固定IP等操作流程还是一样的 最重要的还是R023的补全文件

By Ne0inhk
Flutter for OpenHarmony:nm — Linux 风格的网络底层管控实践(适配鸿蒙 HarmonyOS Next ohos)

Flutter for OpenHarmony:nm — Linux 风格的网络底层管控实践(适配鸿蒙 HarmonyOS Next ohos)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net。 前言 在鸿蒙(OpenHarmony)桌面版或车载系统中,底层常沿用 NetworkManager 架构。nm 库通过 D-Bus 总线与系统守护进程交互,为开发者提供了切换 WiFi、配置 IP 及监控网卡状态等工业级网络管控能力。 一、核心价值 1.1 基础概念 nm 库是一个 D-Bus 客户端包装,它实现了 NetworkManager 的对象映射。 D-Bus 指令 鸿蒙 Flutter 应用 NetworkManager 守护进程 WiFi 管理模块 以太网/蜂窝网模块 VPN/路由配置 鸿蒙系统底层网卡驱动 1.2 进阶概念

By Ne0inhk
【2026版】Windows 安装 Docker 保姆级教程

【2026版】Windows 安装 Docker 保姆级教程

🚀 告别环境配置烦恼,一键部署容器化应用 一、为什么选择 Docker? * ✅ 跨平台一致性:一次构建,处处运行 * ✅ 资源高效利用:秒级启动,隔离进程 * ✅ 微服务友好:简化复杂应用部署 * ✅ 生态丰富:海量官方镜像开箱即用 二、安装前必读:两大版本区别 版本适用设备市场占有率AMD64Intel/AMD 主流 CPU 的 Win10/11>99%ARM64Surface Pro X 等 ARM 架构设备<1% 💡 普通用户 99% 选 AMD64! 查看本机架构:设置 > 系统 > 关于 → 检查 “系统类型” 三、安装步骤详解(以

By Ne0inhk
自动化机器学习实战:从调参苦力到AI工程师的解放

自动化机器学习实战:从调参苦力到AI工程师的解放

目录 摘要 1. 🎯 开篇:为什么我们需要AutoML? 2. 🧮 核心技术:超参数优化与神经架构搜索 2.1 超参数优化:从网格搜索到贝叶斯优化 2.2 神经架构搜索:让AI设计AI 3. ⚙️ 主流框架:AutoGluon vs TPOT 3.1 AutoGluon:亚马逊的工业级AutoML 3.2 TPOT:基于遗传算法的AutoML 3.3 框架性能对比 4. 🛠️ 实战:完整AutoML系统构建 4.1 自定义AutoML框架 4.2 分布式AutoML架构 5. 🏢 企业级应用:金融风控AutoML系统 5.1 系统架构设计 5.2 完整实现代码

By Ne0inhk