当前位置: 首页 > news >正文

【JavaScript 算法】贪心算法:局部最优解的构建

在这里插入图片描述

🔥 个人主页:空白诗

在这里插入图片描述

文章目录

    • 一、贪心算法的基本概念
      • 贪心算法的适用场景
    • 二、经典问题及其 JavaScript 实现
      • 1. 零钱兑换问题
      • 2. 活动选择问题
      • 3. 分配问题
    • 三、贪心算法的应用
    • 四、总结

在这里插入图片描述

贪心算法(Greedy Algorithm)是一种逐步构建解决方案的方法。在每一步选择中,贪心算法总是选择在当前看来最优的选择,希望通过这些局部最优选择最终能构建出全局最优解。贪心算法的特点是简单高效,但它并不总能保证得到最优解。


一、贪心算法的基本概念

贪心算法的核心思想是每一步都选择当前最优的决策,不考虑未来的影响。贪心算法的基本步骤通常包括以下几个:

  1. 选择:选择当前最优的选项。
  2. 验证:验证当前选择是否可行(通常包括是否满足约束条件)。
  3. 构建:将当前选择加入到最终的解决方案中。

贪心算法的适用场景

贪心算法通常适用于以下场景:

  1. 最小生成树:如Kruskal和Prim算法。
  2. 最短路径问题:如Dijkstra算法。
  3. 区间调度问题:如选择最多的不重叠区间。

二、经典问题及其 JavaScript 实现

1. 零钱兑换问题

假设我们有几种不同面值的硬币,1元、2元和5元。我们希望用最少数量的硬币来凑出某个金额。

问题描述:给定不同面值的硬币和一个总金额,求最少数量的硬币。

/*** 求最少数量的硬币组合* @param {number[]} coins - 硬币面值数组* @param {number} amount - 总金额* @returns {number} - 最少硬币数量,如果无法凑出总金额返回 -1*/
function coinChange(coins, amount) {// 硬币面值从大到小排序coins.sort((a, b) => b - a);let count = 0;for (let coin of coins) {// 尽量使用当前面值最大的硬币let num = Math.floor(amount / coin);count += num;amount -= num * coin;// 如果总金额为 0,直接返回if (amount === 0) return count;}// 如果无法凑出总金额,返回 -1return -1;
}// 示例:用1元、2元和5元凑出11元的最少硬币数量
console.log(coinChange([1, 2, 5], 11)); // 输出 3 (5 + 5 + 1)

2. 活动选择问题

假设我们有一组活动,每个活动有开始时间和结束时间。我们希望选择尽可能多的活动,使得它们互不重叠。

问题描述:给定一组活动,选择尽可能多的不重叠活动。

/*** 求最多的不重叠活动数量* @param {number[][]} activities - 活动的开始和结束时间数组* @returns {number} - 最多不重叠活动数量*/
function maxActivities(activities) {// 按照活动结束时间排序activities.sort((a, b) => a[1] - b[1]);let count = 0;let end = 0;for (let activity of activities) {if (activity[0] >= end) {// 选择当前活动count++;end = activity[1];}}return count;
}// 示例:选择最多的不重叠活动
console.log(maxActivities([[1, 3], [2, 4], [3, 5], [0, 6], [5, 7], [8, 9], [5, 9]]));
// 输出 4 (选择活动 [1, 3], [3, 5], [5, 7], [8, 9])

3. 分配问题

假设我们有一组任务和一组工人,每个工人能完成的任务数量有限。我们希望尽可能多地完成任务。

问题描述:给定任务和工人的能力,尽可能多地分配任务。

/*** 求最多分配任务数量* @param {number[]} tasks - 任务难度数组* @param {number[]} workers - 工人能力数组* @returns {number} - 最多分配任务数量*/
function maxTaskAssignment(tasks, workers) {// 任务和工人分别排序tasks.sort((a, b) => a - b);workers.sort((a, b) => a - b);let taskIndex = 0;let workerIndex = 0;let count = 0;while (taskIndex < tasks.length && workerIndex < workers.length) {if (workers[workerIndex] >= tasks[taskIndex]) {// 分配任务给当前工人count++;taskIndex++;}workerIndex++;}return count;
}// 示例:尽可能多地分配任务
console.log(maxTaskAssignment([1, 2, 3], [3, 2, 1])); // 输出 3 (每个工人完成一个任务)

三、贪心算法的应用

贪心算法在实际开发中有广泛的应用,常见的应用场景包括:

  1. 图算法:最小生成树、最短路径问题。
  2. 活动选择:选择最多的不重叠活动。
  3. 任务分配:将任务尽可能多地分配给工人。
  4. 区间覆盖:用最少数量的区间覆盖所有点。

四、总结

贪心算法是一种通过局部最优选择构建全局最优解的方法。虽然它不总能保证得到最优解,但在许多实际问题中表现良好。通过理解和应用贪心算法,我们可以有效地解决许多复杂的优化问题。希望通过本文的介绍,大家能够更好地理解和应用贪心算法。

相关文章:

【JavaScript 算法】贪心算法:局部最优解的构建

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、贪心算法的基本概念贪心算法的适用场景 二、经典问题及其 JavaScript 实现1. 零钱兑换问题2. 活动选择问题3. 分配问题 三、贪心算法的应用四、总结 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种逐步构建解…...

Azcopy Sync同步Azure文件共享

文章目录 Azcopy Sync同步文件共享一、工作原理二、安装 AzCopy在 Windows 上在 Linux 上 三、资源准备1. 创建源和目标 Azure 存储账户2. 创建源和目标文件共享3. 确定路径4. 生成源和目的存储账户的共享访问签名&#xff08;SAS&#xff09;令牌配置权限示例生成的 URL 四、A…...

单例模式 饿汉式和懒汉式的区别

单例模式&#xff08;Singleton Pattern&#xff09;是设计模式中最简单、最常见、最容易实现的一种模式。它确保一个类仅有一个实例&#xff0c;并提供一个全局访问点。单例模式主要有两种实现方式&#xff1a;饿汉式&#xff08;Eager Initialization&#xff09;和懒汉式&am…...

Python中的模块和包的定义以及如何在Python中导入和使用它们

在Python中&#xff0c;模块&#xff08;Module&#xff09;和包&#xff08;Package&#xff09;是组织代码以便重用和共享的基本单元。它们使得Python代码更加模块化&#xff0c;易于管理和维护。 模块&#xff08;Module&#xff09; 模块是一个包含Python代码的文件&…...

设计模式使用场景实现示例及优缺点(结构型模式——组合模式)

结构型模式 组合模式&#xff08;Composite Pattern&#xff09; 组合模式使得用户对单个对象和组合对象的使用具有一致性。 有时候又叫做部分-整体模式&#xff0c;它使我们树型结构的问题中&#xff0c;模糊了简单元素和复杂元素的概念&#xff0c;客户程序可以像处理简单元…...

《系统架构设计师教程(第2版)》第11章-未来信息综合技术-06-云计算(Cloud Computing) 技术概述

文章目录 1. 相关概念2. 云计算的服务方式2.1 软件即服务 (SaaS)2.2 平台即服务 (PaaS)2.3 基础设施即服务 (IaaS)2.4 三种服务方式的分析2.4.1 在灵活性2.4.2 方便性方 3. 云计算的部署模式3.1 公有云3.2 社区云3.3 私有云3.4 混合云 4. 云计算的发展历程4.1 虚拟化技术4.2 分…...

网络安全工作者如何解决网络拥堵

网络如同现代社会的血管&#xff0c;承载着信息的血液流动。然而&#xff0c;随着数据流量的激增&#xff0c;网络拥堵已成为不容忽视的问题&#xff0c;它像是一场数字世界的交通堵塞&#xff0c;减缓了信息传递的速度&#xff0c;扰乱了网络空间的秩序。作为网络安全的守护者…...

电脑显示mfc140u.dll丢失的修复方法,总结7种有效的方法

mfc140u.dll是什么&#xff1f;为什么电脑会出现mfc140u.dll丢失&#xff1f;那么mfc140u.dll丢失会给电脑带来什么影响&#xff1f;mfc140u.dll丢失怎么办&#xff1f;今天详细给大家一一探讨一下mfc140u.dll文件与mfc140u.dll丢失的多种不同解决方法分享&#xff01; 一、mfc…...

ospf的MGRE实验

第一步&#xff1a;配IP [R1-GigabitEthernet0/0/0]ip address 12.0.0.1 24 [R1-GigabitEthernet0/0/1]ip address 21.0.0.1 24 [R1-LoopBack0]ip address 192.168.1.1 24 [ISP-GigabitEthernet0/0/0]ip address 12.0.0.2 24 [ISP-GigabitEthernet0/0/1]ip address 21.0.0.2 24…...

开发指南047-前端模块版本

平台前端框架内置了一个文件version.vue <template> <div> <br> 应用名称: {{name}} <br> 当前版本&#xff1a;{{version}} <br> 服务网关: {{gateway}} </div> </template> <scrip…...

c#中的字符串方法

Concat() String.Concat(字符串1 字符串n) 字符串拼接 Contains () 字符串1.Contains(字符串2) 字符串1是否包含字符串2返回布尔值 CopyTo() 字符串1.CopyTo(0,空数组,0,5); 从哪开始 复制到哪里 从哪开始存 存储的个数 tartsWith 字符串1.StartsWith("字符串") 以…...

成像光谱遥感技术中的AI革命:ChatGPT

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力&#xff0c;ChatGPT在遥感中的应用&#xff0c;人工智能在…...

学习分布式事务遇到的小bug

一、介绍Seata 在处理分布式事务时我用到是Seata&#xff0c;Seata的事务管理中有三个重要的角色&#xff1a; TC (Transaction Coordinator) - 事务协调者&#xff1a;维护全局和分支事务的状态&#xff0c;协调全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器…...

ElasticSearch学习之路

前言 为什么学ElasticSearch&#xff1f; 数据一般有如下三种类型&#xff1a; 结构化数据&#xff0c;如&#xff1a;MySQL的表&#xff0c;一般通过索引提高查询效率非结构化数据&#xff0c;如&#xff1a;图片、音频等不能用表结构表示的数据&#xff0c;一般保存到mong…...

(C++二叉树02) 翻转二叉树 对称二叉树 二叉树的深度

226、翻转二叉树 递归法&#xff1a; 交换两个结点可以用swap()方法 class Solution { public:TreeNode* invertTree(TreeNode* root) {if(root NULL) return NULL;TreeNode* tem root->left;root->left root->right;root->right tem;invertTree(root->l…...

高阶面试-mongodb

mongodb的特点&#xff0c;为什么使用他 nosql数据库&#xff0c;前端到后端到数据库&#xff0c;都是json&#xff0c;无模式&#xff0c;数据模型发生变更&#xff0c;不需要强制更新表结构&#xff0c;可以快速实现需求迭代。 天生分布式&#xff0c;高可用&#xff0c;处…...

MySQL数据库慢查询日志、SQL分析、数据库诊断

1 数据库调优维度 业务需求&#xff1a;勇敢地对不合理的需求说不系统架构&#xff1a;做架构设计的时候&#xff0c;应充分考虑业务的实际情况&#xff0c;考虑好数据库的各种选择(读写分离?高可用?实例个数?分库分表?用什么数据库?)SQL及索引&#xff1a;根据需求编写良…...

[短笔记] Ubuntu配置环境变量的最佳实践

结论&#xff1a; 不确定是否要设为系统&#xff0c;则先针对当前用户设&#xff0c;写~/.profile确定为系统级&#xff0c;写/etc/environment&#xff0c;注意无需export不推荐写在~/.bashrc&#xff08;Ubuntu不推荐&#xff0c;理由见references&#xff09; References&…...

怎样在 PostgreSQL 中优化对多表关联的连接条件选择?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样在 PostgreSQL 中优化对多表关联的连接条件选择一、理解多表关联的基本概念二、选择合适的连接条件…...

【Flowable | 第四篇】flowable工作流多任务实例节点实现会签/或签

文章目录 5.flowable工作流多任务实例节点实现会签/或签5.1会签/或签概念5.2多实例配置说明5.3会签例子5.3.1用户候选人配置5.3.2多实例配置5.3.3执行监听器配置5.3.5测试 5.flowable工作流多任务实例节点实现会签/或签 5.1会签/或签概念 我们在本篇中&#xff0c;将使用多任…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...