1.贪婪算法的概念
贪婪算法被用于解决一些看起来很复杂,很难快速求得最优解的问题,具体步骤就是每一步就选择局部最优解,最终得到的就是全局最优解
,优点是简单易行。
解决背包问题
不能使用贪婪算法,因为每一步选择的局部最优解,最终得到的不一定是全局最优解。
2.实例:集合覆盖问题
如何找出覆盖全美50个州的最小广播台集合呢?所有可能的集合总数有
2
n
2^n
2n个,所以运行时间为
O
(
2
n
)
O(2^n)
O(2n),使用暴力遍历求得最优解要花费大量时间,所以只能采取贪婪算法策略:
- 选出这样一个广播台,即它覆盖了最多的未覆盖州。
- 重复第一步,直到所有的州都被覆盖。
在这个例子中,运行时间为 O ( n 2 ) O(n^2) O(n2)。评估贪婪算法的性能有两个方面:
- 速度
- 得到的近似解与最优解的接近程度
2.1 概念表示
所要覆盖的州:
states_needed = set(['mt','wa','or','id','nv','ut','ca','az'])
广播台:
stations = {}
stations['kone'] = set(["id","nv","ut"])
2.2 算法流程
while states_needed:
best_station = None
states_covered = set()
for station,state_for_station in stations.items():
covered = states_for_station & states_needed
if len(covered) > len(states_covered):
best_station = station
states_covered = covered
states_needed -= states_covered
final_stations.add(best_station)
2.3 代码注解
covered = states_for_station & states_needed
表示集合的交集
,类似的有:
states_for_station | states_needed
并集
states_for_station - states_needed
差集
len(covered) > len(states_covered)
确保遍历完for循环后得到的best_station
在当前阶段能覆盖最多数目的广播站。
2.4 算法结果
>>>print(final_stations)
set(['ktwo','kthree','kone','kfive'])
3.NP完全问题
NP完全问题的简单定义是,以难解
著称的问题,如旅行商问题和集合覆盖问题。
识别NP完全问题的几点技巧: