zoukankan      html  css  js  c++  java
  • [笔记]《算法图解》第八章 贪婪算法

    贪婪算法

    贪婪算法很简单:每步都采取最优的做法。你每步都选择局部最优解,最终得到的就是全局最优解。
    贪婪算法并非在任何情况下都行之有效。

    近似算法

    在有些情况下,完美是优秀的敌人。有时候,你只需找到一个能够大致解决问题的算法,此时贪婪算法正好可派上用场,因为它们实现起来很容易,得到的结果又与正确结果相当接近。

    • 判断近似算法优劣的标准如下:
      1.速度有多快
      2.得到的近似解和最优解的接近程度

    集合

    集合类似于列表,只是不能包含重复的元素。
    集合运算:并集、交集和差集。
    1.并集意味着将集合合并。
    2.交集意味着找出两个集合中都有的元素。
    3.差集意味着将从一个集合中剔除出现在另一个集合中的元素。

    算法实现

        final_stations=set()  
        
        while states_need:  
            best_station=None  
            states_covered=set()  
            for station,states_for_station in stations.items():  
                covered=states_need & states_for_station#求交集  
                if len(covered)>len(states_covered):  
                    best_station=station  
                    states_covered=covered  
                states_need-=states_covered  
                final_stations.add(best_station)
    

    NP完全问题

    NP完全问题的简单定义是, 以难解著称的问题, 如旅行商问题和集合覆盖问题。 很多非常聪明的人都认为, 根本不可能编写出可快速解决这些问题的算法。
    判断NP完全问题:

    • 元素较少时算法的运行速度非常快, 但随着元素数量的增加, 速度会变得非常慢。
    • 涉及“所有组合”的问题通常是NP完全问题。
    • 不能将问题分成小问题, 必须考虑各种可能的情况。 这可能是NP完全问题。
    • 如果问题涉及序列(如旅行商问题中的城市序列) 且难以解决, 它可能就是NP完全问题。
    • 如果问题涉及集合(如广播台集合) 且难以解决, 它可能就是NP完全问题。
    • 如果问题可转换为集合覆盖问题或旅行商问题, 那它肯定是NP完全问题。

    小结

    • 贪婪算法寻找局部最优解, 企图以这种方式获得全局最优解。
    • 对于NP完全问题, 还没有找到快速解决方案。
    • 面临NP完全问题时, 最佳的做法是使用近似算法。
    • 贪婪算法易于实现、 运行速度快, 是不错的近似算法。
  • 相关阅读:
    Streams那些事之概述与原理
    ORA12514: ORACLE 监听错误
    使用软件工具插件 备忘
    jquery 弹出遮罩插件 prettyPhoto 参数说明
    SQL 9位随机码
    向上下左右不间断无缝滚动的效果(兼容火狐和IE)[转]
    SQL 将一串字符串转换为列插入临时表
    jQuery插件开发全解析[转]
    DIV+CSS命名规范
    ASP.NET中Session跨站点共享实现方式
  • 原文地址:https://www.cnblogs.com/everfight/p/grokking_algorithms_note_8.html
Copyright © 2011-2022 走看看