討論四種演算法的執行時間。
演算法1 o(n3):
public static int method1(int a)
if(temp>max)}}
return
max;
}
演算法2 o(n2)
public static int method2(int a) }}
return
max;
}
演算法1和演算法2實現思路是一樣,從a1開始往後取值計算子列和,當取值取到最後一位數時為一次迴圈結束,然後從a2開始取值計算。
演算法1比演算法2複雜的是計算部分過量消耗,演算法2改良之後在求索引為k的temp時可以使用索引為k-1的temp+ak。
演算法3 o(nlogn)
int maxsubseqsum(int arr, int
left, int
right) else
}int center = (left + right) / 2;
int leftmaxsum = maxsubseqsum(arr, left, center); /* 分界線左側最大子數列 */
int rigthmaxsum = maxsubseqsum(arr, center + 1, right); /* 分界線右側最大子數列 */
/* 以分界線往左求最大子數列 */
int leftbordersum = 0, maxleftbordersum = 0;
for (int i = center; i >= left; i--)
}/* 以分界線往右求最大子數列 */
int rightbordersum = 0, maxrightbordersum = 0;
for (int j = center + 1; j <= right; j++)
}/* 跨越分界線最大子數列和 */
int maxbordersum = maxleftbordersum + maxrightbordersum;
return maxsum(leftmaxsum, rigthmaxsum, maxbordersum);
}
演算法三採用分治策略,其想法是把問題分成2個大致相等的問題,然後遞迴地對它們求解,這是「分」的部分。「治」階段將2個子問題的解修補到一起並可能再做些少量的附加工作,最後得到整個問題的解。
演算法4 o(n)
public static int method4(int a)
if(temp<0)
}return
max;
}
演算法4對演算法2再進行改進。通過分析得出乙個結論,如果a[i]是負數,那麼它不可能是最大值序列的起點。近似的,任何負子列都不是最大值序列的字首。如果a[i]到a[j]的子串行是負的,那麼我們可以直接推進到j+1。 最大子串行和問題求解
基本思想 窮舉式的嘗試所有可能,通過三層迴圈計算所有子串行的和。演算法步驟 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.該演算法是使用窮舉法來嘗試所有的可能 演算法...