/ / Wie partitionieren Sie ein Array in 2 Teile, so dass die beiden Teile gleichen Durchschnitt haben? - Arrays, Algorithmus, Datenstrukturen

Wie teilt man ein Array in 2 Teile auf, so dass die beiden Teile den gleichen Durchschnitt haben? - Arrays, Algorithmus, Datenstrukturen

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 № 1

Sie 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.