当前位置:首页 > 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背包问题(物品不可分割)就不能用贪心算法解决。

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

相关文章

用JS实现快速排序算法

用JS实现快速排序算法

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

js回文算法实现

js回文算法实现

回文算法的实现方法 方法一:使用字符串反转 将字符串反转后与原字符串比较,若相同则为回文。 function isPalindrome(str) { const reversedStr = st…

算法的js实现

算法的js实现

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

js实现火焰算法

js实现火焰算法

火焰算法实现基础 火焰算法(Fire Effect)是一种模拟火焰燃烧效果的图形算法,常用于生成动态火焰视觉效果。在JavaScript中,可以通过Canvas或WebGL实现。 使用Canvas实…

排序算法 php实现

排序算法 php实现

以下是在PHP中实现常见排序算法的几种方法,每种算法均附上代码示例和简要说明: 冒泡排序 通过重复比较相邻元素并交换位置完成排序,时间复杂度为O(n²)。 function bubbleSort(…

php实现排序算法

php实现排序算法

PHP实现冒泡排序 冒泡排序通过重复遍历数组,比较相邻元素并交换位置实现排序。时间复杂度为O(n²),适合小规模数据排序。 function bubbleSort($array) { $le…