1. 程式人生 > >貪心演算法概念理解精講

貪心演算法概念理解精講

   所謂貪心演算法,是指從問題的初始狀態出發,通過若干次的貪心選擇而得到的最優值(或較優值)的一種求解問題策略,即貪心策略。

  話不多說,從下面的引例中你會很容易明白貪心策略:
   在N行M列的正整數矩陣中,要求從每一行中選出一個數,使得選出數的總和最大。
   分析:思路很簡單,選擇N次,每次從當前行選出最大值,最後相加即可。其實這就是一種貪心策略。要求使總和最大,那麼我們把這個問題分解成若干個子問題,即求每一個子問題的最優解,彙總後得到大問題的最優解。
   這個問題很簡答易懂,但是不要認為貪心就是這樣簡單的問題,筆者目的在於快速引導大家認識貪心的本質,即分為四個步驟:建立數學模型(使問題具象化,有利於分析問題);分解為若干子問題;對子問題求解,的到子問題的區域性最優解;把子問題的區域性最優解合成原來問題的一個解。

   讀者可以自行分析以下幾個問題加深對貪心策略的理解:
   最優裝載問題:給 N 個物體,第 i 個物體的重量為 Wi ,儘量選擇多的物體,使得總重量不超過C。
   部分揹包問題:有 N 個物體,第 i 個物體的重量為 Wi ,價值為 Vi ,在總重量不超過 C 的情況下讓總價值儘量高,每一個物體可以只取走一部分,價值和重量按比例計算。
   乘船問題:有 N 個人,第 i 個人的重量為Wi ,每艘船的載重量均為C最多可乘兩個人。求最少得用多少條船才能裝下所有的人。

相關推薦

貪心演算法概念理解

   所謂貪心演算法,是指從問題的初始狀態出發,通過若干次的貪心選擇而得到的最優值(或較優值)的一種求解問題策略,即貪心策略。   話不多說,從下面的引例中你會很容易明白貪心策略:    在N行M列的正整數矩陣中,要求從每一行中選出一個數,使得選出數的總和最

深度學習之目標檢測常用演算法原理+實踐

第1章 課程介紹本章節主要介紹課程的主要內容、核心知識點、課程涉及到的應用案例、深度學習演算法設計通用流程、適應人群、學習本門課程的前置條件、學習後達到的效果等,幫助大家從整體上了解本門課程的整體脈絡。 第2章 目標檢測演算法基礎介紹本章節主要介紹目標檢測演算法的基本概念、傳統的目標檢測演算法、目前深度學習

【牛客演算法筆試面試筆記】單鏈表刪除特定元素

題目要求: 現在有一個單鏈表。連結串列中每個節點儲存一個整數,再給定一個值val,把所有等於val的節點刪掉。 給定一個單鏈表的頭結點head,同時給定一個值val,請返回清除後的連結串列的頭結點,保證連結串列中有不等於該值的其它值。請保證其他元素的相對順序。 測試樣例: {1,2,

【牛客演算法筆試面試筆記】連結串列問題

連結串列問題是常考知識點之一,在筆試面試題中在演算法上不會有太大難度,主要注意以下幾點: 1、指標涉及很多操作,容易考慮不周,著重考察面試者程式碼實現能力和不出錯能力。。 2、連結串列和陣列都是線性結構,陣列是實體地址連續的一段儲存空間,可以通過訪問陣列下標獲得元素。而連結串列和陣列最大的區

深度學習之目標檢測常用演算法原理+實踐 YOLO / Faster RCNN / SSD / 文字檢測 / 多工網路

深度學習之目標檢測常用演算法原理+實踐精講 YOLO / Faster RCNN / SSD / 文字檢測 / 多工網路 資源獲取連結:點選這裡 第1章 課程介紹 本章節主要介紹課程的主要內容、核心知識點、課程涉及到的應用案例、深度學習演算法設計通用流程、適應人群、學習本門

遞迴演算法

原作者:書呆子Rico 《遞迴的內涵與經典應用》 http://my.csdn.net/justloveyou_ 摘要:   大師 L. Peter Deutsch 說過:To Iterate is Human, to Recurse, Divine.中文譯為:人理解迭代,神理解遞

資料結構和演算法版(陣列、棧、佇列、連結串列、遞迴、排序、二叉樹、紅黑樹、堆、雜湊表)Java版

查詢和排序是最基礎也是最重要的兩類演算法,熟練地掌握這兩類演算法,並能對這些演算法的效能進行分析很重要,這兩類演算法中主要包括二分查詢、快速排序、歸併排序等等。我們先來了解查詢演算法! 順序查詢: 順序查詢又稱線性查詢。它的過程為:從查詢表的最後一個元素開始逐個與給定關鍵字比較,若某個記錄的關鍵字和給定值比較

貪心演算法理解

貪心演算法 基本思想: 貪心演算法通過一系列的選擇來得到問題的解,其中每一個選擇都是當前狀態下區域性最好的選擇,即貪心選擇 它有兩個重要性質:貪心選擇性質和最優子結構性質。 貪心選擇性質:指問題的最優解可以通過一系列區域性最優解的選擇得到。貪心演算法做貪心選擇可 以依賴於以往所做過的選擇,但決不依賴

《Oracle PL/SQL例項》學習筆記2——PL/SQL概念

這一章學習到了以下內容: 1. PL/SQL架構(如,三層架構:資料管理層、應用處理層、表示層) 2. 替代變數的字首有兩種:&和&&,其中後者表示即使同名替代變數在程式碼中出現多次,使用者僅需輸入一次 原始碼如下: -- *** Chap

《Oracle PL/SQL例項》學習筆記11——異常 (高階概念

本章介紹瞭如下內容: 1. RAISE_APPLICATION_ERROR “在我們寫proc程式中經常要有錯誤處理,在錯誤處理中我們經常要輸出錯誤資訊來給幫助我們分析和解決錯誤原因,從而更正資料。這時候就會用到SQLCODE和SQLERRM. SQLCode:資

動態規劃和貪心演算法之揹包問題理解

一.揹包問題 引用書上關於0-1揹包和部分揹包的闡述: 二.貪心與動態規劃區別 關於紅色矩形部分解釋為什麼0-1不能使用貪心演算法,是因為當你選擇一個物品時,整個物品的大小都需要計算,然而揹包的的大小又是固定的,那麼剩下的揹包大小與剩下的物品之間

Java C++演算法與資料結構

第1章 當我們談論演算法的時候,我們在談論什麼? 無論是BAT,還是FLAG,但凡有點兒水平的技術公司,面試都要面演算法。為什麼演算法這麼重要?在工作中,真的會使用演算法嗎?學了演算法到底有什麼用?當我們談論演算法的時候,我們在談論什麼? 第2章 排序基礎 O(n^2)的演算法雖然簡單,但也實用!

貪心演算法之活動選擇理解

一.活動選擇事例 二.例題分析 1、定義子問題 採用動態規劃的方法: 2、尋找最優子結構: 假設已經找到問題Sij最大相容活動集Aij,如果Aij中包含Ak(屬於某一活動)。則可以將Sij分成兩個子問題Sik和Ak和Skj。此時Sik和Sk

貪心演算法和動態規劃的個人理解

最近通過各個公司的筆試題發現,好多程式設計題都是貪心演算法和動態規劃演算法。這兩個也容易混淆,在網上也看了好多這兩種演算法的解析,通過這篇文章寫下自己對這兩種演算法的理解。 使用動態規劃的最大特性是原問題的最優解必須包含子問題的最優解。下面通過一個例子解釋:求圖的最短路徑是

PHP Session一:理解SESS…

Session ID       Session ID 是伺服器端為了識別每個客戶端,分給客戶端的唯一識別符號,格式是隨機生成的一串字串,具有唯一性,隨機性。使用者第一次訪問網頁的時候,php的session初始化函式呼叫會分配給當前來訪使用者一個唯一的ID,被稱之為session_id。當然如果不想使用系

系統分析師教程知識點之標準化知識

系統分析師 軟考系統分析師在2017上半年開考,整理了一些系統分析師教程知識點精講。 標準化知識 按照ISO/IEC9126,軟件質量模型包括6個質量特性和21個質量子特性: SW-CMM軟件采辦能力成熟度模型:關註的是軟件購買者的軟件能力成熟度; 而CMM關註的是軟件

Log4j 入門概念理解

java log4j Log4j入門 1、添加Log的目的: 監視代碼中變量的變化情況,周期性的記錄到文件中供其他應用進行統計分析工作 跟蹤代碼的運行軌跡,作為日後審計的依據 擔當繼承開發環境中的調試器作用,向文件或控制臺打印代碼的調試信息。 最普通的做法就是在代碼中嵌入許多的打印語句,這

數字簽名,數字證書,CA認證等概念理解

ca 認證 https openssl 本文將介紹數字簽名,數字證書以及CA相關知識。 加密相關知識可見我的上一篇博文:http://watchmen.blog.51cto.com/6091957/1923426本文參考文獻引用鏈接:1、https://www.zhihu.com

實現HTTPS系列第四彈之【TLS ,SSL等概念理解

tls pki ssl 博文說明【前言】: 本文將通過個人口吻介紹TLS ,SSL,PKI等相關知識,在目前時間點【2017年5月21號】下,所掌握的技術水平有限,可能會存在不少知識理解不夠深入或全面,望大家指出問題共同交流,在後續工作及學習中如發現本文內容與實際情況有所偏差,將會完善該博文

ORACLE中的Server_name和SID概念理解

oracle sid server_name 博文說明【前言】: 本文將通過個人口吻介紹在ORACLE中的Server_name和實例名SID的相關概念,在目前時間點【2017年5月22號】下,所掌握的技術水平有限,可能會存在不少知識理解不夠深入或全面,望大家指出問題共同交流,在後續工作及學