贪婪算法

1、NP完全问题

贪婪算法是一种近似算法,近似算法不能保证最后求得的解是最优解,所以近似算法适用于很难求得最优解的问题,这种问题就是NP完全问题。

先举两个典型的NP完全问题。

问题1,集合覆盖问题。有m个电台,每个电台能覆盖p个州,共有n个州,从m个电台中能覆盖全部州的最小集合。要解这个问题要列出电台的所有组合,然后找出能同时覆盖n个州的最小组合,那一种有多少种组合呢,一共有2的m次幂个。数量非常大。

问题2,旅行商问题。旅行商要去n个城市,想要找出怎么能让访问n个城市的路途最短。怎么让路途变短,需要列出所有可行的方案,先去哪个城市然后再去哪个城市,这样的组合有(n!)种,非常大。

怎么判定一个问题是不是NP完全问题呢,很难判定,但有些参考规律,如下:

  1. 元素较少时算法很快,随着元素增加算法变得非常慢;
  2. 涉及“所有组合”的问题一般是NP完全问题;
  3. 不能将问题拆分成小问题,必须考虑各种可能情况,很可能是;
  4. 如果问题涉及序列或集合,且难以解决,可能是;
  5. 典型的NP完全问题是集合覆盖和旅行商问题,如果问题能转化为其中一个,肯定是;

2、贪婪算法

贪婪算法简单说就是将问题拆成小问题,每一步保证是当前最优,最后求得的结果不一定是最优解但是接近最优解的可以接受的解。

对于上面说的天台覆盖问题,使用贪婪算法的思路是,从m个电台中一个一个选,选保证每一个是能覆盖最多的州,最后选出来这些电台的集合就是一个近似最优解的解。

 

代码实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值