Алгоритм Кадане
В этом рассказе мы узнаем, как найти максимальную сумму подмассива с помощью алгоритма Кадана. Прежде всего, что такое подмассив?
Подмассив - это непрерывная часть массива. Или массив, находящийся внутри родительского массива. «Сумма подмассива» - это сумма всех элементов подмассива.
Массив длины N будет иметь N * (N + 1) / 2 непустых подмассивов.
Например, предположим, что у нас есть массив [1, 2, -3, 4]. Возможные подмассивы:
[], [1], [2], [-3], [4], [1, 2], [2, - 3], [-3, 4], [1, 2, -3], [2, -3, 4] и [1, 2, -3, 4]
Эти подмассивы будут иметь соответствующие подмассивы,
0, 1, 2, -3, 4, 3, -1, 1, 0, 3, 4
Подмассив с максимальной суммой будет называться Подмассив максимальной суммы.
Обозначим подмассив, содержащий элементы A [i], A [i + 1] …… A [j-1], через A [i, j).
Имея все предпосылки, давайте теперь обсудим алгоритм Кадана, чтобы найти максимальную сумму, которую может иметь подмассив.
Понимание алгоритма Кадане
Рассмотрим массив A длины n. Теперь рассмотрим функцию M (i), которая возвращает максимальную сумму подмассивов среди всех подмассивов, заканчивающихся индексом i, т. Е. A [0, i) , A [1, i), A [i-1, i) или A [i, i) и т. д. Следует отметить, что A [i, i) не будет содержать никаких элементов и, следовательно, это будет пустой подмассив [].
Поскольку все подмассивы A должны заканчиваться на одном из индексов, 0, 1, 2… ..n массива A. Следовательно, максимальная сумма подмассива будет max {M (0), M (1), M (2) …… .M (n)}. Необходимо отметить, что,
подмассивы, заканчивающиеся индексом «i», либо пусты, либо обязательно содержат «A [i-1]».
Получив полную информацию о функции M (i), выведем важное соотношение. Мы знаем,
- Подмассивы, заканчивающиеся индексом i: A [0, i), A [1, i), A [2, i) ……… A [i, i) .
- M (i) = max {сумма {A [0, i)}, сумма {A [1, i)}, сумма {A [2, i)} …… сумма {A [i-1, i )}, сумма {A [i, i)}}
- Или мы можем сказать:
M (i) = max {max {sum {A [0, i)}, sum {A [1, i)}, …… .sum {A [i- 2, i)} сумма {A [i-1, i)}}, сумма {(A [i, i))}} - Обратите внимание,
сумма {A [0, i)} = сумма {A [0, i-1)} + A [i-1]
сумма {A [1, i)} = сумма. {A [1, i-1)} + A [i-1]
.
.
.
sum {A [i-1, i)} = sum { A [i-1, i-1)} + A [i-1] - Следовательно,
max {sum {A [0, i)}, sum {A [1, i)}, …… .sum {A [i -1, i)}} =
max {sum {A [0, i-1)}, sum {A [1, i -1)} ……… сумма {A [i-1, i-1)}} + A [i-1] - Используя шаги 2 и 5,
max {sum {A [0, i)}, sum {A [1, i)}, …… .sum {A [i-1, i)}} = M ( i-1) + A [i-1] - Подставляя шаг 6 в шаг 3, M (i) = max {M (i-1) + A [i-1], 0}
Слишком много математики? Просто помни это,
M (0) = 0 и M (i) = max {M (i-1) + A [i-1], 0} для 0 ‹i ≤ N.
Имея все M (i), нам просто нужно вычислить их макс. Давайте напишем код, чтобы найти максимальную сумму подмассива, используя алгоритм Кадана.
- Создайте две целочисленные переменные: M_i и ans.
- Так как M (0) = 0, инициализировать M_i с 0.
поскольку минимально возможное значение M (i) равно 0, инициализировать ans с 0. - Напишите цикл for для i в диапазоне от 1 до N.
- Внутри цикла for напишите
найдите новый M_i как max (M_i + A [i-1], 0)
if M_i ›ans, ans = M_i ; // находит максимум из всех M (i) - Конечное значение ans будет максимальной суммой подмассива для данного массива A.