Максимальная вариация подмассива

Мне нужно решить проблему, очень похожую на задачу о максимальном подмассиве. Мне нужно найти самый большой подмассив, среднее значение которого больше k. Я придумал следующий трюк. Я могу преобразовать свой массив A[] размера n в B[], где B[i] = A[i] - k. Итак, теперь среднее значение должно быть> 0. Но среднее больше нуля не означает просто сумму больше нуля? Так что я могу напрямую применить алгоритм Кадане. Я прав? (всегда при условии, что есть 1 положительное значение)


person Paramar    schedule 14.11.2012    source источник


Ответы (2)


нет, алгоритм Кадане все равно найдет подмассив с наибольшей суммой... мне нужно решить ту же проблему. до сих пор я обнаружил, что если мы создадим массив B, как вы упомянули выше, а затем создадим массив C, который содержит частичные суммы массива B, то максимальный интервал (i, j), который мы ищем, имеет тот же номер для я и j !!! Например:

массив A: 1 10 -1 -1 4 -1 7 2 8 1 ..... и данное k равно 5, тогда массив B: -4 5 -6 -6 -1 -6 2 -3 3 -4 массив C: -4 1 -5 -11 -12 -18 -16 -19 -16 -20, поэтому искомый подмассив имеет вид [7,2,8], имеет длину 3 и имеет одинаковые первый и последний элемент, который равен -16!!!!

редактировать: я забыл сказать, что мы ищем алгоритм O (n) или O (n * logn) .... @lets_solve_it вы правы, но ваш алгоритм O (n ^ 2), который слишком велик для данные, которые мы хотим обрабатывать. Я близок к тому, чтобы решить эту проблему с помощью карты функций в С++, которая представляет собой что-то вроде хеш-таблицы. Я думаю, это правильное направление, потому что здесь элементы массива C имеют прямую связь со своими индексами! Также наш профессор сказал нам, что другое возможное решение - снова создать массив C, а затем использовать (специальный?) Свод для быстрой сортировки... но я не совсем понимаю, что мы ожидаем от быстрой сортировки.

person panos7    schedule 20.11.2012

@panos7:

после того, как вы создали массив C (массив частичных сумм), вы ищете два значения C, Ci и Cj,

такое, что Cj>=Ci, и (j-i) является настолько «большим», насколько это возможно. (j-i) --> МАКС.

затем вернуть j-i.

в вашем примере -16>=-18, поэтому вы вернули j-i=9-6=3

какой правильный ответ!

person lets_solve_it    schedule 22.11.2012