max subarray暴力方法为第一个数组产生大的总和

时间:2016-10-07 02:59:17

标签: c++ arrays

我编写了一个使用强力方法计算max子阵列的代码。我的代码从输入文件中读取多个数组并返回输出文件,其中包含max子数组和sum值。

一切正常,但输出文件中的第一个最大子数组总是在末尾包含一个非常大的数字,它会被添加到总和值中。后续的子阵列没有这个问题。我在这篇文章的底部附上了一个例子。

我无法弄清楚我哪里出错了。任何帮助将不胜感激!

这是运行算法并将其打印到输出文件的函数:

void a1(int a[], int size, string filename){ 

//run algorithm 1
int sum = a[0], start = 0, end = 0;
for (int x = 0; x < size; x++) {
    int tempSum = 0;
    int y = x;
    while(y>=0){
        tempSum += a[y];
        if(tempSum>sum){
            sum=tempSum;
            start=y;
            end=x;
        }
        y--;
    }
}

//print results on file
ofstream output;
output.open(filename.c_str(), ios::out | ios::app);
output << "\nMax sum array: ";
    for (int x = start; x <= end; x++) {
        output << a[x];
        if (x != end) output << ", ";
    }
output << "\nMax sum value: " <<  sum << "\n";
output.close();
} 

这是主文件:

int main() {
    int a[50];
    ifstream inputFile;
    string s;
    stringstream ss;
    string outputfile = "MSS_Results.txt";

//print title
ofstream output;
output.open(outputfile.c_str(), ios::out | ios::app);
output << "Algorithm 1:\n";
output.close();

//read file and run a1
int size;
char c;
inputFile.open("MSS_Problems.txt");
while (!inputFile.eof()) {
    getline(inputFile, s);
    size = 0;
    ss << s;
    ss >> c;
    while (ss.rdbuf()->in_avail()) {
        ss >> a[size];
        size++;
        ss >> c;
        if (!ss.rdbuf()->in_avail() && c != ']') {
            ss.clear(); 
            getline(inputFile, s);
            ss << s;
        }
    }
    ss.clear();
    if (size > 0) a1(a, size, outputfile);
}
inputFile.close();

  return 0;
}

输入文件示例:

[1, 2, 4, -1, 4, -10, 4, -19, 18, -1, -3, -4, 11, 3, -20, 19, -33, 50, 66, -22, -4, -55, 91, 100, -102, 9, 10, 19, -10, 10, 11, 11, -10, -18, 50, 90]
[12, 12, 14, -88, -1, 45, 6, 8, -33, 2, 8, -9, -33, -8, -23, -77, -89, 1, 9, 10, 92, 87]
[565, 78, 33, 9, 10, 84, 71, -4, -22, -55, -10, 76, -9, -9, -11, 76, 89, 11, 10, -33, 9]
[2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]

输出文件示例:

Algorithm 1:

Max sum array: 50, 66, -22, -4, -55, 91, 100, -102, 9, 10, 19, -10, 10, 11, 11, -10, -18, 50, 90, 3897136
Max sum value: 3897432

Max sum array: 1, 9, 10, 92, 87, 91
Max sum value: 290

Max sum array: 565, 78, 33, 9, 10, 84, 71, -4, -22, -55, -10, 76, -9, -9, -11, 76, 89, 11, 10, -33, 9, 87
Max sum value: 1055

Max sum array: 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 11
Max sum value: 103

如您所见,对于第一个数组,有一个3897136不属于原始数组。

如果我从输入中删除第一行,则输入如下所示:

[12, 12, 14, -88, -1, 45, 6, 8, -33, 2, 8, -9, -33, -8, -23, -77, -89, 1, 9, 10, 92, 87]
[565, 78, 33, 9, 10, 84, 71, -4, -22, -55, -10, 76, -9, -9, -11, 76, 89, 11, 10, -33, 9]
[2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]

现在我的输出看起来像这样:

Algorithm 1:

Max sum array: 1, 9, 10, 92, 87, 624
Max sum value: 823

Max sum array: 565, 78, 33, 9, 10, 84, 71, -4, -22, -55, -10, 76, -9, -9, -11, 76, 89, 11, 10, -33, 9, 87
Max sum value: 1055

Max sum array: 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3
Max sum value: 92

2 个答案:

答案 0 :(得分:0)

我错误地初始化了数组,这就是为什么它有时会在最后给我一个垃圾数字。要正确初始化,我只需更改

a[100];

a[100] = {0}

并修复了数组末尾异常大数字的问题。

然后我将a[100] = {0}移动到while循环中,代码读取输入文件。这似乎解决了将错误元素读入数组的新问题。

最终未解决的问题:数组末尾为0。

我解决后会更新。

答案 1 :(得分:-1)

由于所有问题都是找到最大的子阵列,因此需要添加末尾的“大数”以产生正确的结果。

在您提供的第一个示例中,所有数字均为正数。 这意味着最大和子数组实际上是 all 数组元素的总和。

您的算法部分正常;