貪心算法實現思路及其代碼演示

一、什麼是貪心算法?

去百度上搜索一下,它會給你提供下面一段話:

貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的局部最優解。
貪心算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。

由此我們可以進行一個簡單的總結:所謂貪心算法,不就是解決問題時,選出最簡單的、最快捷的方式嘛!
那麼在解決哪些問題上時,我們可以使用上呢?以及其具體的實現思路是什麼呢?這篇文章將會對貪心算法進行仔細地分析,讓你領會到算法的魅力~

二、實例分析

首先上一張圖:
在這裏插入圖片描述
如果我們沒學習過貪心算法,肯定第一反應是慢慢組合嘛!

如果只有一個廣播臺A,那麼只有一種組合方式:A。
如果有兩個廣播臺,分別爲A、B,那麼將會有三種組合方式:A、B、AB。
如果有三個廣播臺,分別爲A、B、C,那麼將會有七種組合方式:A、AB、AC、ABC、B、BC、C。

由此我們可以很簡單的得到一個結論:我們假設廣播臺有n個,那麼可以得知一共有2∧n-1種組合方式。但是這樣做往往耗時耗力,程序的時間複雜度會非常高,不推薦使用。這時候就要引出我們的貪心算法了!

三、貪心算法思路分析

  1. 還是按照上面那個圖來說。我們將K1-K5遍歷以後,可以得到一個包含所有城市的集合(“北京”“上海””天津““廣州”“深圳”“成都”“杭州“”大連“)
  2. 之後遍歷所有的廣播臺,找到一個覆蓋了最多未覆蓋區域的電臺。
  3. 然後將這個廣播臺放入一個數組中,比如ArrayList。並將這個電臺覆蓋的區域在下次比較時去掉。
  4. 重複第一步操作。

你可能將以上步驟看完,並不懂什麼意思,那麼我下面就來進行詳細的圖解:

  1. 首先,我們可以得知每個廣播臺覆蓋區域的城市,佔所有區域中的幾個。

    然後我們將佔區域最多的廣播臺,放入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];

這就是貪心算法的相關思路。相信看到這裏的小夥伴,應該對整個過程都有一定的瞭解了!有了思路,那麼代碼的實現也是非常的簡單,我們下面直接上代碼!

四、貪心算法代碼實現

在這裏插入圖片描述

整個貪心算法的實現代碼,如上圖所示~

每一個過程基本上我都添加了註釋,理解起來應該不會太難~

當然你也可以選擇用加斷點的方式,來一步步進行調試,從而幫助你進一步理解~

學習算法的過程是很枯燥、乏味的,但是希望大家都能夠不放棄,一起繼續加油呀~!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章