当前位置:   article > 正文

算法基础(5) 贪心算法_贪婪算法和弗罗伊德算法哪个好

贪婪算法和弗罗伊德算法哪个好

1.贪心算法:贪心算法是通过一系列选择找到最优解,每一个决策点都是做一个在当时看来最优的选择,所以贪心算法不一定总是能找到最优解,但通常可以找到最优解。(敝人理解,找到局部最优解而非全局最优解)。

2.适用于贪心算法问题具有的特点:

 贪心选择性质:一个全局最优解可以通过贪心选择来表达。

最优子结构:一个问题的最优解也包含了它的子问题的最优解。

(一个问题是否具备这两个性质,都可以通过证明得到,在下不精于此道,就不证明了啊)

3.贪心算法解题基本步骤:

首先,从问题的一个初始解出发;

然后,采用循环,当可以向最终求解目标前进一步时,采用局部最优策略,得到一个部分解。缩小问题的范围或规模;

最后,综合所有部分解,得到最终解。

下面举几个栗子(好吃啊好吃)

4.活动安排问题

假设有一个资源(比如教室),有n个活动竞争使用,其中一个活动如果竞争成功则将占用该资源[si,fi)时间段,si为活动i开始的时间,fi为活动i结束的时间。如果两个活动i和j,si>fj或sj>fi(即两个活动发生的时间没有重叠),则称活动i,j兼容。活动安排问题就是选择一个由兼容活动组成的最大集合。

首先将所有活动,按照fi非递减的顺序排列

排好序后,按照编号由小到大,选择符合兼容条件的加入集合。最后这个集合为{1,4,8,11}

  1. void GreedySelector(T s[],T f[],bool A[],int n)
  2. { //f[]为排好序的数组
  3. A[0] = true;
  4. int i,j=0;
  5. for(i=1;i<n,i++)
  6. {
  7. if(s[i]<f[j])
  8. {
  9. A[i]=true;
  10. j=i;
  11. }
  12. else
  13. A[i] = false;
  14. }
  15. }

再贴一个完整可编译代码(较复杂,大概看看)

  1. * 主题:活动安排问题
  2. * 作者:chinazhangjie
  3. * 邮箱:chinajiezhang@gmail.com
  4. * 开发语言:C++
  5. * 开发环境:Microsoft Visual Studio
  6. * 时间: 2010.11.21
  7. */
  8. #include <iostream>
  9. #include <vector>
  10. #include <algorithm>
  11. using namespace std ;
  12. struct ActivityTime
  13. {
  14. public:
  15. ActivityTime (int nStart, int nEnd)
  16. : m_nStart (nStart), m_nEnd (nEnd)
  17. { }
  18. ActivityTime ()
  19. : m_nStart (0), m_nEnd (0)
  20. { }
  21. friend
  22. bool operator < (const ActivityTime& lth, const ActivityTime& rth)
  23. {
  24. return lth.m_nEnd < lth.m_nEnd ;
  25. }
  26. public:
  27. int m_nStart ;
  28. int m_nEnd ;
  29. } ;
  30. class ActivityArrange
  31. {
  32. public:
  33. ActivityArrange (const vector<ActivityTime>& vTimeList)
  34. {
  35. m_vTimeList = vTimeList ;
  36. m_nCount = vTimeList.size () ;
  37. m_bvSelectFlag.resize (m_nCount, false) ;
  38. }
  39. // 活动安排
  40. void greedySelector ()
  41. {
  42. __sortTime () ;
  43. // 第一个活动一定入内
  44. m_bvSelectFlag[0] = true ;
  45. int j = 0 ;
  46. for (int i = 1; i < m_nCount ; ++ i) {
  47. if (m_vTimeList[i].m_nStart > m_vTimeList[j].m_nEnd) {
  48. m_bvSelectFlag[i] = true ;
  49. j = i ;
  50. }
  51. }
  52. copy (m_bvSelectFlag.begin(), m_bvSelectFlag.end() ,ostream_iterator<bool> (cout, " "));
  53. cout << endl ;
  54. }
  55. private:
  56. // 按照活动结束时间非递减排序
  57. void __sortTime ()
  58. {
  59. sort (m_vTimeList.begin(), m_vTimeList.end()) ;
  60. for (vector<ActivityTime>::iterator ite = m_vTimeList.begin() ;
  61. ite != m_vTimeList.end() ;
  62. ++ ite) {
  63. cout << ite->m_nStart << ", "<< ite ->m_nEnd << endl ;
  64. }
  65. }
  66. private:
  67. vector<ActivityTime> m_vTimeList ; // 活动时间安排列表
  68. vector<bool> m_bvSelectFlag ;// 是否安排活动标志
  69. int m_nCount ; // 总活动个数
  70. } ;
  71. int main()
  72. {
  73. vector<ActivityTime> vActiTimeList ;
  74. vActiTimeList.push_back (ActivityTime(1, 4)) ;
  75. vActiTimeList.push_back (ActivityTime(3, 5)) ;
  76. vActiTimeList.push_back (ActivityTime(0, 6)) ;
  77. vActiTimeList.push_back (ActivityTime(5, 7)) ;
  78. vActiTimeList.push_back (ActivityTime(3, 8)) ;
  79. vActiTimeList.push_back (ActivityTime(5, 9)) ;
  80. vActiTimeList.push_back (ActivityTime(6, 10)) ;
  81. vActiTimeList.push_back (ActivityTime(8, 11)) ;
  82. vActiTimeList.push_back (ActivityTime(8, 12)) ;
  83. vActiTimeList.push_back (ActivityTime(2, 13)) ;
  84. vActiTimeList.push_back (ActivityTime(12, 14)) ;
  85. ActivityArrange aa (vActiTimeList) ;
  86. aa.greedySelector () ;
  87. return 0 ;
  88. }

这篇先到这儿,贪心算法未完待续。。。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/822070
推荐阅读
相关标签
  

闽ICP备14008679号