《算法图解》第八章笔记

1.贪婪算法的概念

贪婪算法被用于解决一些看起来很复杂,很难快速求得最优解的问题,具体步骤就是每一步就选择局部最优解,最终得到的就是全局最优解,优点是简单易行。

解决背包问题不能使用贪婪算法,因为每一步选择的局部最优解,最终得到的不一定是全局最优解。

2.实例:集合覆盖问题

《算法图解》第八章笔记_第1张图片
如何找出覆盖全美50个州的最小广播台集合呢?所有可能的集合总数有 2 n 2^n 2n个,所以运行时间为 O ( 2 n ) O(2^n) O(2n),使用暴力遍历求得最优解要花费大量时间,所以只能采取贪婪算法策略:

  1. 选出这样一个广播台,即它覆盖了最多的未覆盖州。
  2. 重复第一步,直到所有的州都被覆盖。

在这个例子中,运行时间为 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完全问题的几点技巧:
《算法图解》第八章笔记_第2张图片

你可能感兴趣的:(《算法图解》,算法,python)