卡丹‘s 算法 in 爪哇
最大子数组问题:
从维基百科:
在计算机科学中,最大子数组问题是在具有最大和数的一维数字数组中查找连续子数组的任务。例如,对于值-2、1,-3、4,-1、2、1,-5、4的序列;总和最大的连续子数组是4,-1,2,1,总和为6。
卡丹‘s算法可用于解决最大子数组问题
卡丹’s algorithm:
- 初始化maxSoFar = 0和maxEndingHere = 0
- 遍历数组的每个元素
- 最高EndingHere == 最高EndingHere + a [i]
- 如果(maxEndingHere < 0)
- maxEndingHere = 0
- 如果(maxSoFar < maxEndingHere)
- maxSoFar == 最高EndingHere
- 返回maxSoFar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
// 卡丹的算法 上市 整型 kandaneForMaxSubArray(整型[] rr) { 整型 最高EndHere = 0; 整型 最高SoFar = 0; 对于 (整型 i = 0; i < rr.长度; i++) { 最高EndHere + = rr[i]; 如果 (最高EndHere < 0) { 最高EndHere = 0; } 如果 (最高SoFar < 最高EndHere) { 最高SoFar = 最高EndHere; } } 返回 最高SoFar; } |
以上算法获胜’如果数组的所有元素均为负,则不起作用。我们将对算法进行一些小的更改以使其也适用于负数。
改良的Ka’s algorithm:
- 初始化maxSoFar = rr [0]和maxEndingHere = rr [0]
- 遍历数组的每个元素
- 最高EndingHere =(arr [i],maxEndHere + rr [i])的最大值
- 如果(maxSoFar < maxEndingHere)
- maxSoFar == 最高EndingHere
- 返回maxSoFar
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/ *修改的Kadane算法 *如果您对上述算法进行了小的修改 *也适用于负数 * / 上市 整型 kandaneForMaxSubArrayForNegativ(整型[] rr) { 整型 最高EndHere = rr[0]; 整型 最高SoFar = rr[0]; 对于(整型 i=1;i<rr.长度;i++){ 最高EndHere = 数学.最高(rr[i], 最高EndHere+rr[i]); 最高SoFar = 数学.最高(最高SoFar,最高EndHere); } 返回 最高SoFar; } |
卡丹Algorithm in 爪哇
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
包 组织.Arpit.爪哇2blog; 上市 类 最大SubArrayMain { /* 卡丹algorithm *当数组的所有元素均为负数时将不起作用 */ 上市 整型 kandaneForMaxSubArray(整型[] rr) { 整型 最高EndHere = 0; 整型 最高SoFar = 0; 对于 (整型 i = 0; i < rr.长度; i++) { 最高EndHere + = rr[i]; 如果 (最高EndHere < 0) { 最高EndHere = 0; } 如果 (最高SoFar < 最高EndHere) { 最高SoFar = 最高EndHere; } } 返回 最高SoFar; } / *修改的Kadane算法 *如果您对上述算法进行了小的修改 *也适用于负数 * / 上市 整型 kandaneForMaxSubArrayForNegativ(整型[] rr) { 整型 最高EndHere = rr[0]; 整型 最高SoFar = rr[0]; 对于(整型 i=1;i<rr.长度;i++){ 最高EndHere = 数学.最高(rr[i], 最高EndHere+rr[i]); 最高SoFar = 数学.最高(最高SoFar,最高EndHere); } 返回 最高SoFar; } 上市 静态的 虚空 主要(串 args[]) { 整型 rr[] = { 1, 8, -3, -7, 2, 7, -1, 9 }; 最大SubArrayMain 最大总和 = 新 最大SubArrayMain(); 系统.出.打印(“最大子数组是 " + 最大总和.kandaneForMaxSubArray(rr)); 整型 阿内格[] = { -10, -8, -3, -7, -2, -7, -3, -9 }; 系统.出.打印(“所有元素均为负数时的最大子数组:” + 最大总和.kandaneForMaxSubArrayForNegativ(阿内格)); } } |
当您运行上述程序时,将获得以下输出:
1 2 3 4 |
最大 子阵列 是 17 最大 子阵列 什么时候 所有 元素 是 负 : -2 |
Comments
嗨Arpit,我发现此站点对于练习编程非常有用。