16.python实现贪心思想

贪心算法

贪心算法(又称贪婪算法),核心思想在求解问题的时候,总是选择当前情况的最优解。贪心算法不是所有问题都能得到整体最优解,核心在于贪心算法的策略选择,选择的贪心策略需要具备无后效性,即某个状态以前的过程不能影响以后的状态至于当前状态有关。

贪心算法总是选择当前情况下的最优选择,而不是从整体最优考虑。贪心算法是做的局部最优选择,最终的结果可能在整体环境下不是最优解,但非常接近最优解。贪心算法也会因为策略不同得到不同的结果。

应用场景

集合覆盖问题

假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号
在这里插入图片描述

实现思路
  • 遍历所有电台覆盖的区域,将他装在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())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值