当前位置:首页 > JavaScript

js实现贪心算法

2026-01-31 02:15:34JavaScript

贪心算法简介

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

贪心算法的基本步骤

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

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

贪心算法的实现示例

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

找零钱问题

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

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)

活动选择问题

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

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

贪心算法的适用场景

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

js实现贪心算法

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

贪心算法的局限性

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

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

相关文章

react diff算法实现

react diff算法实现

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

php实现欧几里得算法实现

php实现欧几里得算法实现

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

用js来实现所有算法

用js来实现所有算法

在 JavaScript 中实现所有算法是一个庞大的任务,因为算法种类繁多,涵盖数据结构、排序、搜索、图论、动态规划等多个领域。以下是部分常见算法的 JavaScript 实现示例,供参考: 排序算…

用JS实现快速排序算法

用JS实现快速排序算法

快速排序的原理 快速排序是一种分治算法,通过选择一个基准元素(pivot)将数组分为两部分,一部分小于基准,另一部分大于基准,然后递归地对这两部分进行排序。 代码实现 function quic…

js锚点定位算法实现

js锚点定位算法实现

实现锚点定位的基本方法 使用Element.scrollIntoView()方法是最简单的实现方式。该方法将滚动页面使指定元素出现在视口中。 document.getElementById('tar…

js实现算法

js实现算法

JavaScript 实现常见算法的方法 排序算法 快速排序的实现: function quickSort(arr) { if (arr.length <= 1) return arr;…