貪心算法理論與實踐總結

文章目錄

        • 一、貪心算法的基本概念
        • 二、貪心算法的適用條件
        • 三、貪心算法的設計步驟
        • 四、貪心算法的經典應用場景
          • 1. 區間調度問題
          • 2. 背包問題
          • 3. 最小生成樹(MST)
          • 4. 單源最短路徑(Dijkstra算法)
          • 5. 霍夫曼編碼
          • 6. 零錢兌換
        • 五、貪心算法的正確性證明方法
        • 六、貪心算法與動態規劃的對比
        • 七、貪心算法的經典例題與解法
          • 1. 跳躍游戲(LeetCode 55)
          • 2. 分發餅干(LeetCode 455)
          • 3. 檸檬水找零(LeetCode 860)
          • 4. 加油站(LeetCode 134)
        • 八、貪心算法的陷阱與注意事項
        • 九、貪心算法的核心思想總結

一、貪心算法的基本概念

定義:貪心算法是指在求解問題時,每一步都選擇當前狀態下的最優解(局部最優),從而希望最終達到全局最優的算法策略。其核心思想是“目光短淺”,不考慮整體影響,僅關注當前步驟的最佳選擇。

二、貪心算法的適用條件

貪心算法并非對所有問題有效,需滿足以下性質:

  1. 貪心選擇性質:問題的全局最優解可以通過一系列局部最優選擇達到。
  2. 最優子結構:問題的最優解包含子問題的最優解。
三、貪心算法的設計步驟
  1. 確定問題的最優子結構:分析問題是否可分解為子問題,且子問題的最優解構成全局最優解。
  2. 定義貪心策略:確定每一步選擇的“最優”標準(如最小代價、最大收益、最短距離等)。
  3. 證明策略正確性:通過數學歸納法或反證法證明局部最優選擇可推導出全局最優解(關鍵難點)。
  4. 實現算法:根據策略設計具體步驟,通常結合數據結構(如優先隊列、排序)優化效率。
四、貪心算法的經典應用場景
1. 區間調度問題
  • 問題描述:給定多個區間,選擇不重疊的最大區間集合。
  • 貪心策略:按區間結束時間排序,每次選結束時間最早的區間,確保剩余時間最大化。
  • 示例:活動選擇問題(LeetCode 435. 無重疊區間)。
2. 背包問題
  • 0-1背包(不適用貪心):物品不可分割,需用動態規劃(貪心可能選到總價非最優的組合)。
  • 分數背包(適用貪心):物品可分割,按“單位重量價值”從高到低選擇,填滿背包。
  • 策略:性價比 = 價值/重量,優先選性價比高的物品。
3. 最小生成樹(MST)
  • Kruskal算法:按邊權從小到大選邊,用并查集避免環,直到連通所有節點(貪心選最小邊)。
  • Prim算法:從任意節點出發,每次選連接當前樹與未連接節點的最小邊(貪心選最小邊)。
4. 單源最短路徑(Dijkstra算法)
  • 策略:維護各節點到源點的最短距離,每次選距離最小的未訪問節點,更新其鄰接節點的距離(貪心選當前最短路徑)。
  • 前提:圖中邊權非負,否則需用Bellman-Ford算法。
5. 霍夫曼編碼
  • 目標:為字符生成最優前綴編碼,使編碼總長度最短。
  • 策略:按字符頻率構建霍夫曼樹,頻率低的字符分配較長編碼,頻率高的分配較短編碼(貪心選頻率最小的兩個節點合并)。
6. 零錢兌換
  • 問題:用最少硬幣數湊出金額amount(若硬幣面值滿足“貪心性質”,如1、5、10、25)。
  • 策略:每次選不超過剩余金額的最大面值硬幣。
  • 注意:若面值不滿足貪心性質(如1、3、4,湊6時貪心選4+1+1,實際最優為3+3),需用動態規劃。
五、貪心算法的正確性證明方法
  1. 交換論證法:假設存在一個最優解與貪心解不同,通過交換兩者的部分選擇,證明貪心解可以轉化為最優解,且不會更差。
  2. 數學歸納法:證明對于所有子問題,貪心策略能得到最優解,進而推導出全局最優。
  3. 反證法:假設貪心策略不能得到最優解,推導出矛盾,從而證明策略的正確性。
六、貪心算法與動態規劃的對比
特性貪心算法動態規劃
決策方式只看當前最優(局部最優)考慮所有可能,記錄子問題解
時間復雜度通常更低(O(n logn)或O(n))通常更高(O(n2)或O(nk))
適用場景滿足貪心選擇性質和最優子結構需考慮子問題重疊和最優子結構
經典問題區間調度、Kruskal、Dijkstra0-1背包、最長公共子序列
七、貪心算法的經典例題與解法
1. 跳躍游戲(LeetCode 55)
  • 問題:給定數組numsnums[i]表示從位置i可跳躍的最大距離,判斷是否能到達最后一個位置。
  • 貪心策略:維護當前能到達的最遠位置max_reach,遍歷數組時更新max_reach,若當前位置超過max_reach則失敗。
  • 代碼思路
    def canJump(nums):max_reach, n = 0, len(nums)for i in range(n):if i > max_reach:  # 無法到達當前位置return Falsemax_reach = max(max_reach, i + nums[i])if max_reach >= n - 1:  # 提前到達終點return Truereturn True
    
2. 分發餅干(LeetCode 455)
  • 問題:每個孩子有需求值g[i],每個餅干有大小s[j],求最多能滿足多少孩子(孩子得到的餅干需≥需求)。
  • 貪心策略:將gs排序,每次用能滿足當前孩子的最小餅干(避免浪費大餅干)。
  • 代碼思路
    def findContentChildren(g, s):g.sort()s.sort()i = j = 0while i < len(g) and j < len(s):if s[j] >= g[i]:  # 餅干滿足孩子需求i += 1j += 1return i
    
3. 檸檬水找零(LeetCode 860)
  • 問題:檸檬水5元,顧客付5、10、20元,求能否給所有顧客正確找零。
  • 貪心策略:優先用大面值零錢找零(但需保留足夠的5元給后續顧客)。
  • 實現:記錄5元和10元的數量,付20元時優先用10+5,其次用3張5元。
4. 加油站(LeetCode 134)
  • 問題:環形路線上有n個加油站,每個加油站有油量gas[i],從i到i+1需消耗cost[i],求是否存在起點繞一圈。
  • 貪心策略:若總油量≥總消耗,則必存在解;遍歷加油站,當累計油量為負時,重置起點為下一個加油站。
八、貪心算法的陷阱與注意事項
  1. 局部最優≠全局最優:貪心策略可能在某些情況下失效(如零錢兌換問題中的非貪心面值),需先證明策略正確性。
  2. 策略選擇的多樣性:同一問題可能有多種貪心策略,需選擇能導向全局最優的策略(如區間調度按結束時間排序比按開始時間更優)。
  3. 結合數據結構優化:優先隊列(堆)、排序、哈希表等常與貪心算法結合,提升效率(如Dijkstra用優先隊列優化)。
九、貪心算法的核心思想總結

貪心算法的本質是通過“短視”的局部最優選擇,逐步構建全局最優解,其優勢在于實現簡單、效率高,但適用范圍受限于問題的貪心性質。在實際應用中,需先分析問題是否滿足貪心條件,再設計策略并驗證正確性。對于不滿足條件的問題,動態規劃或回溯算法可能是更優的選擇。

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

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

相關文章

在 AWS 上重構數據中臺,這家出海企業選擇了數棧

2024年&#xff0c;袋鼠云接到了一個不小的挑戰。 一家貨幣交易所的技術負責人在通話里直接說&#xff1a;“我們現在業務都跑在 AWS&#xff08;亞馬遜云平臺&#xff09; 上了&#xff0c;你們的產品&#xff08;數棧大數據平臺&#xff09;能不能不改代碼直接跑在 AWS 上&a…

STM32CubeIDE中文注釋變亂碼終極解決方案:3步設置永久解決錕斤拷問題!

STM32CubeIDE中文注釋變亂碼終極解決方案&#xff1a;3步設置永久解決錕斤拷問題&#xff01; 前言簡述問題STM32CubeIDE的設置STM32CubeIDE軟件的設置當前工程設置 最重要的一環——添加環境變量重要秘方具體做法 前言 你是否在STM32CubeIDE中遇到過這樣的崩潰場景&#xff1…

Windows VMWare Centos環境下安裝Docker并配置MySql

虛擬機安裝 官網下載Centos Stream 10系統鏡像 安裝了Minimal版&#xff0c;Terminal中粘貼、復制指令不方便&#xff0c;又新建了虛擬機&#xff0c;安裝GUI版 終端輸入指令報錯修復 輸入指令報錯&#xff1a;failed to set locale defaulting to C.UTF-8&#xff0c;安裝語言…

AI能力集成設計與Prompt策略

AI能力集成設計與Prompt策略 在智能客服系統中引入AI能力&#xff0c;必須建立一套架構化、可擴展的AI服務集成體系&#xff0c;并根據不同業務場景制定Prompt策略&#xff0c;從而實現穩定、精準、高效的AI響應能力。 AI能力集成的關鍵組件設計 AI能力集成架構的核心在于通…

深入剖析 CVE-2021-3560 與 CVE-2021-4034:原理、區別與聯系

CVE-2021-3560 和 CVE-2021-4034 是 2021 年曝光的兩個 Linux 本地權限提升漏洞&#xff0c;均涉及 Polkit 組件。由于它們影響廣泛且利用門檻較低&#xff0c;迅速引起安全社區關注。本文將深入分析這兩個漏洞的技術原理、影響范圍、區別與聯系&#xff0c;并結合實際案例&…

Jupyter Notebook 完全指南:從入門到生產力工具

Jupyter Notebook 完全指南&#xff1a;從入門到生產力工具 Jupyter Notebook 已成為數據科學、機器學習和科研領域的標準工具&#xff0c;它完美結合了代碼、文檔和可視化功能。本文將帶您全面了解 Jupyter 的強大功能&#xff0c;并展示如何將其轉化為您的超級生產力工具。 …

HKDF密鑰派生原理與應用詳解

HKDF&#xff08;HMAC-Based Key Derivation Function&#xff09;是一種基于 HMAC&#xff08;Hash-based Message Authentication Code&#xff09;的密鑰派生函數&#xff0c;用于從原始密鑰材料&#xff08;如共享密鑰、隨機數等&#xff09;生成多個加密密鑰&#xff08;如…

SpringBoot + MyBatis 事務管理全解析:從 @Transactional 到 JDBC Connection 的旅程

SpringBoot MyBatis 事務管理全解析&#xff1a;從 Transactional 到 JDBC Connection 的旅程 一、JDBC Connection&#xff1a;事務操作的真正執行者1.1 數據庫事務的本質1.2 Spring 與 Connection 的協作流程 二、從 Transactional 到 JDBC Connection 的完整鏈路2.1 Spring…

Wpf之應用圖標的修改!

前言 Wpf之應用圖標的修改&#xff01; 一、修改步驟 1、準備好ico圖片。 2、右鍵項目》點擊屬性 3、找到win32資源點擊 4、點擊瀏覽找到ioc圖標 5、點擊運行程序 6、右鍵項目點擊打開在資源管理器中打開 找到以下路徑 在該路徑下能看到.exe文件的圖標已經改成你想要的…

Spring Boot整合Redis指南

一、環境準備 在開始整合前&#xff0c;請確保已完成以下準備工作&#xff1a; 已安裝Redis服務&#xff08;安裝指南&#xff09;創建好Spring Boot項目 二、添加依賴 在項目的pom.xml中添加以下依賴&#xff1a; <!-- Redis核心依賴 --> <dependency><gr…

Re-攻防世界

easyEZbaby_app Jadx 這個文件一般是窗口界面&#xff0c;點擊中間的一般就是主函數 Obj1是用戶名&#xff0c;obj2是密碼 用戶名 public boolean checkUsername(String str) { if (str ! null) { try { if (str.length() ! 0 &&…

矩陣題解——搜索二維矩陣 II【LeetCode】

240. 搜索二維矩陣 II 1.1 核心思想 問題描述&#xff1a;給定一個 m x n 的二維矩陣&#xff0c;矩陣的每一行從左到右遞增&#xff0c;每一列從上到下遞增。判斷目標值 target 是否存在于矩陣中。解決思路&#xff1a; 從矩陣的右上角&#xff08;或左下角&#xff09;開始搜…

dockerfile文件詳解之基礎語法

dockerfile文件詳解之基礎語法 一般而言 Dockerfile 可以分為4個部分 &#xff08;1&#xff09;基礎鏡像信息&#xff0c; &#xff08;2&#xff09;維護者信息 &#xff08;3&#xff09;鏡像操作命令 &#xff08;4&#xff09;啟動時執行指令 1-注釋 用 # 來進行注…

WebFuture:獨立一級域名nginx取消配置Secure屬性的問題

問題分析&#xff1a; 部分站群站點使用了獨立一級域名&#xff0c;但是前臺問卷調查等模塊無法提交&#xff0c;排查是由于主站啟用了https&#xff0c;配置了cookies的Secure屬性是true&#xff0c;但是子站的獨立一級域名沒有使用https&#xff0c;所以瀏覽器不能寫入cooki…

【網站內容安全檢測】之3:獲取所有外部域名訪問后圖像

Go語言調用Chrome瀏覽器去進行截圖的操作&#xff0c;對電腦的性能要求比較高&#xff0c;所以速度比較有限&#xff0c;但是目前來看這種方式可以最佳的去獲取網頁加載后的結果。 main.go package mainimport ("context""errors""flag""…

華曦達港股IPO遞表,AI Home生態構建智能生活新藍圖

在智能家居逐漸普及的當下&#xff0c;華曦達打造的AI Home生態為用戶提供了更智能、便捷的生活解決方案&#xff0c;在行業中展現出獨特優勢。 華曦達AI Home生態由AI Home系統平臺、AI Home基礎設施、AI Home設備以及可連接外部設備的開放式設備矩陣構成&#xff0c;是一個開…

java+vue+SpringBoo智慧農業專家遠程指導系統(程序+數據庫+報告+部署教程+答辯指導)

源代碼數據庫LW文檔&#xff08;1萬字以上&#xff09;開題報告答辯稿ppt部署教程代碼講解代碼時間修改工具 技術實現 開發語言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot數據庫&#xff1a;mysql 開發工具 JDK版本&#xff1a;JDK1.…

免費AI助手工具深度測評:Claude4本地化部署與實戰應用指南

免費AI助手工具深度測評&#xff1a;Claude4本地化部署與實戰應用指南 AI無限對話免費Rovo工具Claude4碾壓cursor和augment 前言 在AI工具日益普及的今天&#xff0c;大多數高質量的AI助手都需要付費訂閱或有使用限制。然而&#xff0c;最近發現了一款基于Claude 4的免費AI助手…

MCP瀏覽器工具:playwright、chrome-mcp

參考&#xff1a; https://github.com/microsoft/playwright-mcp https://github.com/hangwin/mcp-chrome chrome-mcp安裝需要額外安裝成瀏覽器插件 用cherrystudio v1.4.5測試 mcp配置&#xff1a; "chrome-mcp-server": {"name": "chrome-mcp-serve…

水利水電安全員考試不同等級的考試內容有哪些區別?

水利水電安全員考試一般分為企業主要負責人&#xff08;A 類&#xff09;、項目負責人&#xff08;B 類&#xff09;和專職安全生產管理人員&#xff08;C 類&#xff09;三個等級。不同等級的考試內容都包括安全生產知識和管理能力兩部分&#xff0c;但具體的側重點有所不同。…