Python算法-貪心算法(Greedy Algorithm)

Python算法:貪心算法(Greedy Algorithm)深度解析

引言

貪心算法(Greedy Algorithm)是計算機科學中最基礎的算法設計思想之一,其核心在于通過局部最優選擇逐步構建全局最優解。盡管它并不總能保證得到絕對最優解,但在許多實際場景中(如任務調度、網絡路由、數據壓縮),貪心算法以其高效性和簡潔性成為首選方案。本文將結合Python實現,系統講解貪心算法的原理、應用場景及經典案例。

一、貪心算法的核心思想

1.1 基本定義

貪心算法通過一系列局部最優選擇來構造問題的解。其決策過程具有以下特征:

  • 無后效性:每一步選擇僅依賴當前狀態,不依賴未來決策
  • 不可回溯性:一旦做出選擇,后續步驟無法修改
  • 貪心選擇性質:全局最優解可通過局部最優選擇逐步構造

1.2 適用條件

貪心算法有效需滿足兩個關鍵條件:

  1. 貪心選擇性質:局部最優選擇能導向全局最優
  2. 最優子結構:問題的最優解包含其子問題的最優解

示例:活動選擇問題中,選擇最早結束的活動可留下更多時間給后續活動,符合貪心選擇性質。

二、經典問題解析與Python實現

2.1 活動選擇問題

問題描述:從多個活動中選擇最多不重疊的活動
貪心策略:按結束時間排序,依次選擇不沖突的活動

def activity_selection(start_times, end_times):# 按結束時間排序activities = sorted(zip(start_times, end_times), key=lambda x: x[1])selected = []last_end = 0for start, end in activities:if start >= last_end:selected.append((start, end))last_end = endreturn selected# 示例
start = [1, 3, 0, 5, 8, 5]
end = [2, 4, 6, 7, 9, 9]
print(activity_selection(start, end))  
# 輸出:[(1, 2), (3, 4), (5, 7), (8, 9)]

2.2 分數背包問題

問題描述:在不超過背包容量的前提下,最大化物品總價值
貪心策略:優先選擇單位價值最高的物品

def fractional_knapsack(weights, values, capacity):# 計算單位價值并排序items = sorted(zip(weights, values), key=lambda x: x[1]/x[0], reverse=True)total_value = 0for weight, value in items:if capacity <= 0:breaktake = min(weight, capacity)total_value += value * (take / weight)capacity -= takereturn total_value# 示例
weights = [10, 20, 30]
values = [60, 100, 120]
print(fractional_knapsack(weights, values, 50))  # 輸出:240.0

2.3 霍夫曼編碼

問題描述:通過構建前綴樹實現數據壓縮
貪心策略:合并頻率最低的兩個節點

import heapqclass Node:def __init__(self, freq, symbol, left=None, right=None):self.freq = freqself.symbol = symbolself.left = leftself.right = rightdef __lt__(self, other):return self.freq < other.freqdef huffman_coding(symbols, frequencies):heap = [Node(freq, symbol) for symbol, freq in zip(symbols, frequencies)]heapq.heapify(heap)while len(heap) > 1:left = heapq.heappop(heap)right = heapq.heappop(heap)merged = Node(left.freq + right.freq, left.symbol + right.symbol, left, right)heapq.heappush(heap, merged)# 生成編碼codes = {}def traverse(node, code=''):if node is None:returnif node.left is None and node.right is None:codes[node.symbol] = codetraverse(node.left, code + '0')traverse(node.right, code + '1')traverse(heap[0])return codes# 示例
symbols = ['A', 'B', 'C', 'D']
frequencies = [5, 9, 12, 13]
print(huffman_coding(symbols, frequencies))
# 輸出:{'A': '110', 'B': '111', 'C': '10', 'D': '0'}

三、貪心算法的優缺點分析

3.1 優勢

  1. 時間復雜度低:通常為O(n log n)(排序開銷)
  2. 實現簡單:代碼邏輯直觀,易于調試
  3. 實時性高:適合需要快速決策的場景(如網絡路由)

3.2 局限

  1. 無法保證全局最優:如0-1背包問題中,貪心選擇可能失敗
    # 反例:0-1背包問題
    weights = [25, 20, 15]
    values = [25, 20, 15]
    capacity = 30# 貪心選擇單位價值最高(1.0)的物品,但總重量25超過容量
    # 正確解:選擇后兩個物品(總價值35)
    
  2. 依賴問題結構:需嚴格滿足貪心選擇性質

四、貪心算法與動態規劃的對比

特性貪心算法動態規劃
決策方式局部最優,不可回溯全局最優,可回溯
時間復雜度O(n log n)O(n2)或更高
適用場景具有貪心選擇性質的問題具有最優子結構的問題
典型問題活動選擇、霍夫曼編碼0-1背包、最短路徑

五、實際應用案例

5.1 網絡路由

Dijkstra算法通過貪心策略選擇當前最短路徑節點,逐步構建全局最短路徑樹。

5.2 任務調度

操作系統中的進程調度(如SJF最短作業優先)采用貪心策略,減少平均等待時間。

5.3 數據壓縮

JPEG圖像壓縮中的霍夫曼編碼,通過貪心算法生成最優前綴碼。

六、使用貪心算法的注意事項

  1. 驗證問題適用性:通過數學證明或反例測試貪心策略的有效性
  2. 處理非標準場景:如硬幣找零問題中,非標準面額需改用動態規劃
  3. 結合其他算法:在復雜問題中,貪心算法常作為啟發式方法與動態規劃結合使用

七、總結

貪心算法以其高效性和簡潔性,在算法設計中占據重要地位。通過掌握其核心思想(局部最優→全局最優)和經典案例(活動選擇、霍夫曼編碼),開發者可快速解決一類優化問題。然而,需時刻警惕其局限性——在缺乏貪心選擇性質時,果斷轉向動態規劃或回溯算法。未來,貪心算法將與機器學習結合,在智能決策領域發揮更大價值。

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

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

相關文章

告別臃腫與廣告:精選9款安卓電視桌面Launcher,還你清爽高效體驗 (2025版)

[實測] 9款優秀安卓電視桌面Launcher推薦&#xff1a;告別原生臃腫&#xff0c;重塑清爽TV體驗 引言&#xff1a;當前智能電視桌面的痛點 目前市面上許多智能電視或電視盒子的原生桌面&#xff08;Launcher&#xff09;系統&#xff0c;為了商業推廣和內容聚合&#xff0c;往…

Docker Desktop緊急修復CVSS9.3高危容器逃逸漏洞

Docker公司修復了Windows和macOS版Docker Desktop應用程序中的一個高危漏洞&#xff08;CVE-2025-9074&#xff0c;CVSS評分9.3&#xff09;&#xff0c;攻擊者可能利用該漏洞突破容器隔離限制。漏洞技術細節根據Docker官方文檔披露&#xff0c;惡意容器能夠訪問Docker引擎并在…

攜程旅游的 AI 網關落地實踐

原創 董藝荃 Higress 2025年08月21日 16:32 陜西本文整理自攜程旅游研發總監董藝荃在2025中國可信云大會上的分享&#xff0c;董藝荃 GitHub ID CH3CHO&#xff0c;同時也是 Higress 的 Maintainer。分享內容分為以下4部分。01 大規模應用 AI 技術過程中遇到了哪些問題02 網關…

CloudBase云開發MCP + CodeBuddy IDE:打造智能化全棧理財助手的完整實踐

CloudBase云開發MCP CodeBuddy IDE&#xff1a;打造智能化全棧理財助手的完整實踐 &#x1f31f; Hello&#xff0c;我是摘星&#xff01; &#x1f308; 在彩虹般絢爛的技術棧中&#xff0c;我是那個永不停歇的色彩收集者。 &#x1f98b; 每一個優化都是我培育的花朵&#x…

ESP8266學習

一&#xff0c;連接Wifi1.Esp8266連接手機熱點ATATRST ATCWMODE1 ATCWJAP"ESP8266","123456789"手機查看連接信息2.Esp8266連接手機熱點進入透傳模式ATATRST ATCWMODE1 ATCWJAP"ESP8266","123456789"ATCIPMUX0 ATCIPSTART"TCP&qu…

Mac安裝mitmproxy及操作對監控的請求

在 macOS 上安裝和配置 mitmproxy 是一個相對簡單的過程&#xff0c;可以使用常見的包管理工具如 Homebrew 或直接通過 Python 的包管理工具 pip。以下是詳細的安裝步驟&#xff1a; 方法一&#xff1a;使用 Homebrew 安裝 Homebrew 是 macOS 上流行的包管理工具。它可以快速安…

c++ 數據結構-堆、優先隊列 小總結

之前學習了一些堆、優先隊列的知識點&#xff0c;在此做一個小總結。堆&#xff08;Heap&#xff09;堆&#xff08;Heap&#xff09;是一種特殊的完全二叉樹數據結構&#xff0c;具有以下重要特性&#xff1a;結構特性堆是一棵完全二叉樹&#xff0c;即除了最后一層外&#xf…

編寫Linux下usb設備驅動方法:probe函數中要進行的工作

一. 簡介 前一篇文章簡單學習了 Linux下usb設備驅動實現流程&#xff0c;文章如下&#xff1a; 編寫Linux下usb設備驅動方法&#xff1a;usb設備驅動實現流程-CSDN博客 本文來學習一下 usb設備驅動的 probe函數要完成的任務。 當usb主控制器檢測到設備與 驅動相匹配時&…

動態規劃:為什么暴力算法會有重復子問題

第一步&#xff1a;先明確 “子問題” 和 “重復子問題” 的定義 在算法中&#xff0c;“子問題” 不是泛指 “小一點的問題”&#xff0c;而是具有明確 “狀態參數” 的、可獨立求解的問題單元。 狀態參數&#xff1a;描述子問題核心信息的變量&#xff08;比如 01 背包中的 “…

【網絡】添加路由時,via和dev參數作用、直連路由

文章目錄概述1、帶via1.1 添加路由前的初始狀態1.2. 執行添加路由的命令1.3. 添加路由后的狀態2、不帶 via (使用設備接口)&#xff0c;直連3、帶via還是不帶via ?4、dev xx的作用4.1 命令中帶via時&#xff0c;建議不帶 dev eth0 (讓系統自動判斷)4.2 命令中帶via&#xff0c…

云原生---企業級Kubernetes

一、Kubernetes介紹 1.簡介 kubernetes的本質是一組服務器集群&#xff0c;它可以在集群的每個節點上運行特定的程序&#xff0c;來對節點中的容器進行管理。目的是實現資源管理的自動化&#xff0c;主要提供了如下的主要功能&#xff1a; 自我修復&#xff1a;一旦某一個容器…

無人機三維路徑規劃首選算法:RRT_

無人機三維路徑規劃首選算法&#xff1a;RRT* 要判斷哪種算法更適合無人機三維路徑規劃&#xff0c;需先明確無人機三維路徑規劃的核心需求&#xff0c;再結合各算法的底層邏輯與特性進行匹配。以下先梳理核心需求&#xff0c;再逐一分析算法特性&#xff0c;最終通過對比得出結…

CentOS 7 服務器初始化:從 0 到 1 的安全高效配置指南

前言 對于運維或開發人員而言&#xff0c;新到手的 CentOS 7 服務器絕非 “開箱即用”—— 默認的國外軟件源下載緩慢、系統缺乏基礎工具、防火墻未做安全配置&#xff0c;這些問題都會影響后續使用效率與服務器安全性。本文整理了 CentOS 7 服務器初始化的全套實操方案&#…

32.Attention-注意力機制

不是所有的信息都是有用的&#xff0c;或者說重要的。我們應該把注意力放在他該在的地方。 在人工智能領域&#xff0c;注意力機制被廣泛應用。他可以幫助模型關注與當前任務相關的特征&#xff0c;而忽略不重要的特征&#xff0c;以提高準確率。注意力機制本質&#xff1a;即通…

如何設計 “用戶共創型” IP 成長社群模型??

“用戶共創型” IP 成長社群的核心&#xff0c;是從 “IP 單向輸出” 轉向 “IP 與用戶共生”&#xff0c;讓用戶從 “被動接收者” 變為 “主動參與者”&#xff0c;通過 “需求共建、內容共造、價值共享” 形成閉環&#xff0c;既強化用戶歸屬感&#xff0c;又為 IP 注入持續…

Windows 命令行:mkdir 命令

專欄導航 上一篇&#xff1a;Windows 命令行&#xff1a;dir 命令 回到目錄 下一篇&#xff1a;MFC 第一章概述 本節前言 本節&#xff0c;我們來講解一個常見的命令&#xff0c;mkdir 命令。 學習本節知識&#xff0c;需要你首先懂得如何打開一個命令行界面&#xff0c;…

Linux系統編程——進程(函數)

回調函數&#xff1a;atexit()原型&#xff1a; int atexit(void (*function)(void));功能&#xff1a; 注冊進程退出前執行的函數參數&#xff1a; function 函數指針&#xff0c;指向void返回值void參數的函數指針返回值 成功 返回0失敗 …

均勝電子上半年毛利率持續提升,汽車智能化與機器人業務多點突破

8月25日&#xff0c;全球領先的智能汽車科技解決方案提供商均勝電子&#xff08;600699.SH&#xff09;發布2025上半年業績&#xff0c;報告期內公司實現營業收入約303.47億元&#xff0c;同比增長12.07%&#xff1b;營業利潤總額約12.47億元&#xff0c;歸母凈利潤同比增長11.…

【QT入門到晉級】進程間通信(IPC)-共享內存

前言 前面分享了幾種IPC通信技術&#xff0c;都有成熟的交互機制&#xff08;阻塞和非阻塞方式交互&#xff09;&#xff0c;而本文分享的共享內存&#xff0c;更像是系統提供了一張“白紙”&#xff0c;讓多個進程自己構建管理及安全機制&#xff0c;而有些場景只需要簡單的機…

自動化測試概念與 Web 自動化實戰(基于 Selenium)

在軟件測試領域&#xff0c;自動化測試是提升測試效率、保障回歸測試質量的核心手段。尤其對于 C 開發的項目&#xff0c;自動化測試能有效減少重復手工操作&#xff0c;避免新增功能對歷史功能的影響。本文從自動化基礎概念入手&#xff0c;詳解自動化分類、Web 自動化測試核心…