Дан список чисел L = {a1, a2, a3, a4, ..., aN}
Проблема состоит в том, чтобы разделить этот L на две части, не один раз, а рекурсивно, пока он не станет атомарным. Основная идея похожа на этот пост но добавив рекурсию.
(добавлено: 9 июня) Например, если у нас есть L = {10, 20, 1, 2} (отредактировано: 10 июня) решение может быть таким: сначала разделить его на {10, 1, 2} и {20}, затем разделить первое на {1, 2} и {10}, продолжить с {1, 2} до {1}, {2}. Теперь все члены L теперь атомарны и больше не могут быть разделены.
После разделения он должен выглядеть как какое-то бинарное дерево.
Скажем так..
(a1 a2 a3 a4)
/\
/ \
/ \
/ \
(a1 a2) (a3 a4)
/\ /\
/ \ / \
(a1)(a2)(a3)(a4)
В каждом узле функция подобия
abs( sum(left_child) - sum(right_child) ) / sum(itself)
Я хочу найти "оптимизированный" способ разделить список (создать дерево) в соответствии с "суммированием" этой функции. Обратите внимание, что на верхнем уровне это значение может иметь большее влияние, чем на нижнем , поэтому веса должны быть предоставлены.
weight(level) * abs( sum(left_child) - sum(right_child) ) / sum(itself)
пусть level — это уровень этого узла в бинарном дереве.
Я думаю, что это можно решить с помощью динамического программирования с временной сложностью O (2 ^ N). Однако это решение кажется мне слишком медленным. У кого-нибудь есть лучшие решения?
Приветствуются как оптимизация, так и аппроксимация.
Заранее спасибо.