循环缓冲区中的最大连续和

时间:2011-05-18 15:58:26

标签: arrays algorithm

我有一个程序来确定数组中最大的连续总和,但是想要扩展它以使用循环数组。是否有更简单的方法来做到这一点,而不是加倍单个数组并调用我的函数来找到2n长度数组中所有n长度数组的最大总和?

7 个答案:

答案 0 :(得分:7)

请参阅以下链接:

使用Kadane Algorithem解决了一个问题。

http://www.geeksforgeeks.org/maximum-contiguous-circular-sum/

答案 1 :(得分:3)

我认为@spinning_plate的解决方案是错误的。你可以考虑给定的案例。

int arr [] = {-3,6,2,1,7,-8,13,0};

你的方法返回21。

实际解可以从第6个索引(即13值)开始,并且从第4个索引(即7值)结束。由于数组是循环的,我们可以从第6个索引到第7个索引以及从第0个索引到第4个索引进行连续序列化。

上述案例的实际答案是:26

答案 2 :(得分:1)

好吧,你不必实际加倍数组。您可以通过索引现有数组模n来模拟它,或者只迭代它两次。根据数组的大小和缓存行为,这应该比非圆阵列的算法慢两倍。

答案 3 :(得分:1)

对于给定的问题, 我们将应用kadane算法,我们也将找到具有最大负值的子集。如果去除最大负值,将以循环次序给出剩余数组的总和。如果该和大于最大总和那么最大总和将按循环次序汇总。 算法的复杂度为O(n)。

Eg:- arr[i]={10,-3,-4,7,6,5,-4,-1}
      Ans:  max_sum=7+6+5+(-4)+(-1)+10
            Removed_set={-3,-4}
int find_maxsum(int arr[],int n)
{
 int i=0;
 int total=0;
 int maxa=0;
 int mini=0;
 int min_sum=0;
 int max_sum=0;


 while(i<n) 
  {
    maxa=maxa+arr[i];
    total=total+arr[i];
    mini=mini+arr[i];

   if(maxa>max_sum)
     max_sum=maxa; 
   if(mini<min_sum)
     min_sum=mini;
   if(maxa<0)
     maxa=0;
   if(mini>=0)
    mini=0;
}
if(total-min_sum>max_sum)
   max_sum=total-min_sum;
 return max_sum;

}

答案 4 :(得分:0)

我假设您正在使用O(n)算法继续添加总和,跟踪最大值,只有在您总和为负数时才重新启动。捕获圆形数组的唯一方法是将相同的原理应用于圆形方面。当你在原始算法中到达数组的末尾时,保持循环到开始,直到你低于最大值或达到当前范围的开头(我认为这是不可能的,因为如果解决方案是完整的数组,我们可以在第一次通过时看到这一点,在这种情况下,你已经完成了。

max_start=0; max_end =0; maxv = 0; sum 0;
for i in range(arr):
    sum+= arr[i];
    if sum<0:
       sum=0; max_start =i;
    if maxv<sum:
       maxv=sum; max_end = i;

#seocnd pass
for i in range(max_start):
    sum+= arr[i];
    if sum<0:
       break;
    if maxv<sum:
       maxv=sum;max_end = i;

答案 5 :(得分:0)

基于nikhil's idea的正确代码:最小和子数组的元素不能出现在最终的包装或非最大和子数组中。

public int maxSum(int[] arr) {
    if (arr.length == 0) return 0;

    int sum = 0;
    int min = Integer.MAX_VALUE;
    int eix = 0;
    for (int i = 0; i < arr.length; i++) {
        sum = sum + arr[i] < arr[i] ? sum + arr[i] : arr[i];
        if (sum < min) {
            min = sum;
            eix = i;
        }
    }
    int max = 0;
    sum = 0;
    for (int i = eix; i < arr.length + eix; i++) {
        int ix = i < arr.length ? i : i - arr.length;
        sum = sum + arr[ix] > arr[ix] ? sum + arr[ix] : arr[ix];
        max = max > sum ? max : sum;
    }

    return max;
}

答案 6 :(得分:0)

即使所有数字均为负,例如{-1,-2,-3},此代码也返回正确的答案。 将返回-1;

from PIL import ImageTk,Image
from tkinter import *
base = Tk()
base.title("Image Viewer")
base.iconbitmap("download.ico")
img1 = ImageTk.PhotoImage(Image.open("download.png"))
label1 = Label(image = img1)
label1.grid(row = 0, column = 0, columnspan = 3)
base.mainloop()