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