贪心算法(Java版本)

article/2025/9/12 19:22:47

一、贪心算法

1、算法描述

贪心算法(Greedy algorithm),又叫做贪婪算法。

在对问题求解时,不从整体考虑,而是从问题的某一个初始解出发,每一步选择中都采取在当前状态下最好或最优的选择(局部最优解),然后向下一步继续进行,且不能回溯,不断地选取当前最优解,通过局部最优解从而使得问题得到全局最优解。

贪心算法必须要注意:

  • 贪心策略的选择
  • 一定会有一个排序
  • 通过局部最优解能够得到全局最优解

贪心算法不是对所有问题都能得到整体最优解,并且贪心算法是没有固定的模板可以遵循的,每个题目都有不同的贪心策略,所以算法设计的关键就是贪心策略的选择。

贪心策略的选择:选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关(当前的选择,不能影响后续选择对于结果的影响)。

2、贪心算法的设计步骤

可按照算法定义设计:

  • 证明原问题的最优解之一可以由贪心选择得到。
  • 将最优化问题转化为这样一个问题,即先做出选择,再解决剩下的一个子问题。
  • 对每一子问题一一求解,得到子问题的局部最优解。
  • 把子问题的解局部最优解合成原来解问题的一个解。

3、适用范围

一般通过以下问题就可以通过贪心算法解决:

  • 1)针对某个问题有限制值,以及有一个期望的最好结果,通常是从某些数据中选出其中一些,达到最好的结果。
  • 2)一般会有一个排序,找出贡献最大的。
  • 3)举例看贪心是否可以解决。

一般用在任务调度,教师排课等系统。实际上,用贪心算法解决问题的思路,并不总能给出最优解,比如背包问题(动态规划解决)。

4、该算法存在的问题

  • 不能保证求得的最后解是最佳的
  • 不能用来求最大值或最小值的问题
  • 只能求满足某些约束条件的可行解的范围

二、示例

1、最优会议安排问题

最优会议安排问题:

公司有N个同等级的会议需要使用同一个会议室,现在给你这N个会议的开始和结束时间,你怎么样安排才能使会议室最大利用?即安排最多场次的会议?

1)会议类

public class Meeting {private int meNum; // 编号private int startTime; // 开始时间private int endTime; // 结束时间public Meeting(int meNum, int startTime, int endTime) {super();this.meNum = meNum;this.startTime = startTime;this.endTime = endTime;}
// getter setter
}

2)贪心算法

public class MeetingArrange {public static void main(String[] args) {List<Meeting> meetingList = new ArrayList<Meeting>();meetingList.add(new Meeting(1, 2, 8));meetingList.add(new Meeting(2, 9, 10));meetingList.add(new Meeting(3, 8, 9));meetingList.add(new Meeting(4, 9, 15));meetingList.add(new Meeting(5, 14, 16));meetingList.add(new Meeting(6, 17, 19));meetingList.add(new Meeting(7, 16, 20));List<Meeting> res = meetingArrange(meetingList, 0, 4);for (Meeting metting : res) {System.out.println("安排的会议:" + metting);}}/*** 会议安排算法(贪心算法)** @param meetingList*            - 待安排的所有会议* @param curTime*            - 会议当前时间,从一天的0点开始,如果领导要求从8点开始 那curTime=8* @param meetingNum*            - 安排几场会议* @return*/private static List<Meeting> meetingArrange(List<Meeting> meetingList, int curTime, int meetingNum) {List<Meeting> resultList = new ArrayList<>();// 1.对开始时间排序meetingList = meetingList.stream().sorted(Comparator.comparingInt(Meeting::getStartTime)).collect(Collectors.toList());// 记录已安排的会议数量int tempCount = 0;// 2.遍历for (Meeting meeting : meetingList) {// 3.若会议的开始时间比我们当前的要大,则表示可以开if (meeting.getStartTime() >= curTime) {resultList.add(meeting);// 贪心策略:会议每次当前时间变为会议的结束时间curTime = meeting.getEndTime();tempCount++;}if (meetingNum == tempCount) {break;}}return resultList;}}

在这里插入图片描述

2、最优装载问题

最优装载问题:

一条小船用来运输古董到河对岸。假设船的最大载重量为MAXWEIGHT,每件古董的重量为 w_i,怎么能够装载最多数量的古董到船上呢?

public class OptimizedLoading {public static void main(String[] args) {int[] weight = { 4, 10, 7, 11, 3, 5, 14, 2 };int[] res = maxLoading(weight, 30);System.out.println("能装入的古董最大数量为: " + res.length);System.out.println("能装入的古董为: " + Arrays.toString(res));}/*** 装载算法(贪心算法)* * @param weight*            - 带装入的所有古董重量* @param maxWeight*            - 小船的最大载重量* @return 返回装载的古董*/public static int[] maxLoading(int[] weight, int maxWeight) {// 记录装载到小船上古董int resIndex = 0;int[] result = new int[weight.length];// 1.对weight数组进行排序Arrays.sort(weight);// 记录已装载到船上的古董重量int tempWeight = 0;// 2.遍历for (int i = 0; i < weight.length; i++) {// 贪心策略:每次装入最轻者tempWeight += weight[i];// 3.若加入最轻者后还小于载重量,则记录古董if (tempWeight <= maxWeight) {result[resIndex++] = weight[i];} else {// 超重,不能装载break;}}// 返回装载的古董return result;}}

在这里插入图片描述

参考文章:

  • 贪心算法(贪婪算法):https://blog.csdn.net/TuttuYYDS/article/details/124636914
  • 贪心算法典型题目详解(Java版本 共6题):https://blog.csdn.net/seagal890/article/details/90614064

– 求知若饥,虚心若愚。


http://chatgpt.dhexx.cn/article/W7lAfVsP.shtml

相关文章

Java贪心算法

1.Java贪心算法 1.1 贪心算法介绍 贪心算法是指在对问题进行求解时&#xff0c;在每一步选择中都采取最好或者最优(即最有利)的选择&#xff0c;从而希望能够导致结果是最好或者最优的算法贪心算法所得到的结果不一定是最优的结果(有时候会是最优解)&#xff0c;但是都是相对近…

C语言贪心算法

点击蓝字 关注我们 因公众号更改推送规则&#xff0c;请点“在看”并加“星标”第一时间获取精彩技术分享 来源于网络&#xff0c;侵删 01 基本概念 贪心算法是指在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#…

python贪心算法

文章目录 贪心算法1、分发饼干问题&#xff08;力扣455&#xff09;2、无重叠区间(力扣435)3、分发糖果&#xff08;力扣135&#xff09;4、种花问题&#xff08;力扣605&#xff09;5、用最少数量的箭引爆气球&#xff08;力扣452&#xff09;6、划分字母区间&#xff08;力扣…

算法-贪心算法

贪心算法 基本概念算法思想贪心算法就像周六晚上的动画片一样可遇不可求贪心解题步骤序列问题53. 最大子数组和 跳跃游戏55. 跳跃游戏跳跃游戏 II 分发糖果 基本概念 贪心算法又称贪婪算法&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。换句话说&am…

三大算法之三:贪心算法及其例题详解

目录 零.前言 1.区分贪心算法和动态规划 1.动态规划 2.贪心算法 3.共通点 2.贪心算法得到最优解的条件 1.具有优化子结构 2.具有贪心选择性 3.任务安排问题 1.问题定义 2.优化子结构 3.证明贪心选择性 4.总结 4.哈夫曼编码问题 1.问题定义 2.优化子结构 3.贪心…

一看就懂的贪心算法

如何理解贪心算法 我们先看一个例子 假设有一个可以容纳100kg物品的背包&#xff0c;背包可以装各种物品&#xff0c;我们有以下五种豆子&#xff0c;每种豆子的重量和总价值各不相同。为了让背包中所装物品的总价值最大&#xff0c;我们如何选择在背包中装哪些豆子&#xff…

从零开始学贪心算法

本文在写作过程中参考了大量资料&#xff0c;不能一一列举&#xff0c;还请见谅。 贪心算法的定义&#xff1a; 贪心算法是指在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;只做出在某种意义上的局部最优…

如何用wireshark过滤媒体流

进入媒体开发领域的同行来说&#xff0c;一般都会遇到媒体流过滤的问题。那么如何进行媒体流过滤呢&#xff1f; 首先是在媒体服务器的网卡上抓包。其次是获取到通话SIP信令的callid。并根据callid查到sip信令中SDP的IP和PORT。然后用callid及ip和port进行过滤&#xff0c;如果…

WireShark过滤器应用

在工作中我们常会用到wireshark抓取数据包进行分析&#xff0c;当使用wireshark默认设置时&#xff0c;会捕获到大量冗余的数据包&#xff0c;如果没有过滤器过滤&#xff0c;我们很难找到自己想要抓取的数据&#xff0c;这个时候就需要用到wireshark的过滤器来过滤&#xff0c…

Wireshark过滤器写法总结

目录 Wireshark提供了两种过滤器&#xff1a; 1、捕获过滤器 2、显示过滤器 过滤器具体写法 1、显示过滤器写法 1、过滤值比较符号及表达式之间的组合 2、针对ip的过滤 3、针对协议的过滤 4、针对端口的过滤&#xff08;视传输协议而定&#xff09; 5、针对长度和内…

Wireshark 过滤器使用

捕获过滤器&#xff1a; 在抓包之前就设定好过滤条件&#xff0c;然后只抓取符合条件的数据包。 显示过滤器&#xff1a; 在已捕获的数据包集合中设置过滤条件&#xff0c;隐藏不想显示的数据包&#xff0c;只显示符合条件的数据包。 过滤器比较符号 过滤ip和mac地址 ip 改成…

wireshark过滤规则详解

过滤器有两种&#xff1a; 一种是显示过滤器&#xff0c;就是主界面上那个&#xff0c;用来在捕获的记录中找到所需要的记录 一种是捕获过滤器&#xff0c;用来过滤捕获的封包&#xff0c;以免捕获太多的记录。 在Capture -> Capture Filters 中设置 保存过滤&#xff0c…

wireshark 过滤器规则

1、过滤 IP 如来源 IP 或目标 IP。 例子:ip.src eq 192.168.1.107 or ip.dst eq 192.168.1.107 或者ip.addr eq 192.168.1.107 // 都能显示来源 IP 和目标 IP 2、过滤端口 例子: tcp.port eq 80 // 不管端口是来源的还是目标的都显示 tcp.port 80 tcp.port eq 2722 tcp.…

Wireshark过滤器语法

1.官网地址 点击进入 2.捕获过滤器 使用捕获过滤器Wireshark只捕获满足过滤器条件的数据包进来。捕获过滤器采用BPF语法表达式&#xff0c;表达式由如下及部分组成: Dir 指明传输方向是前往还是来自 例如&#xff1a;src、dst Type 指出名字或数字所代表的意&#xff0c;例如…

wireshark过滤telnet

ip.addr172.16.xxx.xxx && tcp.port8080 telnet 端口可以换。可以是23也可以是任意

wireshark过滤器

1、几种条件操作符 eq 等于 ip.addr 192.168.0.1 ip.addr eq 192.168.0.1 ! ne 不等于 !ip.addr192.168.0.1 ip.addr! 192.168.0.1 ip.addr ne 192.168.0.1 > gt 大于 frame.len>64 frame.len gt 64 < lt 小于 frame.le…

Wireshark抓包及常用过滤方法

一、抓包 实际遇到组件服务间的报错问题时&#xff0c;通过日志无法快速看出原因&#xff0c;可通过抓包的方式来快速查看接口返回信息及错误提示&#xff0c;使用如下命令可实现对某个端口进行抓包&#xff1a; tcpdump -i any -w /opt/xxx.pcap tcp port 8150 # 8150为调用…

Wireshark 实用篇:Wireshark 抓包常用过滤命令

目录 前言 正文 一、根据 IP 地址过滤 二、根据端口过滤 三、根据协议过滤 四、根据 Payload Type 条件过滤 五、根据组合条件过滤 六、实例分析 前言 使用 Wireshark 工具进行网络抓包属于研发人员的基础技能&#xff0c;如果你还不了解&#xff0c;建议从现在开始…

Wireshark常用过滤使用方法

过滤源ip、目的ip。 在wireshark的过滤规则框Filter中输入过滤条件。如查找目的地址为192.168.101.8的包&#xff0c;ip.dst192.168.101.8&#xff1b;查找源地址为ip.src1.1.1.1 端口过滤。 如过滤80端口&#xff0c;在Filter中输入&#xff0c;tcp.port80&#xff0c;这条规…

HTML如何返回上一页

<a href"<a href"javascript :history.back(-1)">返回上一页</a>或 <a href"javascript :;" onClick"javascript :history.back(-1);">返回上一页</a>如果是用按钮做的话就是&#xff1a; <input type&quo…