【JavaScript 算法】貪心算法:局部最優解的構建

在這里插入圖片描述

🔥 個人主頁:空白詩

在這里插入圖片描述

文章目錄

    • 一、貪心算法的基本概念
      • 貪心算法的適用場景
    • 二、經典問題及其 JavaScript 實現
      • 1. 零錢兌換問題
      • 2. 活動選擇問題
      • 3. 分配問題
    • 三、貪心算法的應用
    • 四、總結

在這里插入圖片描述

貪心算法(Greedy Algorithm)是一種逐步構建解決方案的方法。在每一步選擇中,貪心算法總是選擇在當前看來最優的選擇,希望通過這些局部最優選擇最終能構建出全局最優解。貪心算法的特點是簡單高效,但它并不總能保證得到最優解。


一、貪心算法的基本概念

貪心算法的核心思想是每一步都選擇當前最優的決策,不考慮未來的影響。貪心算法的基本步驟通常包括以下幾個:

  1. 選擇:選擇當前最優的選項。
  2. 驗證:驗證當前選擇是否可行(通常包括是否滿足約束條件)。
  3. 構建:將當前選擇加入到最終的解決方案中。

貪心算法的適用場景

貪心算法通常適用于以下場景:

  1. 最小生成樹:如Kruskal和Prim算法。
  2. 最短路徑問題:如Dijkstra算法。
  3. 區間調度問題:如選擇最多的不重疊區間。

二、經典問題及其 JavaScript 實現

1. 零錢兌換問題

假設我們有幾種不同面值的硬幣,1元、2元和5元。我們希望用最少數量的硬幣來湊出某個金額。

問題描述:給定不同面值的硬幣和一個總金額,求最少數量的硬幣。

/*** 求最少數量的硬幣組合* @param {number[]} coins - 硬幣面值數組* @param {number} amount - 總金額* @returns {number} - 最少硬幣數量,如果無法湊出總金額返回 -1*/
function coinChange(coins, amount) {// 硬幣面值從大到小排序coins.sort((a, b) => b - a);let count = 0;for (let coin of coins) {// 盡量使用當前面值最大的硬幣let num = Math.floor(amount / coin);count += num;amount -= num * coin;// 如果總金額為 0,直接返回if (amount === 0) return count;}// 如果無法湊出總金額,返回 -1return -1;
}// 示例:用1元、2元和5元湊出11元的最少硬幣數量
console.log(coinChange([1, 2, 5], 11)); // 輸出 3 (5 + 5 + 1)

2. 活動選擇問題

假設我們有一組活動,每個活動有開始時間和結束時間。我們希望選擇盡可能多的活動,使得它們互不重疊。

問題描述:給定一組活動,選擇盡可能多的不重疊活動。

/*** 求最多的不重疊活動數量* @param {number[][]} activities - 活動的開始和結束時間數組* @returns {number} - 最多不重疊活動數量*/
function maxActivities(activities) {// 按照活動結束時間排序activities.sort((a, b) => a[1] - b[1]);let count = 0;let end = 0;for (let activity of activities) {if (activity[0] >= end) {// 選擇當前活動count++;end = activity[1];}}return count;
}// 示例:選擇最多的不重疊活動
console.log(maxActivities([[1, 3], [2, 4], [3, 5], [0, 6], [5, 7], [8, 9], [5, 9]]));
// 輸出 4 (選擇活動 [1, 3], [3, 5], [5, 7], [8, 9])

3. 分配問題

假設我們有一組任務和一組工人,每個工人能完成的任務數量有限。我們希望盡可能多地完成任務。

問題描述:給定任務和工人的能力,盡可能多地分配任務。

/*** 求最多分配任務數量* @param {number[]} tasks - 任務難度數組* @param {number[]} workers - 工人能力數組* @returns {number} - 最多分配任務數量*/
function maxTaskAssignment(tasks, workers) {// 任務和工人分別排序tasks.sort((a, b) => a - b);workers.sort((a, b) => a - b);let taskIndex = 0;let workerIndex = 0;let count = 0;while (taskIndex < tasks.length && workerIndex < workers.length) {if (workers[workerIndex] >= tasks[taskIndex]) {// 分配任務給當前工人count++;taskIndex++;}workerIndex++;}return count;
}// 示例:盡可能多地分配任務
console.log(maxTaskAssignment([1, 2, 3], [3, 2, 1])); // 輸出 3 (每個工人完成一個任務)

三、貪心算法的應用

貪心算法在實際開發中有廣泛的應用,常見的應用場景包括:

  1. 圖算法:最小生成樹、最短路徑問題。
  2. 活動選擇:選擇最多的不重疊活動。
  3. 任務分配:將任務盡可能多地分配給工人。
  4. 區間覆蓋:用最少數量的區間覆蓋所有點。

四、總結

貪心算法是一種通過局部最優選擇構建全局最優解的方法。雖然它不總能保證得到最優解,但在許多實際問題中表現良好。通過理解和應用貪心算法,我們可以有效地解決許多復雜的優化問題。希望通過本文的介紹,大家能夠更好地理解和應用貪心算法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45994.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45994.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45994.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mybatisPlus和mybatis的版本沖突問題、若依換成MP、解決git無法推送、使用若依框架的swagger、以后再遇到團隊項目應該怎么做。

20240716 一. mybatisPlus和mybatis的版本沖突問題1. 使用前的準備2. 我遇到了一個很嚴重的問題。3. 解決問題&#xff0c;好吧也沒解決&#xff0c;發現問題&#xff01;&#xff01; 二、該死的git&#xff01;&#xff01;&#xff01;&#xff01;1. 解決無法在idea中使用g…

【Outlook】從Outlook新版回歸經典版全攻略

引言 在微軟宣布計劃于2024年底淘汰郵件應用&#xff08;Mail app&#xff09;之后&#xff0c;許多用戶發現新版Outlook應用&#xff08;Outlook (new)&#xff09;在他們的Windows 11/10系統上自動啟動。如果您更傾向于使用經典版Outlook&#xff08;Outlook (classic)&…

webpack優化

優化方向 熱更新 概念 /** hmr: hot module replacement 熱模塊替換 / 模塊熱更新作用&#xff1a; 一個模塊發生改變&#xff0c;只會重新打包這一個模塊&#xff08;而不是打包所有模塊&#xff09;&#xff0c;極大的提升了構建速度樣式文件&#xff1a; 可以使用hmr功能…

Facebook:數字時代的社交瑰寶

在當今數字化飛速發展的時代&#xff0c;社交媒體已經成為人們日常生活中不可或缺的一部分&#xff0c;而Facebook作為其中的領軍者&#xff0c;不僅連接了全球數十億的用戶&#xff0c;更深刻地改變了人們的社交方式和生活方式。本文將探討Facebook如何成為數字時代的社交瑰寶…

python如何創建SQLite 數據庫連接,如何將數據庫存儲在內存中?

嗨&#xff0c;大家好&#xff0c;我是蘭若姐姐。今天給大家說下如何創建SQLite 數據庫連接,并將數據庫存儲在內存中,這是一種臨時的、私有的數據存儲空間&#xff0c;一般用于以下情形&#xff1a; 什么都不說&#xff0c;先上代碼&#xff1a; import sqlite3創建數據庫連接…

再談有關JVM中的四種引用

1.強引用 強引用就是我們平時使用最多的那種引用&#xff0c;就比如以下的代碼 //創建一個對象 Object obj new Object();//強引用 這個例子就是創建了一個對象并建立了強引用&#xff0c;強引用一般就是默認支持的當內存不足的時候&#xff0c;JVM開始垃圾回收&#xff0c…

防火墻的冗余基礎知識+實驗檢測

將之前先理清需要注意的知識點&#xff1a; 1、注意防火墻冗余時的會話表必須保持一致&#xff0c;這里HRP技術已經做到 2、vrrp是自動開啟搶占的&#xff0c;且是根據優先級進行搶占的 3、免費ARP的作用&#xff1a;告訴交換機的某個IP的mac地址變成了我的這個mac地址 4、HRP …

C++ | Leetcode C++題解之第231題2的冪

題目&#xff1a; 題解&#xff1a; class Solution { private:static constexpr int BIG 1 << 30;public:bool isPowerOfTwo(int n) {return n > 0 && BIG % n 0;} };

強化學習——多臂老虎機問題(MAB)【附python代碼】

文章目錄 一、問題描述1.1 問題定義1.2 形式化描述1.3 累積懊悔1.4 估計期望獎勵 二、解決方法2.1 ?-貪婪算法2.2 上置信界算法2.3 湯普森采樣算法2.4 小結 一、問題描述 1.1 問題定義 有一個用于 K 根拉桿的老虎機&#xff0c;每一根拉桿都對應一個關于獎勵的概率分布 R 。每…

【C++題解】1154. 數組元素的查找

問題&#xff1a;1154. 數組元素的查找 類型&#xff1a;數組找數 題目描述&#xff1a; 給你 m 個整數&#xff0c;查找其中有無值為 n 的數&#xff0c;有則輸出該數第一次出現的位置,沒有則輸出 ?1 。 輸入&#xff1a; 第一行一個整數 m 代表數的個數 ( 0≤m≤100 ) 。…

Qt基礎 | Qt全局定義 | qglobal頭文件中的數據類型、函數、宏定義

文章目錄 一、數據類型定義二、函數三、宏定義 QtGlobal頭文件包含了 Qt 類庫的一些全局定義 &#xff0c;包括基本數據類型、函數和宏&#xff0c;一般的Qt類的頭文件都會包含該文件。 詳細內容可參考&#xff1a;https://doc.qt.io/qt-5/qtglobal.html 一、數據類型定義 為了…

數據可視化在智慧醫療中的重要應用

在現代智慧醫療的推動下&#xff0c;數據可視化技術正日益成為醫療領域的重要工具。通過將復雜的醫療數據轉換為直觀的圖表和圖形&#xff0c;數據可視化不僅提升了醫療服務的效率&#xff0c;還極大地改善了患者的就醫體驗。 在智慧醫療中&#xff0c;數據可視化首先在電子病歷…

客流統計系統優化景區服務流程,增強游客滿意度

在當今旅游業蓬勃發展的時代&#xff0c;景區面臨著越來越多的挑戰和機遇。如何提供更優質、更高效的服務&#xff0c;滿足游客日益增長的需求&#xff0c;成為了景區管理者們關注的焦點。客流統計系統作為一種創新的技術手段&#xff0c;正逐漸成為優化景區服務流程、增強游客…

MySQL主從同步的原理與思考

摘要 分析主從同步出現的原因&#xff0c;MySQL實現主從同步的原理&#xff0c;思考實現原理的局限性和優點 背景 在實際應用中主從同步常用于實現備份、負載均衡和高可用。數據冗余的目的是提高數據的安全性&#xff0c;避免因磁盤損壞導致數據丟失的問題。讀寫分離的目的是…

ubuntu系統Docker常用命令

1.查看docker是否開機啟動 sudo systemctl list-unit-files | grep enable|grep docker 2.設置開機啟動 sudo systemctl enable docker 3.關閉docker開機啟動 sudo systemctl disable docker 4.開啟docker服務 sudo service docker start 5.關閉docker服務 sudo servi…

基于CNN的MINIST手寫數字識別項目代碼以及原理詳解

文章目錄 項目簡介項目下載地址項目開發軟件環境項目開發硬件環境前言一、數據加載的作用二、Pytorch進行數據加載所需工具2.1 Dataset2.2 Dataloader2.3 Torchvision2.4 Torchtext2.5 加載項目需要使用的庫 三、加載MINIST數據集3.1 數據集簡介3.2 數據預處理3.3 加載數據集 四…

2.10、matlab中字符、數字、矩陣、字符串和元胞合并為字符串并將字符串以不同格式寫入讀出excel

1、前言 在 MATLAB 中&#xff0c;可以使用不同的數據類型&#xff08;字符、數字、矩陣、字符串和元胞&#xff09;合并為字符串&#xff0c;然后將字符串以不同格式寫入 Excel 文件。 以下是一個示例代碼&#xff0c;展示如何將不同數據類型合并為字符串&#xff0c;并以不…

重生奇跡mu魔法師瞬間移動技能

瞬間移動是勇士大陸魔法師所擁有的一項技能。一開始&#xff0c;許多玩家對這種技能的用處感到困惑。實際上&#xff0c;這種技能只能在游戲中不同的位置間進行移動&#xff0c;不能隨機傳送到地圖的其他坐標位置。 一位重生奇跡mu魔法師在PK中不小心使用了一項技能&#xff0c…

【仿真建模-anylogic】數據源組件

Author&#xff1a;趙志乾 Date&#xff1a;2024-07-16 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 簡介 仿真模型依賴的數據源通常有Excel文件、MySQL數據庫兩種&#xff1b;針對小數量、大數據量以及是否允許外部依賴等場景設計了一…

labview使用斑馬打印機打印標簽

使用ZebraDesigner 3設計標簽樣式 設計完成后打印至文件&#xff0c;生成prn文件 用記事本打開prn文件 ^MMT 標簽撕下 ^MMP 標簽剝離 按照需求替換FD--------^FS中間內容