给定一个数字列表 L = { a1, a2, a3, a4, ... , aN}
问题是将这个L分成两部分,不仅仅是一次,而是递归的,直到它变成原子的。主要思想就像这篇文章,但添加了递归的东西。
(添加:6 月 9 日) 例如,如果我们有 L = {10, 20, 1, 2} (编辑:6 月 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)
let level是该节点在二叉树中的级别。
我认为可以使用时间复杂度为 O(2^N) 的动态编程来解决这个问题。但是,这个解决方案对我来说似乎太慢了。有人有更好的解决方案吗?
也欢迎优化和近似。
先感谢您。