Jest to problem, z Wprowadzenie do algorytmów kurs:Suma podzielna przez n
Masz tablicę z n losowych liczb całkowitych dodatnich (tablica nie musi być sortowane lub elementy unikalne) . Zasugeruj, aby znaleźć największą sumę elementów, która jest podzielna przez n.
Jest to stosunkowo łatwe do znalezienia go w O (n) za pomocą programowania dynamicznego i przechowywania największej sumy z pozostałą 0, 1, 2, ..., n - 1. Jest to kod 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];
}
jest również łatwo znaleźć go w o (n) na przylegających do siebie elementów, przechowywanie sum częściowych mod n. Kolejna próba:
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;
}
Ale jak o O (n) w ogólnym przypadku? Wszelkie sugestie zostaną docenione! Uważam, że ma to coś wspólnego z algebrą liniową, ale nie jestem pewien co dokładnie.
EDYCJA: Czy można to w rzeczywistości wykonać w O (n log n)?
można opisać O (N^2) algorytm? – miracle173
Jakieś właściwości tablicy? Czy wartości są unikalne? Czy to jest sortowane? – Peter
dodaj link do tego * Wprowadzenie do algorytmów oczywiście * –