Это проблема с Введение в алгоритмы конечно:сумма делится на п
У вас есть массив с п случайных положительных целых чисел (массив не нужно сортировать или элементы уникальны) , Предложите O (n) алгоритм найти самую большую сумму элементов, которая делится на n.
Это относительно легко найти его в O (N 2 ) с использованием динамического программирования и хранения наибольшую сумму с остатком 0, 1, 2, ..., п - 1. Это код JavaScript :
function sum_mod_n(a)
{
var n = a.length;
var b = new Array(n);
b.fill(-1);
for (var i = 0; i < n; i++)
{
var u = a[i] % n;
var c = b.slice();
for (var j = 0; j < n; j++) if (b[j] > -1)
{
var v = (u + j) % n;
if (b[j] + a[i] > b[v]) c[v] = b[j] + a[i];
}
if (c[u] == -1) c[u] = a[i];
b = c;
}
return b[0];
}
Это также легко найти его в O (N) для смежных элементов, хранение частичных сумм MOD п. Другой пример:
function cont_mod_n(a)
{
var n = a.length;
var b = new Array(n);
b.fill(-1);
b[0] = 0;
var m = 0, s = 0;
for (var i = 0; i < n; i++)
{
s += a[i];
var u = s % n;
if (b[u] == -1) b[u] = s;
else if (s - b[u] > m) m = s - b[u];
}
return m;
}
Но как насчет O (п) в общем случае? Любые предложения будут оценены! Я считаю, что это имеет дело с линейной алгеброй, но я не уверен, что именно.
EDIT: Может ли это быть сделано в O (n log n)?
можно описать O (N^2) алгоритм? – miracle173
Любые свойства массива? Являются ли значения уникальными? Это отсортировано? – Peter
добавить ссылку на это * Введение в курс алгоритмов * –