Извините, у меня есть задание решить проблему максимального подмассива с помощью Алгоритм грубой силы O (n ^ 2), Разделяй и властвуй O (nlogn) и Алгоритм Кадана O (n). (У меня другой код).
«Например, для последовательности значений
{−2, 1, −3, 4, −1, 2, 1, −5, 4}
непрерывный подмассив с наибольшей суммой равен[4, −1, 2, 1]
с суммой6
.» - со страницы Wiki.
Я закончил с Kadane's и BruteForce, где мой требуемый результат - это не просто найти сумму, но также начальный индекс найденного подмассива и конечный индекс.
Мой текущий DivideAndConquer
код дает мне правильную сумму. Однако я не вижу способа отслеживать свои индексы, поскольку я реализовал его рекурсивно (конечно). И я не знаю, единственный ли способ - использовать в этом случае глобальные переменные (я предпочитаю этого не делать). Вы можете помочь решить эту проблему? Или мне нужно будет менять весь дизайн?
#include <iostream>
int DivideAndConquer(int[], int);
int main()
{
// Example 1
//const int MyArraySize = 16;
//int MyArray[MyArraySize] = {13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7 }; // answer: Index 7 -> 10, sum = 43
// Example 2
const int MyArraySize = 8;
int MyArray[MyArraySize] = { -2, -5, 6, -2, -3, 1, 5, -6 }; // answer: Index 2 -> 6, sum = 7
int FinalResult;
FinalResult = DivideAndConquer(MyArray, MyArraySize);
std::cout << "Using Divide And Conquer: With O(nlogn) Sum = " << FinalResult << "\n\n";
system("pause");
return 0;
}
int DivideAndConquer(int* _myArray, int _myArraySize)
{
if (_myArraySize == 1)
return _myArray[0];
int middle = _myArraySize / 2;
int Result_LeftPortion = DivideAndConquer(_myArray, middle);
int Result_RightPortion = DivideAndConquer(_myArray + middle, _myArraySize - middle);
int LeftSum = -9999;
int RightSum = -9999;
int TotalSum = 0;
for (int i = middle; i < _myArraySize; i++)
{
TotalSum += _myArray[i];
RightSum = TotalSum < RightSum ? RightSum : TotalSum;
}
TotalSum = 0;
for (int i = middle - 1; i >= 0; i--)
{
TotalSum += _myArray[i];
LeftSum = TotalSum < LeftSum ? LeftSum : TotalSum;
}
int PartialResult = LeftSum < RightSum ? RightSum : LeftSum;
int Result= (PartialResult < LeftSum + RightSum ? LeftSum + RightSum : PartialResult);
return Result;
}
return Tuple<int, int*, int*>
или&
вполне нормально. Но я все еще не понимаю, как мне отслеживать индексы, поскольку я не делаю это итеративно ... - person Khalil Khalaf   schedule 06.09.2016return Tuple<..>
? - person Khalil Khalaf   schedule 06.09.2016return Tuple<>
(соответственноPair
). Поскольку вы вызываете рекурсивно, я думаю, что параметр по ссылке кажется более подходящим, чем возвращаемое значение. - person πάντα ῥεῖ   schedule 06.09.2016-2, -5, 6, -2, -3, 1, -5, -6
, он возвращает1
. - person Saeid   schedule 06.09.2016PartialResult
, а неResult
. Ваш пример дает мне4
, что является правильным[6, -2]
индексом2 to 3
(если я тестирую с использованием других алгоритмов). Я сейчас дома и работаю над этим - person Khalil Khalaf   schedule 06.09.20166
- person Saeid   schedule 06.09.2016i == j
и Один элемент считается подмассивом эээ .. Хороший улов @ sudomakeinstall2! - person Khalil Khalaf   schedule 06.09.2016