Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最大和子阵O(n)不是Kadane的_Java_Algorithm_Arrays_Kadanes Algorithm - Fatal编程技术网

Java 最大和子阵O(n)不是Kadane的

Java 最大和子阵O(n)不是Kadane的,java,algorithm,arrays,kadanes-algorithm,Java,Algorithm,Arrays,Kadanes Algorithm,我在读科曼的算法简介 对于最大和子阵列问题的线性算法,我提出了自己的解决方案。在实施之前没有检查现有的一个嘉手纳 现在我用不同的测试场景测试它,结果总是比嘉手纳的好。我不相信这样的运气,但我找不到我错过了什么。你能看看这是否是一个有效的解决方案吗 公共无效FindMaxSubrayNumber[]编号{ int maxSum=Integer.MIN_值; int左=0; int right=number.length-1; int i=0; int j=i+1; int sum=数字[i].in

我在读科曼的算法简介

对于最大和子阵列问题的线性算法,我提出了自己的解决方案。在实施之前没有检查现有的一个嘉手纳

现在我用不同的测试场景测试它,结果总是比嘉手纳的好。我不相信这样的运气,但我找不到我错过了什么。你能看看这是否是一个有效的解决方案吗

公共无效FindMaxSubrayNumber[]编号{ int maxSum=Integer.MIN_值; int左=0; int right=number.length-1; int i=0; int j=i+1; int sum=数字[i].int值; 而我<数字长度{ 如果maxSum=numbers.length 回来 总和=总和+数字[j].intValue;
如果sum我认为您的算法基本上是正确的,但我可以看到它有两个缺陷:

在输入1-2103上,它将跳过10和输出3。我认为可以通过将I=++j;更改为I=j;来解决这个问题;。 在两个不同的地方,如果j超过末尾,则返回,这将导致根本不产生输出!例如,如果列表末尾出现一长串负数,则会发生这种情况。
此外,我也不希望它比Kadane的更快或更慢。两个数字求和是一个快速的操作,就像将一个变量复制到另一个变量一样快,这就是当你移动子数组的开始位置时所做的操作。

如果你用伪代码解释你的算法会更好。什么是更好的结果比Kadane的算法好?Kadane的算法返回一个最优解-听起来你好像有个bug。这就是我要说的。虽然没有那么好。我的算法不总是计算和。当有很多负数时,它只是移动子数组的开始。我会在一分钟内用伪代码更新post
shift i() --to first non negative number
from j = i+1 up to N.length
  sum + N[j]
  if sum <= 0
    i = j+1
    if N[i] < 0
      shift i()
    sum = 0