1. 程式人生 > >貪心演算法之最大的子組合求解

貪心演算法之最大的子組合求解

      本來博主是沒有心情寫這篇部落格了,因為昨天住的地方遭賊了。半夜兩點多,偷開我家窗戶,把博主臥室裡面的玫瑰金給偷走了。當時博主就睡得特別不舒服,半夜醒來就發現手機被偷了。搞得博主後半夜基本沒有睡,萬幸的是,博主的手機開了“查詢iphone”功能,因此開啟了丟失模式之後,任小賊再牛逼,刷了機也用不了。雖然拿不回來,也要噁心死小偷。所以,在此,博主也提醒各位博友,一定一定要將iphone的“查詢iphone功能”開啟。

     回到正題吧,前兩天在複習資料結構和演算法,也看了一些演算法題。於是,就將自己碰到的且學習了的演算法題,貢獻到部落格中,以備溫故而知新嘛。

     貪心演算法又稱為掃描演算法,在《程式設計珠璣》這本書中有介紹,說實話,我是因為不懂這個演算法才去看的這本書,而不是從書中看到這個演算法。貪心演算法是一種有缺陷的演算法。主要思想就是通過求解區域性最優解來獲得全域性最優解的演算法。主要是這個演算法無法考慮到所有的情形,所以在某一些的場景中是十分有效,但適用性不廣。下面就是這個演算法的一個例項應用。

    求一個數組中的所有子組中最大的一個。例如:-1,2,5,3,-2,5,-3中最大的子組和為2,5,3,-2,5這個子組。下面就給出這個演算法的實現程式碼,程式碼異常簡單,但是設計思想非常狡猾。

int GetMax(int m,int n){
   return m>n?m:n;
}
int MaxSubArray(int array[],int length){
    int maxendhere = 0;
    int maxsofar=0;
    for(int i = 0;i < length;i++){
    maxendhere  = GetMax(maxendhere + array[i] ,0);// 求出了陣列中a[i]之前的最優子組
    maxsofar = GetMax(maxendhere ,maxsofar); // 從子組中獲得最大的子組
}
  return maxsofar;
}