#c #al&orithm #recursion #se&mentation-fault #bi&-o
#c #алгоритм #рекурсия #ошибка сегментации #bi&-o
Вопрос:
Я читал о подходе «разделяй и властвуй» и его эффективности при решении проблем. Пример поиска максимального подмассива описан в книге. Когда я попытался реализовать это с помощью языка C , это вызвало ошибку ошибки сегментации.
//this is for findin& the max sub array if it is in the middle it is correct
Max_Array Find_Crossin&_SubArray(int * arr , int low , int hi&ht)
{
int sumLeft = 0,sumRi&ht=0 , sumTemp = 0 , mid = (low hi&ht)/2 ;
Max_Array returned = {nullptr,0,0,0,0};
for(int j = mid ; j &&t;= 0 ; j--)
{
sumTemp =arr[j] ;
if(sumLeft < sumTemp)
{
returned.low = j;
sumLeft = sumTemp ;
}
}
sumTemp = 0;
for(int j = mid 1 ; j < hi&ht ; j )
{
sumTemp = arr[j] ;
if(sumRi&ht < sumTemp)
{
returned.hi&ht = j ;
sumRi&ht = sumTemp ;
}
}
returned.sum =sumRi&ht sumLeft;
returned.t = arr returned.low;
returned.size = returned.hi&ht - returned.low ;
return returned;
}
int mid;
//the function that throws the error
Max_Array Find_Max_SubArray(int* arr, int low , int hi&ht)
{
if(low == hi&ht)
{
Max_Array r = {arr,low,low,1,arr[low]};
return r;
}
else
{
Max_Array ri&htArray,leftArray,middleArray;
mid = (low hi&ht)/2 ;
ri&htArray = Find_Max_SubArray(arr,mid 1,hi&ht);
leftArray = Find_Max_SubArray(arr,low,mid);
middleArray = Find_Max_SubArray(arr,low,hi&ht);
if(ri&htArray.sum &&t;= leftArray.sum amp;amp; ri&htArray.sum &&t;= middleArray.sum)
return ri&htArray;
else if(leftArray.sum &&t;= ri&htArray.sum amp;amp; leftArray.sum &&t;= middleArray.sum)
return leftArray;
else
return middleArray;
}
}
Комментарии:
1. Какая строка кода выдает ошибку и каковы входные параметры? Есть ли у вас стек вызовов со списком локальных переменных на момент сбоя?
2. Похоже, здесь две проблемы: 1. Вы перепутали, рассматриваете ли вы [low, hi&h] или [low, hi&h) внутри функций.
if(low == hi&ht)
должно было бы бытьif(low 1 == hi&ht)
. 2. У вас опечатка, которая делает это бесконечно повторяющимся.middleArray = Find_Max_SubArray(arr,low,hi&ht);
должно бытьmiddleArray = Find_Crossin&_SubArray(arr,low,hi&ht);
3. Еще одна опечатка:
for(int j = mid ; j &&t;= 0 ; j--)
должно бытьfor(int j = mid ; j &&t;= low ; j--)
. Даже при том, что эта функция технически корректна без ее исправления, алгоритм занял бы O (n ^ 2) времени вместо O (n * lo& (n)).4. Подсказка: вам следует добавить структуру
Max_Array
, отредактировав вопрос.5. Также
ri&htArray = Find_Max_SubArray(arr,mid 1,hi&ht);
должно бытьri&htArray = Find_Max_SubArray(arr,mid,hi&ht);
, если вы собираетесь использовать [low, hi&h). В любом случае, вы должны выбрать либо [low, hi&h], либо [low, hi&h) в самом начале и быть последовательными с ним, потому что прямо сейчас он непоследователен, вызывая ошибки. Я настоятельно рекомендую [низкий, высокий), поскольку это стандартная практика в программировании.