1、NP完全问题
贪婪算法是一种近似算法,近似算法不能保证最后求得的解是最优解,所以近似算法适用于很难求得最优解的问题,这种问题就是NP完全问题。
先举两个典型的NP完全问题。
问题1,集合覆盖问题。有m个电台,每个电台能覆盖p个州,共有n个州,从m个电台中能覆盖全部州的最小集合。要解这个问题要列出电台的所有组合,然后找出能同时覆盖n个州的最小组合,那一种有多少种组合呢,一共有2的m次幂个。数量非常大。
问题2,旅行商问题。旅行商要去n个城市,想要找出怎么能让访问n个城市的路途最短。怎么让路途变短,需要列出所有可行的方案,先去哪个城市然后再去哪个城市,这样的组合有(n!)种,非常大。
怎么判定一个问题是不是NP完全问题呢,很难判定,但有些参考规律,如下:
- 元素较少时算法很快,随着元素增加算法变得非常慢;
- 涉及“所有组合”的问题一般是NP完全问题;
- 不能将问题拆分成小问题,必须考虑各种可能情况,很可能是;
- 如果问题涉及序列或集合,且难以解决,可能是;
- 典型的NP完全问题是集合覆盖和旅行商问题,如果问题能转化为其中一个,肯定是;
2、贪婪算法
贪婪算法简单说就是将问题拆成小问题,每一步保证是当前最优,最后求得的结果不一定是最优解但是接近最优解的可以接受的解。
对于上面说的天台覆盖问题,使用贪婪算法的思路是,从m个电台中一个一个选,选保证每一个是能覆盖最多的州,最后选出来这些电台的集合就是一个近似最优解的解。