貪心算法和動態規劃

?

目錄

一、簡介

二、貪心算法案例:活動選擇問題

1.原理介紹

三、動態規劃案例:背包問題

1.原理介紹

四、貪心算法與動態規劃的區別

五、總結


作者其他文章鏈接

正則表達式-CSDN博客

深入理解HashMap:Java中的鍵值對存儲利器-CSDN博客

3487b068035547f2af4e91994cfb3910.png

?

一、簡介

貪心算法和動態規劃是兩種非常強大的算法設計策略,它們在許多復雜問題中都展現出了出色的性能。在計算機科學中,它們被廣泛應用于解決優化問題,如資源分配、路徑尋找等。在這篇博客中,我們將通過具體的Java案例來探討這兩種算法的設計和應用,并詳細比較它們的區別。

?

二、貪心算法案例:活動選擇問題

1.原理介紹

貪心算法是一種通過每一步的最優選擇,希望得到全局最優解的算法。它通常基于當前狀態和局部信息做出決策,而沒有對問題進行全面的掃描和分解。貪心算法的關鍵在于在每一步選擇中,都選取當前狀態下最好或最優(即最有利)的選擇,從而希望通過每個局部最優的選擇,能夠導致全局最優解。

活動選擇問題是一種常見的貪心算法應用場景,它要求從一系列活動中選擇出最大數量的活動,以便在給定時間內完成。貪心算法的策略是每次選擇當前最優的活動,希望通過每個局部最優的選擇,能夠達到全局最優解

public class ActivitySelection {  public static int selectActivities(int[] activityLengths, int[] activityStartTimes) {  int n = activityLengths.length;  int[] dp = new int[n];  int maxActivities = 0;  for (int i = 0; i < n; i++) {  int start = activityStartTimes[i];  int end = start + activityLengths[i];  for (int j = 0; j < i; j++) {  if (activityStartTimes[j] <= start && end <= activityStartTimes[j] + activityLengths[j]) {  dp[i] = 0; // conflict  break;  } else if (activityStartTimes[j] > start && end > activityStartTimes[j] && dp[j] == 1) {  dp[i] = 0; // conflict  break;  } else if (activityStartTimes[j] <= start && end >= activityStartTimes[j] + activityLengths[j]) {  dp[i] = 1; // OK  } else {  dp[i] = 0; // conflict  }  }  if (dp[i] == 1) {  maxActivities++;  }  }  return maxActivities;  }  
}

?

三、動態規劃案例:背包問題

1.原理介紹

動態規劃是一種通過將問題分解為若干個子問題,并存儲子問題的解,以便重復使用的方法。它特別適用于解決需要優化遞歸的問題,通過將問題分解為更小的部分,并利用這些子問題的解來構建最終的解決方案。動態規劃的關鍵在于記憶化,它通過存儲并重復使用之前子問題的解,從而避免重復計算,提高了算法的效率。

背包問題是動態規劃的經典案例。我們有一個背包,有一定的承載重量,現在有一些物品,每個物品都有自己的重量和價值。我們希望在不超過背包承載重量的前提下,選擇一些物品放入背包,使得背包中物品的總價值最大。我們可以將這個問題分解為幾個子問題:對于給定的背包容量,我們能選擇哪些物品?對于這些物品,我們應該選擇哪些物品放入背包以獲得最大的價值?

public class Knapsack {  public static int knapSack(int W, int wt[], int val[], int n) {  int i, w;  int K[][] = new int[n+1][W+1];  for (i = 0; i <= n; i++) {  for (w = 0; w <= W; w++) {  if (i==0 || w==0) {  K[i][w] = 0;  } else if (wt[i-1] <= w) {  K[i][w] = Math.max(val[i-1] + K[i-1][w-wt[i-1]],  K[i-1][w]);  } else {  K[i][w] = K[i-1][w];  }  }  }  return K[n][W];  }  
}

四、貪心算法與動態規劃的區別

  1. 問題分解方式:貪心算法通常試圖找到局部最優解,希望通過每個局部最優的選擇,能夠達到全局最優解。它通常沒有對問題進行全面掃描和分解,而是基于當前狀態和局部信息做出決策。而動態規劃則是將問題分解為若干個子問題,并存儲子問題的解,以便重復使用。它通過將問題分解為更小的部分,并利用這些子問題的解來構建最終的解決方案。
  2. 記憶化:動態規劃的一個重要特點是記憶化。它通過存儲并重復使用之前子問題的解,從而避免重復計算,提高了算法的效率。而貪心算法則通常沒有這種記憶功能,它只關注當前狀態和局部最優解。
  3. 全局優化:貪心算法通常只能保證局部最優,而無法保證全局最優。這是因為貪心算法在每一步都選擇當前最優的選項,而不考慮這可能對全局產生的影響。而動態規劃則通過解決子問題并整合答案,更有可能找到全局最優解。
  4. 適用場景:貪心算法在某些特定類型的問題上表現出色,例如活動選擇、硬幣找零等問題。而動態規劃則更適用于解決復雜優化問題,如背包問題、旅行商問題等。
  5. 時間復雜度:在某些情況下,動態規劃的時間復雜度可能高于貪心算法。這是因為動態規劃需要解決和存儲大量的子問題,而貪心算法則只需要考慮當前狀態和局部信息。然而,對于一些特定問題,動態規劃可能會提供更優的解決方案。

五、總結

貪心算法和動態規劃是兩種非常強大的算法設計策略,它們在許多復雜問題中都展現出了出色的性能。通過以上兩個Java案例,我們可以看到它們在解決實際問題中的效果和優勢。在選擇使用貪心算法還是動態規劃時,我們需要根據問題的性質、全局優化要求、計算資源等因素進行綜合考慮。同時,深入理解這兩種算法的工作原理和適用場景,將有助于我們在解決問題時選擇合適的算法設計策略。

?

?

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

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

相關文章

Java Web——過濾器 監聽器

目錄 1. Filter & 過濾器 1.1. 過濾器概述 1.2. 過濾器的使用 1.3. 過濾器生命周期 1.4. 過濾器鏈的使用 1.5. 注解方式配置過濾器 2. Listener & 監聽器 2.1. 監聽器概述 2.2. Java Web的監聽器 2.2.1. 常用監聽器 2.2.1.1. ServletContextListener監聽器 …

Course3-Week1-無監督學習

Course3-Week1-無監督學習 文章目錄 Course3-Week1-無監督學習1. 歡迎1.1 Course3簡介1.2 數學符號約定 2. K-means算法2.1 K-means算法的步驟2.2 代價函數2.3 選擇聚類數量 3. 異常檢測3.1 異常檢測的直觀理解3.2 高斯分布3.3 異常檢測算法3.4 選取判斷閾值 ε \varepsilon ε…

Redis 持久化 —— 超詳細操作演示!

四、Redis 持久化 四、Redis 持久化4.1 持久化基本原理4.2 RDB持久化4.3 AOF持久化4.4 RDB與AOF對比4.5 持久化技術轉型 五、Redis 主從集群六、Redis 分布式系統七、Redis 緩存八、Lua腳本詳解九、分布式鎖 數據庫系列文章&#xff1a; 關系型數據庫: MySQL —— 基礎語法大全…

【京東服裝推薦系統 - 數據爬取、可視化和個性化推薦】

京東服裝推薦系統 - 數據爬取、可視化和個性化推薦 前言數據集與數據爬取數據分析與可視化Django搭建可視化平臺主要功能1. 數據可視化2. 我的收藏3. 商品推薦4. 登錄注冊5. 信息展示6. 信息管理7. 對數據的收藏8. 推薦 創新點結語 前言 在現今的電商市場中&#xff0c;服裝領…

鴻蒙原生應用/元服務開發-新版本端云一體化模板體驗反饋

一、前言 云端一體化模板是基于Serverless服務構建的一套模板&#xff0c;提供了應用生態常見場景需求的代碼實現&#xff0c;開發者可將所需能力快速部署和集成到自己的應用中。 二、準備 體驗最新的遠端一體化模板&#xff0c;需要將云模板替換掉。為此&#xff0c;我們需要做…

我對遷移學習的一點理解——領域適應(系列3)

文章目錄 1. 領域適應&#xff08;Domain Adaptation&#xff09;的基本概念2.領域適應&#xff08;Domain Adaptation&#xff09;的目標3.領域適應&#xff08;Domain Adaptation&#xff09;的實現方法4.領域適應&#xff08;Domain Adaptation&#xff09;的可以解決的問題…

gittee使用教學

一、git簡介 Git是一個開源的分布式版本控制系統&#xff0c;用于敏捷高效的處理任何大小項目的版本管理。 核心功能&#xff1a; 項目的版本管理 團隊協同開發 二、準備工作 1、下載 Git 2、除了選擇安裝位置以外&#xff0c;其他都無腦安裝 3、檢查一下安裝情況 win…

常用方法和調度

Thread類的方法 1、start()&#xff1a; ①啟動當前線程&#xff08;新的線程&#xff09; ②調用當前線程的run&#xff08; &#xff09;。 2. run()&#xff1a; ①通常須要進行重寫 ②將創建線程要執行的操作聲明在此方法中。 3.、currentThread()&#xff1a; ①靜態方法…

這嵌入式“玩具”也太酷了吧~

大家周末好&#xff0c;我是bug菌&#xff5e; 今天看到有朋友曬出了一個“玩具”&#xff0c;實在是太酷了&#xff0c;嵌入式開發人員誰不愛&#xff1f;于是去了解了下&#xff0c;順便分享給大家&#xff5e; 這機器是clockwork推出的uconsole,console大家這應該很熟悉&…

Leetcode刷題筆記題解(C++):92. 反轉鏈表 II

思路&#xff1a;獲取要反轉的區間&#xff0c;拆開之后進行反轉再拼接 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* …

【Linux】stat命令使用

stat命令 stat命令用于顯示文件的狀態信息。stat命令的輸出信息比ls命令的輸出信息要更詳細。 著者 由Michael Meskes撰寫。 stat命令 -Linux手冊頁 語法 stat [文件或目錄] 命令選項及作用 執行令 &#xff1a; stat --help 執行命令結果 參數 -L、 --dereference 跟…

【C++】多線程(三)

還是接著講多線程&#xff0c;照例&#xff0c;可以先看上一篇文章。 我們再次回顧一下上次編寫的使用async的多線程程序&#xff1a; int main() {async([]{ cout << "Maybe a new thread?" << endl; });cout << "Yeah, u r right!"…

力扣375周賽

力扣第375場周賽 統計已測試設備 差分數組優化 class Solution { public:int countTestedDevices(vector<int> &batteryPercentages) {int dec 0;for (int x : batteryPercentages) {dec x > dec;}return dec;} };雙模冪運算 快速冪模擬 class Solution { …

Star CCM+ 停止并保存用命令行運行的計算

在 StarCCM 命令行運行 中介紹了命令行運行計算的方法&#xff0c;有網友詢問停止計算的命令&#xff0c;但計算一旦提交之后應該是不能用命令結束的&#xff0c;除非是用 kill 或任務管理器直接結束進程。然而&#xff0c;直接結束進程不會自動保存計算結果。 問題 通常情況下…

lv12 系統移植導學 1

1 導學 Kernel學習主要包括三塊內容&#xff0c;ARM&#xff08;匯編、協議&#xff09;、系統移植、驅動移植 lv12主要時安裝系統linux linux主要幫我們實現了5大功能 1 進程、線程管理 2 內存管理 3 網絡協議棧管理 4 文件系統管理 5 設備管理 2 移植的目的 不同架構…

從零開始搭建鏈上dex自動化價差套利程序(12)

其他品種 擴展到其他幣種的價差套利 1.eth 新建文件get_depth_data_eth.py import asyncio from apexpro.http_public import HttpPublic from dydx3 import Client from dydx3.constants import MARKET_ETH_USD# 定義交易對列表 symbol ETHUSDC market MARKET_ETH_USD# …

vue創建時長時間卡頓無結果

vue創建時長時間卡頓無結果 01 發生場景 當我在VS code中使用vue create myVue &#xff08;注&#xff1a;最后一個是我創建的vue項目的文件名&#xff09;指令時在終端內長時間的無反應 02 問題的產生及其原因 經過面向百度編程&#xff0c;得出的第一結論是vue/cil版本過…

【數據結構】——排序篇(下)

前言&#xff1a;前面我們的排序已經詳細的講解了一系列的方法&#xff0c;那么我們現在久之后一個歸并排序了&#xff0c;所以我們現在就來講解一下歸并排序。 歸并排序&#xff1a; 歸并排序&#xff08;MERGE-SORT&#xff09;是建立在歸并操作上的一種有效的排序算法,該算法…

代碼隨想錄二刷 |二叉樹 | 二叉樹的右視圖

代碼隨想錄二刷 &#xff5c;二叉樹 &#xff5c; 二叉樹的右視圖 題目描述解題思路代碼實現 題目描述 199.二叉樹的右視圖 給定一個二叉樹的 根節點 root&#xff0c;想象自己站在它的右側&#xff0c;按照從頂部到底部的順序&#xff0c;返回從右側所能看到的節點值。 示例…

?My學習Linux命令小記錄(15)?

目錄 ?My學習Linux命令小記錄&#xff08;15&#xff09;? 61.history指令 62.apt指令 ①apt-get ②apt-key&#xff1a; ③apt-sortpkgs&#xff1a; ④aptitude&#xff1a; 63.yum指令 64.cal指令 65.init指令 ?My學習Linux命令小記錄&#xff08;15&#xff0…