前端开发:JS中使用到的贪心算法场景

news2024/11/16 17:41:46

前言

在前端开发过程中,除了一般的逻辑使用之外,也会涉及到算法相关的知识,比如冒泡排序、数组去重/合并、贪心算法、八皇后算法等等,这些都是比较常用的前端算法相关的知识点。关于前端实际开发中用到的算法,虽然没有后端要求的那么多,但是也有比较重要的算法知识,本篇博文就来分享一下关于贪心算法的相关知识点,记录一下,方便查阅使用。

贪心算法概念

贪心算法(又叫贪婪算法)是指在对问题求解时,总是做出在当前看来是最好的选择。也就是不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。(注意: 贪心算法,算法结构犹如其名,以局部最优解,进行小范围的最优累加,但是贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。)

  

贪心算法的构成

贪心算法的构成有:霍夫曼编码、prim和kruskal最小生成树算法、Dijkstra最短路径算法。

贪心算法的核心

        贪心算法的核心主要是要找出问题的贪心策略,贪心策略的主要逻辑就是每一次都选择当前的最优解,一直到得出全局的最优解。

贪心算法的缺点

虽然贪心算法每一次都选择当前的最优解,直到得出全局的最优解,但每一次的局部最优解不等于最终的全局最优解,不能从整体考虑所有的可能,每次都是采用局部的最优解、不回溯,所以有时候无法得出最优解,这就是贪心算法最大的缺点!

贪心算法的应用场景

  贪心算法的应用场景:1、关于某一组数据,需要有限制值和期望值,想要从中选出几个数据,在满足前面限制值的情况下,期望值最大; 2、每次选择当前条件下,在对限制值同等贡献的情况下,对期望值贡献最大的数据;3、买卖产品的最佳时机;4、分水果、分饼干、分办公用具等分配问题。

贪心算法的使用步骤

贪心算法没有固定的算法框架,算法设计的关键是贪心策略的选择,贪心算法一般按如下思路步骤使用:

  • 1、建立数学模型来描述问题;
  • 2、把求解的问题分成若干个子问题;
  • 3、对每个子问题求解,得到子问题的局部最优解;
  • 4、把子问题的解局部最优解合成原来解问题的一个解。

具体的示例如下所示:

Greedy(Q)  { //Q是问题的输入集合,也就是候选集合

    C={ };  //初始解集合是一个空集合

    while (not solution(C)) {  //集合C没有构成问题的一个解

     x=select(Q);    //在候选集合Q中做贪心选择

     if feasible(C, x)  //判断集合C中加入x后的解是否可行

          C=C+{x};

          Q=Q-{x};

    }

   return C;

}

贪心算法的示例

这里列举两个比较有代表性的贪心算法示例,方便理解使用。

示例一:分水果、分饼干、分办公用具等分配问题———分饼干问题

/**

* @param {number[]} h 胃口值

* @param {number[]} m 饼干的大小

* @return {number} i 最优解

*/

var findCookies = function(h, m) {

    const mysort = (a, b) => {

        return  a-b;

    }

    h.sort(mysort);

    m.sort(mysort);

    let i = 0;

    m.forEach((n) => {

        if(n >= h[i]){

            i++;

        }

    })

    return i;

};

 

示例二:买卖产品的最佳时机——————买卖股票的最佳时机

/**

* @param {number[]} p 价格

* @return {number} r 最优解

*/

var maxOptimal = function(p) {

    var r = 0;

    for(var i=1;i<=p.length;i++){

        if(p[i]>p[i-1]){

            r = p[i] - p[i-1] + r;

        }

    }

    return r;

};

 

示例三:柠檬水找零——每一杯柠檬水的售价为 5元。每位顾客只买一杯柠檬水,然后付5元或10元或 20元,然后给每个顾客正确找零。

var priceChange = function (rmbs) { //若客户给了20,可以找10+5,或5+5+5,其中10+5就算是贪心

  let fiveN = 0; //5元0张

  let tenN = 0; //10元0张

  for (let i = 0; i < rmbs.length; i++) {

    let rmb = rmbs[i]; //第i个客户给了张多少元的钱

    if (rmb === 5) {

      fiveN += 1;

    } else if (rmb === 10) {

      //客户给10元+,有5元找-,找不开直接false

      if (fiveN > 0) {

        fiveN -= 1;

        tenN += 1;

      } else {

        return false;

      }

    } else {

      //客户给20

      if (tenN >= 1 && fiveN >= 1) {

        //优先找零组合10+5

        fiveN -= 1;

        tenN -= 1;

      } else if (fiveN >= 3) {

        //接着找找零组合5+5+5

        fiveN -= 3;

      } else {

        return false;

      }

    }

  }

  return true;

};

 

示例四:区间覆盖——假设有n个区间,区间的起始断点和结束断点分别是[a1,b1],[a2,b2],….[an,bn],从这些区间中选出一部分区间,使这部分区间满足两两不想交,最多能选出的区间个数。

var sArray = function(array){

    let m = array.length;

    let sizeArray = array.sort(compareA());

    let res = [],c = 0,d = 0;

    for(let i = 0;i<m;i++){

        let left = sizeArray[i][0];

        let right = sizeArray[i][1];

        if(left>d || right<c){

            res.push(sizeArray[i]);

            c = left;

            d = right;

        }

    }

    return res;

}

var compareA = function(){

    return function(a,b){

      var value1 = a[1];

      var value2 = b[1];

      return value1 - value2;

    }

}

let array = [

    [6,8],

    [2,4],

    [5,9],

    [1,5],

    [9,10],

    [3,5]

]

console.log(sArray(array)) //输出结果为 [2,4], [6,8],[9,10]

 

最后

通过本文关于前端开发中JS中使用到的贪心算法场景的汇总的介绍,虽然在大部分实际开发中使用到上述示例的可能性不大,但是还是要掌握对应的知识点,尤其是在求职面试过程中会涉及到前端相关的算法知识使用,所以还是要学会掌握的,尤其是从事前端开发不久的开发者来说尤为重要,是一篇值得阅读的文章,且在实际开发中也是必用知识点,所以说这个知识点是必备的,重要性就不在赘述。欢迎关注,一起交流,共同进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/70883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Studio Controls COM 64 for MFC 组合套件-dbi-tech

dbi-tech Studio Controls COM 64 - 新功能... Studio 控制 COM 64 位 v6.0 ctxCalendar - (v4.0.0.0) DBI Technologies Inc. 是一家创新的商业软件开发公司&#xff0c;专注于为应用程序开发人员提供最佳的端到端供应链可见性组件软件。DBI 以其屡获殊荣的组件软件产品和服务…

华为机试_HJ62 查找输入整数二进制中1的个数【简单】【收藏】

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 解题过程 提交代码一&#xff08;常规方法&#xff09; 提交代码二&#xff08;位运算方法&#xff09; 学习代码 代码一 代码二 收藏点 描述 输入一个正整数&#xff0c;计算它在二进制下的1的个数。 注意多…

kubernetes学习之路--基础概念以及搭建

写在前面&#xff1a;代码审计太难了&#xff0c;不想学了摆烂了&#xff0c;开始学云安全了。。。。 一.云介绍 云分类&#xff1a;公有云、私有云、混合云 云有三种服务模式&#xff1a;Laas、Paas 和 Saas Laas&#xff1a;基础设施即服务&#xff08;Infrastructure-as…

[附源码]计算机毕业设计酒店客房管理信息系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Git版本控制器

文章目录1.Git介绍1.1.什么是Git?1.2.Git的历史1.3.版本控制分类1.3.1.集中式版本控制1.3.2.分布式版本控制1.4.Github&#xff08;Git服务器&#xff09;1.5.Git原理2.使用前的准备2.1.准备Git2.1.1.安装Git2.1.2.配置环境变量2.1.3.IEDA配置Git2.1.4.安装git插件&#xff08…

java面向对象 final static 关键字

目录 关键字&#xff1a;static 类属性、类方法的设计思想 类变量(class Variable) 静态变量的内存解析 类方法(class method) 单例 (Singleton)设计模式 理解main方法的语法 代码块 关键字&#xff1a;final 总结 关键字&#xff1a;static 当我们编写一个类时&…

Vue.js设计与实现,读书笔记第一章

第一章&#xff1a;权衡的艺术 1.1命令式和声明式 jq是命令式,关注过程&#xff0c;jq针对简化dom 而产生的 vue是 声明式&#xff0c;关注实现&#xff0c;不严格地说就像是在命令式(关注过程)基础上再对标签进行了一次封装&#xff08;关注实现&#xff09; jQuery命令式…

干货 | Jmeter 如何保证抢购、秒杀活动正常运行?

1. 前言 平常为了保证运营促销、抽奖活动能正常运行&#xff0c;我们一般都需要使用 Jmeter、LoadRunner 对接口进行压力测试 使用它可以模拟一定量的用户同时去参与促销抽奖活动&#xff0c;最后生成测试报告&#xff0c;以此判系统接口的稳定性 本篇文章以抢购商品为例&am…

清华毕业大佬用了一个项目就把SpringMVC+Spring+MyBatis给讲完了

前言 时间飞逝&#xff0c;转眼间毕业七年多&#xff0c;从事 Java 开发也六年了。我在想&#xff0c;也是时候将自己的 Java 整理成一套体系。 这一次的知识体系面试题涉及到 Java 知识部分、性能优化、微服务、并发编程、开源框架、分布式等多个方面的知识点。 写这一套 Ja…

R语言学习笔记——入门篇:第五章-高级数据管理

R语言 R语言学习笔记——入门篇&#xff1a;第五章-高级数据管理 文章目录R语言一、数值与字符处理函数1.1、数学函数1.2、统计函数1.3、概率函数1.4、字符处理函数1.5、其他实用函数1.6、将函数应用于矩阵与数据框二、控制流2.1、循环&#xff08;for&#xff0c;while&#…

从零开始带你实现一套自己的CI/CD(三)Jenkins+Harbor

目录一、简介二、安装Harbor2.1 Amd64架构安装Harbor2.2 Arm64架构安装Harbor找不到make命令找不到git命令执行make download和make compile_redis失败执行make compile_redis命令执行make prepare_arm_data命令执行make pre_update命令执行make compile COMPILETAGcompile_gol…

【OpenCV-Python】教程:4-4 SIFT 介绍

OpenCV Python SIFT (尺度不变特征变换) 【目标】 SIFT算法SIFT特征点和描述子 【理论】 前面的章节中&#xff0c;我们提到了角点检测&#xff0c;例如Harris角点&#xff0c;他们是旋转不变的&#xff0c;因为&#xff0c;图像无论如何旋转&#xff0c;其角点特性不会发生…

世界杯8强盘点

2022年卡塔尔世界杯&#xff08;英语&#xff1a;FIFA World Cup Qatar 2022&#xff09;是第二十二届世界杯足球赛&#xff0c;是历史上首次在卡塔尔和中东国家境内举行、也是第二次在亚洲举行的世界杯足球赛。除此之外&#xff0c;卡塔尔世界杯还是首次在北半球冬季举行、首次…

docker(八)compose

compose 一 简介&#xff1a; 通过前面几篇文章&#xff0c;我们了解了docker的基本知识&#xff0c;docker帮我们解决了服务打包安装的问题&#xff0c;但是随着服务的不断增多带来了如下问题&#xff1a; 多次使用Dockerfile Build Image或者DockerHub拉取Image;需要创建多…

Spark 动态资源分配参数与源码原理分析

1.1.1、Dynamic Allocation 1.1.1.1 参数说明 1.2 版本 参数名及默认值含义spark.dynamicAllocation.enabled false是否开启动态资源分配&#xff0c;主要是基于集群负载分配executorspark.dynamicAllocation.executorIdleTimeout60sexecutor空闲时间达到规定值&#xff0c…

程序人生:化解互联网 “寒冬” 危机,我教你摆脱困境

三年反复的yi情&#xff0c;近20年史无前例的互联网裁员潮汹涌而至。 寒冬来袭&#xff0c;每一个职场打工人&#xff0c;都感到了寒意。 互联网企业大裁员的底层逻辑&#xff0c;一方面是受宏观环境影响&#xff08;yq、互联网红利结束、政策变化等&#xff09;&#xff0c;…

ChatGPT震撼上市,AI也开始跟你卷了,来一起看看怎么用ChatGPT!!!

强大AI产品&#xff0c;ChatGPT震撼上市&#xff0c;程序员真的要失业了吗&#xff1f; 最近聊天机器人异常火爆&#xff0c;火爆到什么程度&#xff0c;卖个关子&#xff0c;下文解释。 OpenAI推出了ChatGPT&#xff0c;它能够回答各种各样的问题&#xff0c;包括生成代码&a…

Node.js学习下(70th)

一、Buffer 缓冲区 背景 1、浏览器没有储存图片文件等媒体文件的需求&#xff0c;JS 存的都是一些基本数据类型。 2、服务器需要存储图片/视频/音频等媒体文件&#xff0c;因此有了 Buffer 缓冲器。 1. Buffer 是什么 Buffer 是一个和数组类似的对象&#xff0c;不同是 Buf…

python代码学习1

\n 换行符号 \r 回车 \b 后退一个格 \t 制表符&#xff08;4个字符为一组&#xff0c;当不字符被占有时&#xff0c;重新生成一个制表符。如果被占据&#xff0c;不满4个字符时&#xff0c;生成剩余部分空格。&#xff09; #原字符 不希望字符串中转义字符起作用&#xff0…

FME Server 无代码环境中自动化您数据和应用集成工作流

专为现代企业打造 简化数据和应用程序集成&#xff0c;让您的数据为您所用。在FME Desktop中创作工作流&#xff0c;并使用 FME Server 将其自动化&#xff0c;以按计划或响应事件运行数据集成。 构建无代码 Web 应用程序&#xff0c;提供自助式数据提交和验证&#xff0c;并向…