爪哇2博客
爪哇2博客

卡丹‘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
 


导入联系人

您可能还喜欢:

分享这个

作者

关注作者

相关文章

  • 11月29日

    超过100个Java编码面试问题

    我一直在发布有关各种主题的数据结构和编码面试问题,例如数组,队列,堆栈,二叉树,LinkedList,字符串,数字,ArrayList等。因此,我合并了一系列Java编码面试问题以创建索引发布。每当我添加新的Java [时,我都会继续添加指向此帖子的链接[…]

  • 4月18日

    到达最后一个索引的最小跳转数

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将看到如何找到到达上一个索引的最小跳转数。问题给定一个正整数数组A(可能为零),每个索引表示[…]

  • 3月28日

    对0、1和2的数组进行排序

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将看到如何对0、1和2s的数组进行排序。我们已经看到了有关对数组中的0s和1s进行排序的文章。问题给定一个包含零的数组,[…]

  • 3月04

    通过跳转检查是否有可能到达给定数组的末尾

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。问题给定一个具有正整数作为元素的数组,该数组指示可以从数组中任何位置进行跳转的最大长度。检查是否可以[…]

  • 2月17日

    检查数组元素是否连续

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将看到如何检查数组元素是否连续。问题给定一个数组,我们需要检查数组是否包含连续的元素。例如:输入:array [] = {5,3,4,[…]

  • 2月04日

    O(Sqrt(height))中的K元树的LCA

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将了解如何在O(Sqrt(height))中找到K元树的最低公共祖先。我们已经看到了如何在O(n)复杂度中找到n元树的LCA。给定[…]

Comments

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量教程到您的收件箱。现在订阅。


成为朋友

©2020 爪哇2博客