對於最大子串行和問題的求解方法,目前我掌握了四個演算法。一開始學習的時候,這四個演算法中讓我有點頭疼的是其中的遞迴演算法(我是真的不喜歡用遞迴的啊《哭唧唧),搞來搞去,最終還是弄懂是怎麼一回事了。
在這篇文章中,我會寫出四個演算法並加以解釋。
【演算法1】這個演算法以及演算法2都很容易理解,他們就是把每個數以及每個數與後邊相鄰的數的和做比較,誰大就用誰的。
//該演算法執行時間為o(n^3)
public static int maxsum1(int a)
}return maxsum;
}
【演算法2】比演算法1少了乙個for迴圈
//該演算法執行時間為o(n^2)
public static int maxsum2(int a)}}
return maxsum;
}
【演算法3】遞迴求解,用了「分治」策略。
//該演算法時間複雜度為o(nlogn)
public static int max3(int a,int b,int c)
public static int maxsum3(int a,int left,int right)else
int center=(left+right)/2;//二分
int maxsumleft=maxsum3(a,left,center);//求出左半部分的最大子串行和
int maxsumright=maxsum3(a,center+1,right);//求出右半部分最大子串行的和
int maxborderleft=0;int leftborder=0;//包含左半部分最後乙個數的最大值求解
for(int i=center;i>=left;i--)
}int maxborderright=0;int rightborder=0;//包含右半部分第乙個數的最大值求解
for(int i=center+1;i<=right;i++)
}return max3(maxsumleft,maxsumright,maxborderleft+maxborderright);
}
【演算法4】聯機演算法。為什麼這個演算法是正確的呢,關鍵之處在於這個演算法**中的else語句,當前邊有正數,且他是最大的子串行和,那他加上後邊的大於零的數不也就是最大的嗎!
//聯機演算法 該演算法時間複雜度為o(n)
public static int maxsum4(int a)else if(thissum<0)
}return maxsum;
}
最後貼上我測試這幾個演算法的結果以及main函式
【main函式】
static int a=;
public static void main(string args)
結果
最大子串行和問題求解
基本思想 窮舉式的嘗試所有可能,通過三層迴圈計算所有子串行的和。演算法步驟 1.第一層迴圈從0到n 1,確定子串行的開始位置 2.第二層迴圈從第一層迴圈變數開始到n 1,確定子串行的結束位置 3.第三層迴圈從第一層迴圈變數開始到第二層迴圈變數結束,計算這個子串行的和,並與最大子串行和比較,如果大於最...
求解最大子串行和問題
原題 給定乙個陣列,其中元素有正,也有負,找出其中乙個連續子串行,使和最大 不想說明什麼,我們資料結構老師第一節課就給我們講這個,以前給實現過乙個暴力演算法版的演算法複雜度 o n2 現在實現乙個動態規劃版的 求解最大子串行和問題o n 演算法 param array public static v...
最大子串行和問題的求解
問題描述 給定 可能存在負值 整數a1,a 2.a n,求最大子串行和。如果所有的整數均為負數,則最大子串行和為0.列如 對於輸入 2,11,4,13,5,2,該輸入的最大子串行和為20 11 4 13 現在我們將敘述四個演算法來求解最大子串行和問題。1.該演算法是使用窮舉法來嘗試所有的可能 演算法...