-1

分割統治法を使用して配列内の最大サブ配列合計を見つけるアルゴリズムを実装しようとしていますが、何らかの理由でプログラムが終了せず、自分で正常にデバッグできませんでした。誰かが問題の場所を教えてもらえますか?

#include <iostream>
#include <cmath>
using namespace std;
int max_sub_arr(int arr[], int beginning, int end);
int helper_sub_arr(int arr[], int left, int center, int right);
int a[15] = {5, -2, 5, -6, 8, 20, -15, 4, 5, 3, -1, -2 , -5, 10, 1};
int length = 15;
int main()
{
    cout <<max_sub_arr(a, 0, length-1) << endl;
    return 0;
}
int max_sub_arr(int arr[], int beginning, int end)
{

    if(beginning == end) return arr[beginning];
    int center = (end - beginning)/2;
    int left = max_sub_arr(arr, beginning, center);
    int right = max_sub_arr(arr, center+1,end);
    int cross = helper_sub_arr(arr, left, center, right);

    if(left >= right && left >= cross) return left;
    else if(right >= left && right >= cross) return right;
    else return cross;

}
int helper_sub_arr(int arr[], int left, int center, int right)
{
    cout<<"as";
    int leftsum = -pow(2, 31);
    int rightsum = -pow(2, 31);
    int sum = 0;
    int maxleft, maxright;
    for(int i = center; i >= 0; --i)
    {
        sum += arr[i];
        if(sum > leftsum)
        {
            leftsum = sum;
            maxleft = i;
        }
    }
    sum = 0;

    for(int i = center + 1; i <= right; ++i)
    {
        sum += arr[i];
        if(sum > rightsum)
        {
            sum = rightsum;
            maxright = i;
        }
    }

    return maxleft + maxright;

}
4

1 に答える 1

1

int center = (end - beginning)/2;に変更int center = (end + beginning)/2;

実行後、right変数の値が 72564 だったため、50 行でセグメンテーション違反が発生しました。

このhttp://www.geeksforgeeks.org/divide-and-conquer-maximum-sum-subarray/をお読みください。

于 2013-09-26T18:39:19.573 に答える