贪心算法
贪心算法(又称贪婪算法),核心思想在求解问题的时候,总是选择当前情况的最优解。贪心算法不是所有问题都能得到整体最优解,核心在于贪心算法的策略选择,选择的贪心策略需要具备无后效性,即某个状态以前的过程不能影响以后的状态至于当前状态有关。
贪心算法总是选择当前情况下的最优选择,而不是从整体最优考虑。贪心算法是做的局部最优选择,最终的结果可能在整体环境下不是最优解,但非常接近最优解。贪心算法也会因为策略不同得到不同的结果。
应用场景
集合覆盖问题
假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号
实现思路
- 遍历所有电台覆盖的区域,将他装在hashSet中记为allAreas
- 创建临时maxKey指针指向每次循环中包含最多未覆盖地区的电台Key
- 创建一个Selector的List用于记录需要选择的电台
- 遍历每一个电台,将K电台的覆盖地区与allAreas求交集,maxKey指向交集个数最多的一个key(此处体现贪心算法核心,每次只选择最优解)
- 遍历一遍一次得到maxKey加入到Selector到集合中作为需要选择的电台
- maxKey置空 将被覆盖的电台从 allAreas中移除
- 一直循环到allAreas不存在元素 此时Selector中存放的key即是选择方式
def broadcast_station_problem():
"""
贪心算法(又称贪婪算法),核心思想在求解问题的时候,总是选择当前情况的最优解。
贪心算法不是所有问题都能得到整体最优解,核心在于贪心算法的策略选择,
选择的贪心策略需要具备无后效性,即某个状态以前的过程不能影响以后的状态至于当前状态有关。
贪心算法总是选择当前情况下的最优选择,而不是从整体最优考虑。贪心算法是做的局部最优选择,最终的结果可能在整体环境下不是最优解,但非常接近最优解。贪心算法也会因为策略不同得到不同的结果。
:return:
"""
b1 = ['北京', '上海', '天津']
b2 = ['广州', '北京', '深圳']
b3 = ['成都', '上海', '杭州']
b4 = ['上海', '天津']
b5 = ['杭州', '大连']
broadcasts = {
'k1': b1,
'k2': b2,
'k3': b3,
'k4': b4,
'k5': b5,
}
# 获取所有地区集合
all_areas = []
for vs in broadcasts.values():
all_areas.extend(vs)
all_areas = set(all_areas)
# 定义一个maxKey指针 指向当前覆盖了最多未覆盖地区的Key
max_key = None
# 定义一个临时set用于暂存key中覆盖的电台
# 定义一个list 用于保存求解的电台结果
target_broadcast_station = []
while len(all_areas) > 0:
# 遍历所有的key 确定maxKey的值
max_intersection = 0
for key in broadcasts.keys():
temp_areas = []
temp_areas.extend(broadcasts[key])
temp_areas = set(temp_areas)
# 求交集
intersection = temp_areas.intersection(all_areas)
# 找到交集最多的一个电台 即 存在未覆盖区域最多的电台
if len(intersection) > max_intersection:
max_intersection = len(intersection)
max_key = key
target_broadcast_station.append(max_key)
# 所有地区中删除已经覆盖的区域
for area in broadcasts[max_key]:
if area in all_areas:
all_areas.remove(area)
return target_broadcast_station
if __name__ == '__main__':
print(broadcast_station_problem())