Python之貪心算法

Python實現貪心算法(Greedy Algorithm)

概念

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

基本特點

  1. 局部最優選擇:每一步都做出當前看起來最佳的選擇
  2. 不可回退:一旦做出選擇,就不可更改
  3. 高效性:通常比其他全局優化算法更快
  4. 不保證全局最優:但能得到近似最優解

基本實現框架

(以分數背包問題為栗子)

def greedy_algorithm(items, capacity):# 通常先按某種規則排序items.sort(key=lambda x: x[1]/x[0], reverse=True)#按單位重量價值(value/weight)降序排序total_value = 0 #背包中物品的總價值selected_items = [] #選擇的物品列表(完整或部分物品)#開始選擇for item in items:if capacity >= item[0]:capacity -= item[0]total_value += item[1]selected_items.append(item)else:# 可選: 部分物品的情況(如分數背包問題)fraction = capacity / item[0]total_value += item[1] * fractionselected_items.append((item[0]*fraction, item[1]*fraction))breakreturn total_value, selected_items

經典應用示例 😍 😍

1. 找零錢問題

def coin_change(coins, amount):coins.sort(reverse=True)count = 0change = []for coin in coins:while amount >= coin:amount -= coincount += 1change.append(coin)return count if amount == 0 else -1, change# 示例
coins = [25, 10, 5, 1]
print(coin_change(coins, 63))  # 輸出: (6, [25, 25, 10, 1, 1, 1])

2. 區間調度問題

def interval_scheduling(intervals):# 按結束時間排序intervals.sort(key=lambda x: x[1])selected = []last_end = -float('inf')for start, end in intervals:if start >= last_end:selected.append((start, end))last_end = endreturn selected# 示例
intervals = [(1, 3), (2, 4), (3, 5), (4, 6)]
print(interval_scheduling(intervals))  # 輸出: [(1, 3), (3, 5)]

3. 霍夫曼編碼(數據壓縮)

import heapqdef huffman_encoding(freq):heap = [[weight, [symbol, ""]] for symbol, weight in freq.items()]heapq.heapify(heap)while len(heap) > 1:lo = heapq.heappop(heap)hi = heapq.heappop(heap)for pair in lo[1:]:pair[1] = '0' + pair[1]for pair in hi[1:]:pair[1] = '1' + pair[1]heapq.heappush(heap, [lo[0] + hi[0]] + lo[1:] + hi[1:])return sorted(heapq.heappop(heap)[1:], key=lambda p: (len(p[-1]), p))# 示例
freq = {'a': 5, 'b': 9, 'c': 12, 'd': 13, 'e': 16, 'f': 45}
print(huffman_encoding(freq))

適用場景

  1. 問題具有貪心選擇性質:局部最優能導致全局最優
  2. 最優子結構:問題的最優解包含子問題的最優解
  3. 典型應用
    • 最小生成樹(Prim和Kruskal算法)
    • 最短路徑問題(Dijkstra算法)
    • 背包問題的分數版本
    • 任務調度問題
    • 文件壓縮(霍夫曼編碼)

貪心算法的局限性👀👀

  1. 不總是能得到全局最優解
  2. 需要證明問題的貪心選擇性質
  3. 對某些問題可能需要結合其他算法(如動態規劃)

貪心 vs 動態規劃💪💪

特性貪心算法動態規劃
決策每個階段做局部最優選擇考慮所有可能的子問題
復雜度通常更低通常更高
最優解保證不總是總是
存儲需求通常更少需要存儲子問題結果
典型問題找零錢、任務調度背包問題、最長子序列

總結

貪心算法因其高效性在實際工程中應用廣泛,但使用時需要仔細分析問題是否適合貪心策略。😼😼

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

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

相關文章

【 <二> 丹方改良:Spring 時代的 JavaWeb】之 Spring Boot 中的 AOP:實現日志記錄與性能監控

<前文回顧> 點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、開篇整…

TCP/IP協議簇

文章目錄 應用層http/httpsDNS補充 傳輸層TCP1. 序列號與確認機制2. 超時重傳3. 流量控制&#xff08;滑動窗口機制&#xff09;4. 擁塞控制5. 錯誤檢測與校驗6. 連接管理總結 網絡層ARP**ARP 的核心功能**ARP 的工作流程1. ARP 請求&#xff08;Broadcast&#xff09;2. ARP 緩…

SpringBoot分布式項目訂單管理實戰:Mybatis最佳實踐全解

一、架構設計與技術選型 典型分布式訂單系統架構&#xff1a; [網關層] → [訂單服務] ←→ [分布式緩存]↑ ↓ [用戶服務] [支付服務]↓ ↓ [MySQL集群] ← [分庫分表中間件]技術棧組合&#xff1a; Spring Boot 3.xMybatis-Plus 3.5.xShardingSpher…

微服務架構中的精妙設計:環境和工程搭建

一.前期準備 1.1開發環境安裝 Oracle從JDK9開始每半年發布?個新版本, 新版本發布后, ?版本就不再進?維護. 但是會有?個?期維護的版本. ?前?期維護的版本有: JDK8, JDK11, JDK17, JDK21 在 JDK版本的選擇上&#xff0c;盡量選擇?期維護的版本. 為什么選擇JDK17? S…

Maven 構建配置文件詳解

Maven 構建配置文件詳解 引言 Maven 是一個強大的項目管理和構建自動化工具,廣泛應用于 Java 開發領域。在 Maven 項目中,配置文件扮演著至關重要的角色。本文將詳細介紹 Maven 構建配置文件的相關知識,包括配置文件的作用、結構、配置方法等,幫助讀者更好地理解和應用 M…

【YOLO系列】基于YOLOv8的無人機野生動物檢測

基于YOLOv8的無人機野生動物檢測 1.前言 在野生動物保護、生態研究和環境監測領域&#xff0c;及時、準確地檢測和識別野生動物對于保護生物多樣性、預防人類與野生動物的沖突以及制定科學的保護策略至關重要。傳統的野生動物監測方法通常依賴于地面巡邏、固定攝像頭或無線傳…

Hive UDF開發實戰:構建高性能JSON生成器

目錄 一、背景與需求場景 二、開發環境準備 2.1 基礎工具棧 2.2 Maven依賴配置 三、核心代碼實現

分布式特性對比

以下是關于 分片(Sharding)、一致性哈希、兩階段提交(2PC)、Paxos、Raft協議、數據局部性 的對比分析與關聯性總結,涵蓋核心機制、適用場景及相互關系: 一、概念對比與關聯 概念核心目標關鍵特性典型應用場景與其它技術的關聯分片(Sharding)數據水平拆分按規則(哈希、…

歷史分鐘高頻數據

外盤期貨高頻分鐘歷史回測行情數據下載 鏈接: https://pan.baidu.com/s/1RUbAMxfiSyBlXfrwT_0n2w?pwdhgya 提取碼: hgya通過美國期貨高頻交易所歷史行情可以看到很多細節比如品種之一&#xff1a;FGBX_1min (1)在2024-02-29 11:14:00關鍵交易時刻&#xff0c;一筆大規模訂單突…

final+模版設計模式的理解

模板設計模式在 Java 里是一種行為設計模式&#xff0c;它在抽象類里定義算法的骨架&#xff0c;把部分步驟的具體實現延遲到子類。如此一來&#xff0c;子類可以在不改變算法結構的基礎上&#xff0c;重新定義算法中的特定步驟。 模式組成 抽象類&#xff08;Abstract Class…

JAVA接口調用限速器

目錄 1、并發限速 2、串行限速 需求&#xff1a;批量調用第三方ERP接口&#xff0c;對方接口限流時&#xff0c;減緩調用速率。 1、并發限速 Slf4j RestController public class ApiCallTask {//第三方接口Resourceprivate ErpService erpService;//異步線程池Resourcepriv…

STM32 CAN控制器硬件資源與用法

1、硬件結構圖 以STM32F4為例&#xff0c;他有2個can控制器&#xff0c;分別為 CAN1 CAN2。 每個CAN控制器&#xff0c;都有3個發送郵箱、2個接收fifo&#xff0c;每個接收fifo又由3個接收郵箱組成。也即每個CAN控制器都有9個郵箱&#xff0c;其中3個供發送用&#xff0c;3個…

【C++ 繼承】—— 青花分水、和而不同,繼承中的“明明德”與“止于至善”

歡迎來到ZyyOvO的博客?&#xff0c;一個關于探索技術的角落&#xff0c;記錄學習的點滴&#x1f4d6;&#xff0c;分享實用的技巧&#x1f6e0;?&#xff0c;偶爾還有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原創??&#xff0c;感謝支持??&#xff01;請尊重原創&#x1…

Qt warning LNK4042: 對象被多次指定;已忽略多余的指定

一、常規原因&#xff1a; pro或pri 文件中源文件被多次包含 解決&#xff1a;刪除變量 SOURCES 和 HEADERS 中重復條目 二、誤用 對于某些pri庫可以使用如下代碼簡寫包含 INCLUDEPATH $$PWDHEADERS $$PWD/*.hSOURCES $$PWD/*.cpp但是假如該目錄下只有頭文件&#xff0c;沒…

Visual Studio Code 無法打開源文件解決方法

&#x1f308; 個人主頁&#xff1a;Zfox_ &#x1f525; 系列專欄&#xff1a;Linux &#x1f525; 系列專欄&#xff1a;C從入門到精通 目錄 一&#xff1a;&#x1f525; 突發狀況 二&#xff1a;&#x1f525; 共勉 一&#xff1a;&#x1f525; 突發狀況 &#x1f42c;…

js文字兩端對齊

目錄 一、問題 二、原因及解決方法 三、總結 一、問題 1.text-align: justify; 不就可以了嗎&#xff1f;但是實際測試無效 二、原因及解決方法 1.原因&#xff1a;text-align只對非最后一行文字有效。只有一行文字時&#xff0c;text-align無效&#xff0c;要用text-alig…

LeetCode算法題(Go語言實現)_20

題目 給你兩個下標從 0 開始的整數數組 nums1 和 nums2 &#xff0c;請你返回一個長度為 2 的列表 answer &#xff0c;其中&#xff1a; answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整數組成的列表。 answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整數組成…

每天認識一個設計模式-橋接模式:在抽象與實現的平行宇宙架起彩虹橋

一、前言&#xff1a;虛擬機橋接的啟示 使用過VMware或者Docker的同學們應該都接觸過網絡橋接&#xff0c;在虛擬機網絡配置里&#xff0c;橋接模式是常用的網絡連接方式。選擇橋接模式時&#xff0c;虛擬機會通過虛擬交換機與物理網卡相連&#xff0c;獲取同網段 IP 地址&…

java筆記02

運算符 1.隱式轉換和強制轉換 類型轉換的分類 1.隱式轉換&#xff1a; 取值范圍小的數值 轉換為 取值范圍大的數值 2.強制轉換&#xff1a; 取值范圍大的數值 轉換為 取值范圍小的數值隱式轉換的兩種提升規則 取值范圍小的&#xff0c;和取值范圍大的進行運算&#xff0c;小的…

Redis-07.Redis常用命令-集合操作命令

一.集合操作命令 SADD key member1 [member2]&#xff1a; sadd set1 a b c d sadd set1 a 0表示沒有添加成功&#xff0c;因為集合中已經有了這個元素了&#xff0c;因此無法重復添加。 SMEMBERS key: smembers set1 SCARD key&#xff1a; scard set1 SADD key member1 …