貪心算法與動態規劃

1. 什么是貪心算法?

貪心算法是一種在每一步選擇中都采取在當前狀態下最好最優(即最有利)的選擇,從而希望導致結果是全局最好或最優的算法。

核心思想:“每步都貪心地選擇眼前最好的,不去考慮整個未來的長遠情況”。

它就像我們生活中“只顧眼前利益”的決策方式。例如,在找零錢時,為了湊出某個金額,我們總是先給出最大面額的鈔票,然后再給更小的,這就是一種貪心思想。

2. 貪心算法的基本要素

一個問題是適用于貪心算法,通常需要具備兩個重要的性質:

  1. 貪心選擇性質

    • 定義:一個問題的全局最優解可以通過一系列局部最優的選擇(即貪心選擇)來達到。
    • 解釋:這是貪心算法可行的前提。它要求我們在做貪心選擇時,不會影響子問題的解。也就是說,我們做完一次選擇后,只需要解決一個更小的子問題,而不需要回頭重新考慮之前的選擇。
  2. 最優子結構

    • 定義:一個問題的最優解包含其子問題的最優解。
    • 解釋:這是動態規劃和貪心算法都具備的性質。如果整個問題的最優解可以由各個子問題的最優解推導出來,那么我們就說這個問題具有最優子結構。

簡單來說:貪心算法在每一步做出一個不可撤回的決策,并且希望每一步的局部最優能最終堆砌出全局最優。

3. 貪心算法的基本步驟

  1. 建立數學模型:將問題抽象為一個數學決策模型。
  2. 分解問題:將待求解的問題分解成若干個子問題。
  3. 制定貪心策略:根據題意,選擇一個貪心準則,決定如何做出當前的最優選擇。這是貪心算法的核心和難點。
  4. 求解子問題:根據貪心策略,一步步得到子問題的局部最優解。
  5. 組合成最終解:將所有的局部最優解組合成原問題的一個解。

4. 經典示例

示例1:找零錢問題

問題:假設硬幣體系是 1元、5角、1角、5分、1分。現在要找給顧客 1元8角6分,如何找零才能使找零的硬幣個數最少?

貪心策略每一步都使用當前可用的最大面額的硬幣

步驟

  1. 1元8角6分 = 186分
  2. 先找 1元(100分),剩余 86分。
  3. 找不了1元了,找 5角(50分),剩余 36分。
  4. 找不了5角了,找 1角(10分),可以找3個,剩余 6分。
  5. 找 5分(5分),剩余 1分。
  6. 找 1分(1分),完成。

找零方案為:1個1元,1個5角,3個1角,1個5分,1個1分。總共 7 枚硬幣

為什么這是有效的? 在這個特定的硬幣體系( canonical coin systems )中,貪心算法總能得到最優解。但注意,如果硬幣體系很奇怪(例如有 1分, 3分, 4分),要湊出 6分:

  • 貪心法:先拿4分,剩余2分,再拿兩個1分,共3枚硬幣(4,1,1)。
  • 最優解:其實是兩個3分,共2枚硬幣(3,3)。
    所以,貪心算法并不總是能得到最優解!
示例2:活動選擇問題

問題:有一系列活動,每個活動有開始時間和結束時間。同一時間只能進行一個活動。如何選擇才能使能進行的活動數量最多?

貪心策略每次都選擇結束時間最早的活動,這樣就能為后續活動留下更多的時間。

步驟

  1. 將所有活動按結束時間從早到晚排序。
  2. 選擇第一個結束的活動。
  3. 接下來,選擇開始時間晚于或等于上一個已選活動結束時間的活動中,結束時間最早的那個。
  4. 重復步驟3,直到沒有活動可選。

這個策略被證明總能得到最優解。

5. 貪心算法 vs 動態規劃

這是一個常見的困惑點,因為它們都用于求解優化問題且都具有最優子結構性質。

特性貪心算法動態規劃
決策方式每步做一個不可撤回的決策,不考慮未來每步決策依賴于子問題的解,需要保存所有子問題的解并根據這些解做出決策。
子問題做出一次貪心選擇后,只產生一個子問題通常會產生多個重疊子問題
效率高效,通常時間復雜度更低。相對較低,因為需要解決所有子問題。
適用范圍要求問題具有貪心選擇性質適用范圍更廣,只要具有最優子結構(即使沒有貪心選擇性質)。
結果不一定得到全局最優解總是得到全局最優解

關鍵區別:動態規劃在做出決策時,需要考慮所有可能的選擇(通常通過比較得出);而貪心算法則直接做出一個“看似最好”的選擇,并且不再回頭。

6. 貪心算法的優缺點

優點

  • 高效:算法通常簡單、直接,時間復雜度低。
  • 易于實現:邏輯清晰,代碼通常不長。

缺點

  • 局部最優不等于全局最優:這是最大的陷阱。很多問題無法用貪心算法得到真正的最優解。
  • 證明困難:如何證明一個貪心策略一定能得到全局最優解,通常是比較困難的。

7. 如何判斷能否使用貪心算法?

這是一個沒有萬能公式的問題,但可以遵循以下思路:

  1. 先嘗試:先想一個貪心策略,然后用一些簡單的測試用例(尤其是邊界 case)去驗證它是否能得到最優解。
  2. 舉反例:嘗試思考是否存在一種情況,讓你的貪心策略會做出錯誤的選擇。如果能輕易找到反例,則說明貪心算法不適用。
  3. 數學證明:嘗試從數學上證明該問題具有貪心選擇性質最優子結構。這需要較強的數學功底,也是算法競賽和研究的重點。

總結

貪心算法是一種強大而直觀的“短視”算法。它通過一系列局部最優決策來構建解,期望最終得到全局最優解。

  • 核心:制定正確的貪心策略
  • 關鍵:問題必須具有貪心選擇性質最優子結構
  • 陷阱:局部最優不一定是全局最優。
  • 對比:與動態規劃相比,它更高效但不總是最優;動態規劃更通用但更耗時。

掌握貪心算法需要大量的練習,去熟悉各種經典問題(如霍夫曼編碼、最小生成樹-Prim和Kruskal算法、單源最短路徑-Dijkstra算法等)的貪心策略。

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

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

相關文章

學會“讀網頁”:生成式 AI 在足球賽事信息整理中的實戰

逐步教程(Step-by-Step) — 適合初學者與教學類文章 背景(為什么要這樣做) 對于足球迷、資訊編輯與數據分析師來說,最快、最準確把握一場比賽的核心信息至關重要:比分、關鍵事件(進球、點球、紅…

BM3D 圖像降噪快速算法的 MATLAB 實現

BM3D 圖像降噪快速算法的 MATLAB 實現1. 快速 BM3D 算法流程(概述)步驟操作加速技巧① 分組塊匹配 堆疊FFT 互相關② 協同濾波3D 變換 硬閾值FFT 沿第三維③ 聚合加權平均稀疏矩陣累加 2. 核心函數(單文件版) 保存為 bm3d_fast.…

Go的schedt調度(runtime/proc.go)

1. 創建go的入口函數// Create a new g running fn. // Put it on the queue of gs waiting to run. // The compiler turns a go statement into a call to this. func newproc(fn *funcval) {gp : getg()pc : sys.GetCallerPC()systemstack(func() {newg : newproc1(fn, gp, …

Ubuntu 服務器配置轉發網絡訪問

配置文檔:Ubuntu 服務器轉發網絡訪問 一、網絡拓撲以以下網絡拓撲為示例Ubuntu 服務器(兩個網卡) eth1 10.66.71.222 (接入內網)eno1 192.168.2.100 (直連相機) 相機ip 192.168.2.1 Windows 客…

為什么企業需要高防IP

1. 抵御日益猖獗的DDoS攻擊 現代DDoS攻擊規模已突破Tbps級別 傳統防火墻無法應對大規模流量攻擊 高防IP采用分布式清洗中心,可輕松抵御300Gbps以上的攻擊流量 2. 保障業務連續性 網絡中斷1小時可能造成數百萬損失 高防IP確保服務99.99%可用性 智能切換機制實…

CSS基礎 - 選擇器備忘錄 --筆記5

目錄基礎選擇器組合器偽類選擇器屬性選擇器選擇器可以選中頁面上的特定元素并為其指定樣式。 CSS有多種選擇器。 基礎選擇器 標簽選擇器 – tagname:匹配目標元素的標簽名。優先級是0,0,1。如:p、h1、div類選擇器 – .class:匹配class屬性中…

自動駕駛中的傳感器技術46——Radar(7)

衛星雷達(又稱為分布式雷達)主要講當前雷達的雷達信號處理計算以及雷達目標相關的一些感知算法都遷移到中央域控進行,雷達端基本只負責數據采集,這樣做的影響如下: 雷達端成本與功耗降低; 雷達端采樣得到的…

【論文閱讀】Diff-Privacy: Diffusion-based Face Privacy Protection

基于擴散模型的人臉隱私保護方法——DiffPrivacy,解決了兩類人臉隱私任務:匿名化(anonymization)和視覺身份信息隱藏(visual identity information hiding)。1. 研究背景隨著人工智能和大數據技術的普及&am…

React 原理篇 - 深入理解虛擬 DOM

一、什么是虛擬 DOM? 在前端開發中,“虛擬 DOM” 是一個高頻出現的術語,尤其在 React 生態中被廣泛討論。但很多開發者對它的理解往往停留在 “JS 對象” 這個表層認知上。 實際上,虛擬 DOM 是一種編程概念—— 在這個概念里&…

對匯編的初理解

此處是一個簡單的函數,里面將調用了一個函數add()函數這里是函數的原型這里是調用lcd函數產生的匯編語言,翻譯過來就是r11,r0cnt(r4cnt,前文有提及),然后調用add函數,此處BL是指會回到指令的下一…

《Python 自動化實戰:從零構建一個文件同步工具》

《Python 自動化實戰:從零構建一個文件同步工具》 一、開篇引入:為什么我們需要文件同步? 你是否有過這樣的困擾: 公司電腦和家里電腦上都有工作項目,每次更新都要手動復制? U 盤頻繁傳輸文件,不僅麻煩還容易出錯? 項目文件夾動輒幾 G,每次同步都耗時長、效率低? 在…

工業相機與鏡頭的靶面尺寸詳解:選型避坑指南

在機器視覺系統中,相機與鏡頭的靶面尺寸匹配是一個非常關鍵卻又經常被忽略的細節。選錯了,不但影響圖像質量,還可能導致畫面“黑角”、視野不符、鏡頭浪費等問題。 今天我們就用通俗易懂的方式,聊一聊相機與鏡頭靶面尺寸的那些事兒…

使用 Go 和 go-commons 實現內存指標采集并對接 Prometheus

文章目錄一、準備工作二、編寫內存采集代碼三、運行 Exporter四、接入 Prometheus五、可擴展思路總結在運維和監控領域,資源指標采集 是必不可少的一環。CPU、內存、磁盤、網絡這些系統資源,需要實時采集并上報到監控系統中。 本文以 內存指標采集 為例&…

webrtc弱網-IntervalBudget類源碼分析與算法原理

一、核心功能 IntervalBudget 類用于基于時間窗口的帶寬預算管理。它根據設定的目標比特率(kbps)和一個固定時間窗口(500ms),計算在該時間窗口內可用的字節數(即“預算”),并支持預…

深度學習基本模塊:RNN 循環神經網絡

循環神經網絡(RNN)是一種專門用于處理序列數據的神經網絡架構。與處理空間數據的卷積神經網絡(Conv2D)不同,RNN通過引入循環連接使網絡具有"記憶"能力,能夠利用之前的信息來影響當前的輸出&#…

React18學習筆記(二) React的狀態管理工具--Redux,案例--移動端外賣平臺

文章目錄一.Redux的基礎用法1.示例:普通網頁中的Redux計步器2.Redux管理數據的流程3.配套工具和環境準備3.1.配套工具3.2.環境準備4.示例:React項目中的Redux計步器思路步驟step1:創建子模塊step2:導入子模塊step3:注入store實例step4:React組件內使用store中的數據step5:在組件…

34.Socket編程(UDP)(上)

點分十進制字符串IP 轉 32位網絡序列IP 分析:1)IP轉成4字節 2)4字節轉成網絡序列 思路: "192.168.1.1" 進行字符串劃分,以 "." 為分割符,分割出"192",&qu…

Redis的持久化工具包—RDB AOF

文章目錄 前言 一、RDB 持久化(快照持久化) 1. 定義 2. RDB 觸發機制 (1)手動觸發 (2)自動觸發 3. RDB 持久化流程 4. RDB 核心配置 5. RDB 優缺點 二、AOF 持久化(日志持久化) 1. 定…

【Web安全】XXL-JOB框架SRC高頻漏洞分析總結

文章目錄前言一、核心漏洞分類與技術細節二、漏洞關聯利用與攻擊路徑三、版本演進與修復策略四、安全運維建議五、典型漏洞復現環境搭建六、總結前言 XXL-JOB是國內主流的開源分布式任務調度框架,由徐雪里開發維護,以輕量易用、高可用、適配分布式場景等…

Capacitor 打包后接口訪問不到的排查經歷

我最近在用 Quasar Capacitor 6 做一個 Android App,前端用的是 Vue3 Quasar,打包交給 Capacitor 去跑在手機的 WebView 里,后端是 FastAPI 提供接口。開發模式下一切順利,瀏覽器里訪問接口沒有任何問題,我甚至覺得打…