贪心算法:
1)、贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法
2)、贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果
贪心算法最佳应用-集合覆盖
假设存在如下表的需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号
思路分析:
使用贪婪算法,效率高: 目前并没有算法可以快速计算得到准备的值, 使用贪婪算法,则可以得到非常接近的解,并且效率高。选择策略上,因为需要覆盖全部地区的最小集合:
遍历所有的广播电台, 找到一个覆盖了最多未覆盖的地区的电台(此电台可能包含一些已覆盖的地区,但没有关系)将这个电台加入到一个集合中(比如ArrayList), 想办法把该电台覆盖的地区在下次比较时去掉。重复第1步直到覆盖了全部的地区
详细代码
package greedy
;
import java
.util
.ArrayList
;
import java
.util
.HashMap
;
import java
.util
.HashSet
;
public class greedyAlgorithm {
public static void main(String
[] args
) {
HashMap
<String
,HashSet
<String>> broadcasts
= new HashMap<String
, HashSet
<String>>();
HashSet
<String> hashSet1
= new HashSet<String>();
hashSet1
.add("北京");
hashSet1
.add("上海");
hashSet1
.add("天津");
HashSet
<String> hashSet2
= new HashSet<String>();
hashSet2
.add("广州");
hashSet2
.add("北京");
hashSet2
.add("深圳");
HashSet
<String> hashSet3
= new HashSet<String>();
hashSet3
.add("成都");
hashSet3
.add("上海");
hashSet3
.add("杭州");
HashSet
<String> hashSet4
= new HashSet<String>();
hashSet4
.add("上海");
hashSet4
.add("天津");
HashSet
<String> hashSet5
= new HashSet<String>();
hashSet5
.add("杭州");
hashSet5
.add("大连");
broadcasts
.put("K1", hashSet1
);
broadcasts
.put("K2", hashSet2
);
broadcasts
.put("K3", hashSet3
);
broadcasts
.put("K4", hashSet4
);
broadcasts
.put("K5", hashSet5
);
HashSet
<String> allAreas
= new HashSet<String>();
allAreas
.add("北京");
allAreas
.add("上海");
allAreas
.add("天津");
allAreas
.add("广州");
allAreas
.add("深圳");
allAreas
.add("成都");
allAreas
.add("杭州");
allAreas
.add("大连");
ArrayList
<String> selects
= new ArrayList<String>();
HashSet
<String> tempSet
= new HashSet<String>();
String maxKey
= null
;
while(allAreas
.size() != 0) {
maxKey
= null
;
for(String key
: broadcasts
.keySet()) {
tempSet
.clear();
HashSet
<String> areas
= broadcasts
.get(key
);
tempSet
.addAll(areas
);
tempSet
.retainAll(allAreas
);
if(tempSet
.size() > 0 &&
(maxKey
== null
|| tempSet
.size() >broadcasts
.get(maxKey
).size())){
maxKey
= key
;
}
}
if(maxKey
!= null
) {
selects
.add(maxKey
);
allAreas
.removeAll(broadcasts
.get(maxKey
));
}
}
System
.out
.println("得到的选择结果是" + selects
);
}
}
总结:
贪婪算法即每次都要保证是最优解,使每次取的覆盖范围最大。(tempSet.size()>broadcast.get(maxKey).size())