一、什麼是貪心算法?
去百度上搜索一下,它會給你提供下面一段話:
貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的局部最優解。
貪心算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。
由此我們可以進行一個簡單的總結:所謂貪心算法,不就是解決問題時,選出最簡單的、最快捷的方式嘛!
那麼在解決哪些問題上時,我們可以使用上呢?以及其具體的實現思路是什麼呢?這篇文章將會對貪心算法進行仔細地分析,讓你領會到算法的魅力~
二、實例分析
首先上一張圖:
如果我們沒學習過貪心算法,肯定第一反應是慢慢組合嘛!
如果只有一個廣播臺A,那麼只有一種組合方式:A。
如果有兩個廣播臺,分別爲A、B,那麼將會有三種組合方式:A、B、AB。
如果有三個廣播臺,分別爲A、B、C,那麼將會有七種組合方式:A、AB、AC、ABC、B、BC、C。
由此我們可以很簡單的得到一個結論:我們假設廣播臺有n個,那麼可以得知一共有2∧n-1種組合方式。但是這樣做往往耗時耗力,程序的時間複雜度會非常高,不推薦使用。這時候就要引出我們的貪心算法了!
三、貪心算法思路分析
- 還是按照上面那個圖來說。我們將K1-K5遍歷以後,可以得到一個包含所有城市的集合(“北京”“上海””天津““廣州”“深圳”“成都”“杭州“”大連“)
- 之後遍歷所有的廣播臺,找到一個覆蓋了最多未覆蓋區域的電臺。
- 然後將這個廣播臺放入一個數組中,比如ArrayList。並將這個電臺覆蓋的區域在下次比較時去掉。
- 重複第一步操作。
你可能將以上步驟看完,並不懂什麼意思,那麼我下面就來進行詳細的圖解:
- 首先,我們可以得知每個廣播臺覆蓋區域的城市,佔所有區域中的幾個。
然後我們將佔區域最多的廣播臺,放入ArrayList數組中,得到:
ArrayList[K1];
(這時候可能會有小夥伴問K2,K3 不是個K1所佔區域數是一樣的嗎?在這裏,我們每次取第一個元素)
2.這時候,我們將總的區域中,與K1覆蓋區域相同的城市去掉,並重新獲取每個廣播臺所佔幾個,就變成下圖這樣:
這時候我們繼續將所佔區域最多的廣播臺放入數組中,得到:
ArrayList[K1,K2];
3.我們繼續重複上面的操作,就得到下圖:
我們繼續將佔有數最高的廣播臺,放入數組中,得到:
ArrayList[K1,K2,K3];
4.繼續之前的操作,得到下圖:
繼續將佔有最多的廣播臺,放入數組中,得到:
ArrayList[K1,K2,K3,K5];
5.其實第五步有點多餘了,因爲我們肯定知道,最後一步他們的佔有數都是零,但是我繼續上張圖吧!
這時候就不需要將任何數放進數組了!
所以我們用很高效、簡單的方式就得到了最優解,即:
ArrayList[K1,K2,K3,K5];
這就是貪心算法的相關思路。相信看到這裏的小夥伴,應該對整個過程都有一定的瞭解了!有了思路,那麼代碼的實現也是非常的簡單,我們下面直接上代碼!
四、貪心算法代碼實現
整個貪心算法的實現代碼,如上圖所示~
每一個過程基本上我都添加了註釋,理解起來應該不會太難~
當然你也可以選擇用加斷點的方式,來一步步進行調試,從而幫助你進一步理解~
學習算法的過程是很枯燥、乏味的,但是希望大家都能夠不放棄,一起繼續加油呀~!