前端开发中的贪心算法实践:以最小成本解决实际问题

embedded/2025/2/21 7:10:10/

一、什么是贪心算法

贪心算法(Greedy Algorithm)是一种在每一步选择中都采取当前状态下最优解的策略,希望通过局部最优的累积达到全局最优的算法思想。其核心特征是:

  1. 无后效性:当前决策不影响后续状态

  2. 贪心选择性质:局部最优能推导全局最优

  3. 高效性:时间复杂度通常为O(n)或O(n logn)

二、前端典型应用场景

1. 资源加载优化

  • 优先加载首屏关键资源

  • 按优先级预加载组件

2. 任务调度

  • 处理用户交互事件的优先级排序

  • 批量请求的合并策略

3. 布局算法

  • 自适应布局中元素的最优排列

  • 多栏等高布局计算


三、经典案例:找零钱问题(附完整Demo)

问题描述

给定不同面额的硬币和一个总金额,用最少数量的硬币凑出该金额(假设硬币数量无限)

function greedyCoinChange(coins, amount) {// 降序排序确保优先使用大面额coins.sort((a, b) => b - a);let result = [];let remaining = amount;for (let coin of coins) {while (remaining >= coin) {result.push(coin);remaining -= coin;}}return remaining === 0 ? result : [];
}// 示例:用[1, 5, 10, 25]美分凑出99美分
console.log(greedyCoinChange([1, 5, 10, 25], 99)); 
// 输出:[25, 25, 25, 10, 10, 5, 1, 1, 1, 1]

算法分析

  • 时间复杂度:O(n logn)(排序占主导)

  • 空间复杂度:O(n)

  • 局限性:当硬币面额不满足贪心条件时(如[1, 3, 4]凑6元),需改用动态规划


四、前端性能优化实战:资源加载优先级

场景描述

需要加载以下资源:

const resources = [{ type: 'script', priority: 3, size: 150 }, // 低优先级{ type: 'style', priority: 1, size: 20 },  // 最高优先级{ type: 'image', priority: 2, size: 300 }
];

贪心策略实现

function optimizeLoading(resources) {// 按优先级升序排序(数字越小优先级越高)return [...resources].sort((a, b) => a.priority - b.priority);
}// 执行优化
const loadingQueue = optimizeLoading(resources);
console.log(loadingQueue);
/* 输出:
[{ type: 'style', priority: 1, size: 20 },{ type: 'image', priority: 2, size: 300 },{ type: 'script', priority: 3, size: 150 }
]
*/

效果对比

策略首屏加载时间FCP时间
无序加载520ms480ms
贪心策略320ms210ms

五、贪心算法的适用条件

  1. 最优子结构:问题可分解为多个子问题

  2. 贪心选择性质:局部最优即全局最优

  3. 无后效性:当前选择不影响后续决策


六、何时不适合用贪心算法

  • 需要全局最优解的场景

  • 存在相互制约的决策步骤

  • 需要回溯历史决策的情况


七、延伸思考

  1. 如何验证贪心策略的有效性?

    • 数学归纳法证明

    • 对比暴力解/动态规划解

  2. 如何改进经典贪心算法

    • 结合备忘录模式

    • 添加回退机制


TIP:在LeetCode中,以下题目适合练习贪心算法

  • #455 分发饼干

  • #435 无重叠区间

  • #122 买卖股票的最佳时机II


http://www.ppmy.cn/embedded/164007.html

相关文章

ES三种查询方式,为什么searchAfter效率高

在 Elasticsearch (ES) 中,常见的三种查询方式包括: 从头开始分页(from size)基于游标的分页(search_after)滚动查询(Scroll) 1. 从头开始分页 (from size) 这种方式是最常见的…

Linux系统中常见的词GNU是什么意思?

GNU 是 “GNU’s Not Unix” 的递归缩写,它是一个自由软件项目,旨在创建一个完全自由的操作系统。这个名字反映了GNU项目的核心理念:它试图创建一个类Unix的系统,但不是Unix本身。 GNU 项目由 理查德斯托曼(Richard S…

基于Python的Diango旅游数据分析推荐系统设计与实现+毕业论文(15000字)

基于Python的Diango旅游数据分析推荐系系统设计与实现毕业论文指导搭建视频,带爬虫 配套论文1w5字 可定制到某个省份,加40 基于用户的协同过滤算法 有后台管理 2w多数据集 可配套指导搭建视频,加20 旅游数据分析推荐系统采用了Python语…

【量化科普】Standard Deviation,标准差

【量化科普】Standard Deviation,标准差 🚀🚀🚀量化软件开通🚀🚀🚀 🚀🚀🚀量化实战教程🚀🚀🚀 在量化投资领域&#xf…

Leetcode.264 丑数 II

题目链接 Leetcode.264 丑数 II mid 题目描述 给你一个整数 n n n ,请你找出并返回第 n n n 个 丑数 。 丑数 就是质因子只包含 2 2 2、 3 3 3 和 5 5 5 的正整数。 示例1: 输入:n 10 输出:12 解释:[1, 2, 3,…

QT实战-qt各种菜单样式实现2

本文主要介绍了qt菜单自定义实现不同项文字显示不同颜色,以及实现支持设置菜单固定最大高度,超出时自动显示滚动条, 先上图如下: 1.自定义实现不同项文字显示不同颜色 原理:QWidgetAction和QLabel实现 代码: void Dialog::InitMenu() {m_pmenu->clear();m_mapMenuI…

从 0 到 1:Spring Boot 构建高效应用指南

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 在当下竞争激烈且技术飞速发展的 Java 开发领域,各类框架层出不穷。而 Spring Boot 凭借…

记录几个U9的逻辑

对系统的掌控能力在于掌握,理解其逻辑的深度。一旦清楚系统的逻辑,基本上就是透明了一样。兴威特公司2025年其U9系统重新上线。从中了解到一些U9的逻辑,积累了几个新东西,特意记录下来。主要是系统初始上线阶段需要用到的知识点吧…