Wie partitioniert man ein Array in 2 Teile wie zdass die zwei Teile gleich durchschnittlich sind? Jede Partition kann Elemente enthalten, die im Array nicht zusammenhängend sind. Der einzige Algorithmus, an den ich denken kann, ist exponentiell, können wir es besser machen?
Antworten:
13 für die Antwort № 1Sie können dieses Problem auf die reduzieren Sum-Subset-Problem - ebenfalls hier gecached. Hier ist die Idee.
Lassen A
sei das Array. Berechnen S = A[0] + ... + A[N-1]
, woher N
ist die Länge von A
. Zum k
von 1
zu N-1
, Lassen T_k = S * k / N
. Ob T_k
ist eine ganze Zahl, dann finden Sie eine Untermenge von A
von der Größe k
das summiert sich zu T_k
. Wenn du das kannst, dann bist du fertig. Wenn du das nicht machen kannst k
, dann existiert keine solche Partitionierung.
Hier ist die Mathematik hinter diesem Ansatz. Angenommen, es gibt eine Partitionierung von A
so dass die zwei Teile den gleichen Durchschnitt haben, sagt X
von der Größe x
und Y
von der Größe y
sind die Partitionen, wo x+y = N
. Dann musst du haben
sum(X)/x = sum(Y)/y = (sum(A)-sum(X)) / (N-x)
also ein bisschen Algebra gibt
sum(X) = sum(A) * x / N
Da das Array Integer enthält, ist die linke Seite eine Ganzzahl, also muss auch die rechte Seite sein. Dies motiviert die Einschränkung, dass T_k = S * k / N
muss eine ganze Zahl sein. Der einzige verbleibende Teil ist zu realisieren T_k
als die Summe einer Teilmenge der Größe k
.