Вот решение для динамического программирования, которое находит раздел, который минимизирует сумму квадратов ошибок в размерах частей.Итак, в вашем примере [1, 5, 5, 6, 7, 8, 8, 8, 8, 8] вам нужны части размера (2.5, 2.5, 2.5, 2.5), а результат, полученный этим кодом, равен (9,0 (1, 2, 2, 5)).Это означает, что выбранные разделы были размером 1, 2, 2 и 5, и общая ошибка составляет 9 = (2,5-1) ^ 2 + (2,5-2) ^ 2 + (2,5-2) ^ 2 + (2,5-5) ^ 2.
def partitions(a, i, sizes, cache):
"""Find a least-cost partition of a[i:].
The ideal sizes of the partitions are stored in the tuple 'sizes'
and cache is used to memoize previously calculated results.
"""
key = (i, sizes)
if key in cache: return cache[key]
if len(sizes) == 1:
segment = len(a) - i
result = (segment - sizes[0]) ** 2, (segment,)
cache[key] = result
return result
best_cost, best_partition = None, None
for j in xrange(len(a) - i + 1):
if 0 < j < len(a) - i and a[i + j - 1] == a[i + j]:
# Avoid breaking a run of one number.
continue
bc, bp = partitions(a, i + j, sizes[1:], cache)
c = (j - sizes[0]) ** 2 + bc
if best_cost is None or c < best_cost:
best_cost = c
best_partition = (j,) + bp
cache[key] = (best_cost, best_partition)
return cache[key]
ar = [1, 5, 5, 6, 7, 8, 8, 8, 8, 8]
sizes = (len(ar) * 0.25,) * 4
print partitions(ar, 0, (2.5, 2.5, 2.5, 2.5), {})