日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数据结构与算法】【算法思想】贪心算法

發(fā)布時(shí)間:2023/12/10 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数据结构与算法】【算法思想】贪心算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

貪心算法
回溯算法
分治算法
動(dòng)態(tài)規(guī)劃

四種基本的算法思想:貪心算法,分治算法,回溯算法,動(dòng)態(tài)規(guī)劃,他們不是具體算法,常用來指導(dǎo)我們?cè)O(shè)計(jì)具體的算法和編碼等。

一:貪心算法有很多經(jīng)典應(yīng)用

霍夫曼編碼(Huffman Coding),Prim和Kruskal最小生成數(shù)算法,Dijkstra單源最短路徑算法。

二:如何理解“貪心算法”

假設(shè)我們有一個(gè)可容納100kg物品的背包,可以裝下各種物品,我們有以下5中豆子,每種豆子的總量和總價(jià)值都各不相同。為了讓背包中所裝物品的總價(jià)最大,該如何?

第一步:當(dāng)我們看到這類問題時(shí),首先要聯(lián)想到貪心算法:針對(duì)一組數(shù)據(jù),定義了限制值和期望值,系統(tǒng)從中選出幾個(gè)數(shù)據(jù),在滿足限制值的情況下,期望值最大。
第二步:嘗試看這個(gè)問題是否可以用貪心算法解決:每次選擇當(dāng)前情況下,在對(duì)限制值同等貢獻(xiàn)量的情況下,對(duì)期望值貢獻(xiàn)最大的數(shù)據(jù)
第三步:舉幾個(gè)例子看下貪心算法產(chǎn)生的結(jié)果是否最優(yōu)的。大部分情況下,舉幾個(gè)例子驗(yàn)證一下就可以了。嚴(yán)格的證明貪心算法的正確性,非常復(fù)雜,需要涉及較多的數(shù)學(xué)推理。并且,從實(shí)踐的角度來說,大部分能用貪心算法的問題,貪心算法的正確性都是顯而易見的,月不需要嚴(yán)格的數(shù)學(xué)推導(dǎo)證明。

貪心算法,專注于當(dāng)下最優(yōu),但可能無法取得全局最優(yōu)。

貪心算法實(shí)戰(zhàn)分析

一:分糖果

有m個(gè)糖果和n個(gè)孩子,但m<n,所以糖果只能分配給一部分孩子。
每個(gè)糖果的大小不等,分為s1,s2……sm。除此之外,每個(gè)孩子對(duì)糖果大小的需求也是不一樣的,只有糖果的大小>=孩子對(duì)糖果大小的需求分別是g1,g2,g3……gn。
如何分配才可能滿足最多數(shù)量的孩子?

可將這個(gè)問題抽象成:從n個(gè)孩子中抽取一部分孩子分配糖果,讓滿足的孩子個(gè)數(shù)(期望值)是最大的。這個(gè)問題的限制值就是糖果個(gè)數(shù)m。

對(duì)于一個(gè)孩子而言,如果小的糖果可以滿足,我們就沒必要用更大的糖果,這樣更大的就可以留給其他對(duì)糖果大小需求更大的孩子。另一方面,對(duì)糖果大小需求小的孩子更容易被滿足,所以,我們可以從需求小的孩子開始分配他糖果。因?yàn)闈M足一個(gè)需求大的孩子跟滿足一個(gè)需求小的孩子,對(duì)我們期望值貢獻(xiàn)是一樣的。

二:錢幣找零(部分題目不適用 100 99 1 找396 )

假設(shè)有1元,2元,5元,10元,50元,100元這些面額的紙幣,他們的張數(shù)分別是c1,c2,c5,c10,c20,c50,c100。我們要有支付k元,最少要用多少?gòu)埣垘拍?#xff1f;

在貢獻(xiàn)相同期望值(紙幣數(shù)目)的情況下,我們希望多貢獻(xiàn)點(diǎn)金額,這樣就可以讓紙幣數(shù)更少。這就是一種貪心算法的解決思路。

三:區(qū)間覆蓋

假設(shè)有n個(gè)區(qū)間,區(qū)間的起始端點(diǎn)和結(jié)束端點(diǎn)分分別是[l1,r1],[l2,r2],[l3,r3]……,從n個(gè)區(qū)間中選出一部分區(qū)間,這部分區(qū)間滿足兩兩不相交(端點(diǎn)相交的情況不算相交),最多能選出多少個(gè)區(qū)間?

我們假設(shè)這 n 個(gè)區(qū)間中最左端點(diǎn)是 lmin,最右端點(diǎn)是 rmax。這個(gè)問題就相當(dāng)于,我們選擇幾個(gè)不相交的區(qū)間,從左到右將[lmin, rmax]覆蓋上。我們按照起始端點(diǎn)從小到大的順序?qū)@ n 個(gè)區(qū)間排序。
我們每次選擇的時(shí)候,左端點(diǎn)跟前面的已經(jīng)覆蓋的區(qū)間不重合的,右端點(diǎn)又盡量小的,這樣可以讓剩下的未覆蓋區(qū)間盡可能的大,就可以放置更多的區(qū)間。這實(shí)際上就是一種貪心的選擇方法。

四:如何用貪心算法實(shí)現(xiàn)霍夫曼編碼?

假設(shè)有一個(gè)包含1000個(gè)字符的文件,每個(gè)字符占1個(gè)byte(1byte=8bits),存儲(chǔ)這1000個(gè)字符就一共需要8000bits。
但使用霍夫曼編碼,可實(shí)現(xiàn)壓縮率在20%~90%之間。
霍夫曼編碼不僅會(huì)考察文本匯總有多少個(gè)不同字符,還會(huì)考察每個(gè)字符出現(xiàn)的頻率,根據(jù)頻率的不同,選擇不同長(zhǎng)度的編碼。霍夫曼編碼試圖用這種不等長(zhǎng)的編碼方法,來進(jìn)一步增加壓縮的效率。
根據(jù)貪心的思想,可以把出現(xiàn)頻率比較多的字符,用稍微短一些的編碼;出現(xiàn)頻率比較少的字符,用稍微長(zhǎng)一些的編碼。
由于霍夫曼編碼是不等長(zhǎng)的,每次應(yīng)該讀取1為還是2位,3位等來解壓縮是個(gè)問題,這個(gè)問題導(dǎo)致霍夫曼編碼解壓縮比較復(fù)雜。
為了避免解壓縮過程中的歧義,霍夫曼編碼要求各個(gè)字符的編碼之間,不會(huì)出現(xiàn)某個(gè)編碼是另一個(gè)編碼前綴的情況。

假設(shè)這6個(gè)字符出現(xiàn)的頻率從高到低依次是a,b,c,d,e,f。我們把它們編碼下面這個(gè)樣子,任何一個(gè)字符的編碼都不是另一個(gè)的前綴,在解壓縮的時(shí)候,我們每次會(huì)讀取盡可能長(zhǎng)的可解壓縮的二進(jìn)制,所以在解壓縮的時(shí)候也不歧義。

根據(jù)字符出現(xiàn)頻率的不同,給不同的字符進(jìn)行不同長(zhǎng)度的編碼的實(shí)現(xiàn)方式
把每個(gè)字符看作一個(gè)節(jié)點(diǎn),并且輔帶著把頻率放到優(yōu)先級(jí)隊(duì)列中。從隊(duì)列中取出頻率最小的兩個(gè)節(jié)點(diǎn)A,B,然后新建一個(gè)節(jié)點(diǎn)C,把頻率設(shè)置為兩個(gè)節(jié)點(diǎn)的頻率之和,并把這個(gè)新節(jié)點(diǎn)C作為節(jié)點(diǎn)A,B的父節(jié)點(diǎn)。最后再把C節(jié)點(diǎn)放入到優(yōu)先級(jí)隊(duì)列中。重復(fù)這個(gè)過程,直到隊(duì)列中沒有數(shù)據(jù)。

給每一條邊畫上一個(gè)權(quán)值,指向左子節(jié)點(diǎn)的邊,我們統(tǒng)統(tǒng)標(biāo)記為0,指向右子節(jié)點(diǎn)的邊,我們統(tǒng)統(tǒng)標(biāo)記為1,那從根節(jié)點(diǎn)到葉節(jié)點(diǎn)的路徑就是葉節(jié)點(diǎn)對(duì)應(yīng)字符的霍夫曼編碼

筆記整理來源: 王爭(zhēng) 數(shù)據(jù)結(jié)構(gòu)與算法之美

總結(jié)

以上是生活随笔為你收集整理的【数据结构与算法】【算法思想】贪心算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。