EP41-Greedy Algorithm

貪心,貪心和動歸

貪心算法(Greedy Algorithm)就是把問題分解成很多個子問題,從從子問題中找到最優(yōu)解,組合成總的最優(yōu)解。

這個想法跟動態(tài)規(guī)劃很像冯事,不同的是動態(tài)規(guī)劃的每個子問題都會影響下一個子問題,最后會完全match到結(jié)果的要求血公,而貪心法得到的很可能只是接近最優(yōu)昵仅。

要說明他們的區(qū)別,典型的例子就是背包問題累魔,小偷去偷東西摔笤,有多個不同價值w、不同體積v的物品可以拿垦写,但只有一個容量為n的包吕世;如果是0-1背包問題,用貪心的思想的話梯投,就會先裝w/v單位價值最大的物品命辖,裝滿了就拿第二大的,直到裝不下晚伙,這當(dāng)然沒有考慮背包是不是會有空余的體積沒有裝滿造成的浪費(fèi)吮龄;而動態(tài)規(guī)劃就會直接考慮到包的容量是不是正好裝滿,它的每一個子步驟都會影響下一個子步驟咆疗。

安排教室

一個典型的貪心法的例子是活動安排問題漓帚,也是算法導(dǎo)論上的一個例子:

有n個活動的集合E = {1,2,…,n},其中每個活動都要求使用同一資源午磁,如演講會場等尝抖,而在同一時間內(nèi)只有一個活動能使用這一資源。每個活i都有一個要求使用該資源的起始時間si和一個結(jié)束時間fi,且si < fi 迅皇。如果選擇了活動i昧辽,則它在半開時間區(qū)間[si, fi)內(nèi)占用資源。若區(qū)間[si, fi)與區(qū)間[sj, fj)不相交登颓,則稱活動i與活動j是相容的搅荞。也就是說,當(dāng)si >= fj或sj >= fi時框咙,活動i與活動j相容咕痛。安排盡可能多的活動。

可以理解成這些活動都要在一間教室舉行喇嘱,怎么才能安排盡可能多的活動呢茉贡。

活動安排.jpg

用貪心的思想,我們只希望當(dāng)前活動時間結(jié)束地越早越好者铜,這樣就能給后面的活動留出更多的時間腔丧。不需要考慮后面活動的長短和沖突放椰。正好,給出的表格是按照時間結(jié)束時間順序排列的愉粤。如果不是砾医,就用快速排序O(nlogn)時間排列一下。

下面的圖是加入活動的迭代順序科汗,復(fù)雜度O(n)藻烤,非常直觀。


藍(lán)色代表已加入的活動

哈夫曼編碼/哈夫曼樹

這個是考研的時候必須會畫的一張圖了头滔,理解起來很簡單怖亭。

首先哈夫曼編碼是壓縮文件常用的算法。比如abcde5個字母組成的文件坤检,出現(xiàn)的頻次不同兴猩,我們怎么做才能壓縮文件呢?當(dāng)然是要先編碼(壓縮)早歇,再解碼(解壓縮)倾芝。把頻次高的字母用短的符號表示,頻次低的字母用長的符號表示箭跳。對了晨另,這要求這些用來表示的符號是「前綴碼」,這樣才能解碼谱姓。

下面這張圖是構(gòu)造哈夫曼樹的過程借尿,構(gòu)造完了之后,哈夫曼編碼自然而然就地出來了屉来。對照構(gòu)造的過程來看吧路翻。完成之后的左子樹對應(yīng)0,右子樹對應(yīng)1茄靠。比如節(jié)點3就是101茂契。這個是標(biāo)準(zhǔn)的前綴碼。

構(gòu)造哈夫曼樹的算法:

  1. 對給定的n個權(quán)值{W1,W2,W3,...,Wi,...,Wn}構(gòu)成n棵二叉樹的初始集合F={T1,T2,T3,...,Ti,..., Tn}慨绳,其中每棵二叉樹Ti中只有一個權(quán)值為Wi的根結(jié)點掉冶,它的左右子樹均為空。
  2. 在F中選取兩棵根結(jié)點權(quán)值最小的樹作為新構(gòu)造的二叉樹的左右子樹脐雪,新二叉樹的根結(jié)點的權(quán)值為其左右子樹的根結(jié)點的權(quán)值之和厌小。
  3. 從F中刪除這兩棵樹,并把這棵新的二叉樹同樣以升序排列加入到集合F中喂江。
  4. 重復(fù)2)和3),直到集合F中只有一棵二叉樹為止旁振。
huf.jpeg

哈夫曼編碼的過程體現(xiàn)了貪心法的兩個要點:
(1)貪心選擇性質(zhì)
(2)最優(yōu)子結(jié)構(gòu)性質(zhì)

JumpGame

Given an array of non-negative integers, you are initially positioned at the first index of the array.
Each element in the array represents your maximum jump length at that position.
Determine if you are able to reach the last index.
For example:
A = [2,3,1,1,4], return true.
A = [3,2,1,0,4], return false.
這個問題有點像動態(tài)規(guī)劃也有點像貪心获询。
說它像貪心是因為它只要判斷當(dāng)前的index上對應(yīng)的num是不是能reach到last index涨岁,說它像動歸是因為對于[0,2,3]這種test case,只考慮當(dāng)前是不行的吉嚣,因為0不能reach而2能reach梢薪,你不能直接遍歷每個index能reach就返回true否則返回false,還需要維護(hù)一個能reach到的最遠(yuǎn)距離尝哆。

這題目給出這樣的解法:

public boolean canJump(int[] nums) {
        int maxCover = 0;
        for (int i = 0; i <= nums.length - 1 && i <= maxCover; i++) {
            maxCover = Math.max(maxCover,nums[i]+i);//遞推
            if (maxCover>=nums.length-1) return true;
        }
        return false;
    }

或許可以稱為一個有遞推式的貪心算法吧秉撇。

注意,本文只是講了皮毛秋泄。

Reference:
[1]http://www.cnblogs.com/chinazhangjie/archive/2010/11/23/1885330.html
[2]http://www.cnblogs.com/phoenixzq/archive/2011/10/19/2217346.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末琐馆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子恒序,更是在濱河造成了極大的恐慌瘦麸,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件歧胁,死亡現(xiàn)場離奇詭異滋饲,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)喊巍,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門屠缭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人崭参,你說我怎么就攤上這事呵曹。” “怎么了阵翎?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵逢并,是天一觀的道長。 經(jīng)常有香客問我郭卫,道長砍聊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任贰军,我火速辦了婚禮玻蝌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘词疼。我一直安慰自己俯树,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布贰盗。 她就那樣靜靜地躺著许饿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舵盈。 梳的紋絲不亂的頭發(fā)上陋率,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天球化,我揣著相機(jī)與錄音,去河邊找鬼瓦糟。 笑死筒愚,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的菩浙。 我是一名探鬼主播巢掺,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼劲蜻!你這毒婦竟也來了陆淀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤斋竞,失蹤者是張志新(化名)和其女友劉穎倔约,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坝初,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡浸剩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了鳄袍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绢要。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拗小,靈堂內(nèi)的尸體忽然破棺而出重罪,到底是詐尸還是另有隱情,我是刑警寧澤哀九,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布剿配,位于F島的核電站,受9級特大地震影響阅束,放射性物質(zhì)發(fā)生泄漏呼胚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一息裸、第九天 我趴在偏房一處隱蔽的房頂上張望蝇更。 院中可真熱鬧,春花似錦呼盆、人聲如沸年扩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厨幻。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間况脆,已是汗流浹背平绩。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留漠另,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓跃赚,卻偏偏與公主長得像笆搓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纬傲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 第一章 緒論 什么是數(shù)據(jù)結(jié)構(gòu)满败? 數(shù)據(jù)結(jié)構(gòu)的定義:數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 第二章...
    SeanCheney閱讀 5,775評論 0 19
  • 定義指針變量叹括,如果不賦給它地址算墨,系統(tǒng)會隨機(jī)給它分配一個地址。 C++標(biāo)準(zhǔn)庫 C++ Standard Librar...
    縱我不往矣閱讀 291評論 0 1
  • 課程介紹 先修課:概率統(tǒng)計汁雷,程序設(shè)計實習(xí)净嘀,集合論與圖論 后續(xù)課:算法分析與設(shè)計,編譯原理侠讯,操作系統(tǒng)挖藏,數(shù)據(jù)庫概論,人...
    ShellyWhen閱讀 2,290評論 0 3
  • 完全理解Gson(3):Gson反序列化 完全理解Gson(2):Gson序列化 完全理解Gson(1):簡單入門...
    tiagoxu閱讀 184評論 0 0
  • “圣誕老人就應(yīng)該從煙囪爬進(jìn)來厢漩∧っ撸” 小孩冷冷地盯著門前的圣誕老人。一臉蓬松的白胡子溜嗜,頂著個大肚子宵膨,穿著紅色大袍子,戴...
    TinYeah閱讀 1,298評論 0 0