当前位置:首页 > JavaScript

js实现贪心算法

2026-01-31 02:15:34JavaScript

贪心算法简介

贪心算法是一种在每一步选择中都采取当前状态下最优(即最有利)的选择,从而希望导致结果是全局最优的算法。贪心算法常用于解决优化问题,如最短路径、最小生成树等。

贪心算法的基本步骤

贪心算法通常包括以下几个步骤:

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

贪心算法的实现示例

以下是几个常见的贪心算法问题的JavaScript实现。

js实现贪心算法

找零钱问题

给定不同面额的硬币和一个总金额,计算可以凑成总金额的最少硬币数。

function coinChange(coins, amount) {
    coins.sort((a, b) => b - a); // 按面额从大到小排序
    let count = 0;
    for (let coin of coins) {
        while (amount >= coin) {
            amount -= coin;
            count++;
        }
    }
    return amount === 0 ? count : -1;
}

const coins = [1, 2, 5];
const amount = 11;
console.log(coinChange(coins, amount)); // 输出:3 (5 + 5 + 1)

活动选择问题

给定一组活动,每个活动有开始时间和结束时间,选择尽可能多的互不冲突的活动。

js实现贪心算法

function activitySelection(activities) {
    activities.sort((a, b) => a.end - b.end); // 按结束时间排序
    let selected = [];
    let lastEnd = 0;
    for (let activity of activities) {
        if (activity.start >= lastEnd) {
            selected.push(activity);
            lastEnd = activity.end;
        }
    }
    return selected;
}

const activities = [
    { start: 1, end: 4 },
    { start: 3, end: 5 },
    { start: 0, end: 6 },
    { start: 5, end: 7 },
    { start: 8, end: 9 }
];
console.log(activitySelection(activities));

背包问题(分数背包)

给定物品的重量和价值,选择装入背包的物品,使得总价值最大(物品可以分割)。

function fractionalKnapsack(items, capacity) {
    items.sort((a, b) => (b.value / b.weight) - (a.value / a.weight)); // 按单位价值排序
    let totalValue = 0;
    for (let item of items) {
        if (capacity >= item.weight) {
            capacity -= item.weight;
            totalValue += item.value;
        } else {
            totalValue += (capacity / item.weight) * item.value;
            break;
        }
    }
    return totalValue;
}

const items = [
    { weight: 10, value: 60 },
    { weight: 20, value: 100 },
    { weight: 30, value: 120 }
];
const capacity = 50;
console.log(fractionalKnapsack(items, capacity)); // 输出:240

贪心算法的适用场景

贪心算法适用于问题具有最优子结构性质的情况,即局部最优解能导致全局最优解。常见应用包括:

  • 最小生成树(Prim算法、Kruskal算法)
  • 最短路径(Dijkstra算法)
  • 哈夫曼编码
  • 任务调度

贪心算法的局限性

贪心算法不能保证对所有问题都得到最优解,例如0-1背包问题(物品不可分割)就不能用贪心算法解决。

标签: 贪心算法
分享给朋友:

相关文章

排序算法 php实现

排序算法 php实现

以下是用PHP实现的常见排序算法,每种算法均附示例代码和简要说明: 冒泡排序 通过重复比较相邻元素并交换位置实现排序: function bubbleSort($arr) { $n =…

react diff算法实现

react diff算法实现

React Diff 算法实现原理 React 的 Diff 算法(Reconciliation)是虚拟 DOM(Virtual DOM)更新的核心机制,通过高效比较新旧虚拟 DOM 树的差异,最小化…

php实现算法

php实现算法

PHP 实现常见算法的方法 PHP 可以实现多种算法,包括排序、搜索、递归、动态规划等。以下是几种常见算法的 PHP 实现方式。 冒泡排序(Bubble Sort) 冒泡排序通过多次遍历数组,…

php 实现算法

php 实现算法

PHP 实现常见算法的方法 PHP 作为一门服务器端脚本语言,可以实现多种算法。以下是一些常见算法的 PHP 实现示例。 排序算法 冒泡排序 function bubbleSort($arra…

php实现欧几里得算法实现

php实现欧几里得算法实现

欧几里得算法简介 欧几里得算法(辗转相除法)用于计算两个非负整数的最大公约数(GCD)。其核心思想是通过反复用较小数除较大数取余,直到余数为0,此时的除数即为最大公约数。 PHP实现方法 以下是用P…

php 实现共识算法

php 实现共识算法

PHP 实现共识算法的基础方法 共识算法是分布式系统中确保数据一致性的核心机制,PHP 可通过特定设计实现简化版本的共识逻辑。以下是常见实现方式: 基于Paxos的简化实现 Paxos 算法的 P…