《算法图解》第八章笔记

    技术2022-07-10  110

    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完全问题的几点技巧:

    Processed: 0.009, SQL: 9