【发布时间】:2015-08-23 19:17:51
【问题描述】:
给定一个数字列表 L = { a1, a2, a3, a4, ... , aN}
问题是将这个 L 分成两部分,不只是一次,而是递归地,直到它变成原子的。主要思想类似于this post,但添加了递归。
(添加: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) 的动态编程来解决这个问题。但是,这个解决方案对我来说似乎太慢了。有人有更好的解决方案吗?
也欢迎优化和近似。
提前谢谢你。
【问题讨论】:
-
检查我的答案,我更新了它以使其适合您的问题实例。
-
@AshkanKzme 我确实检查了它,但我发现它没有达到我的目的,因为我想最小化相似函数的总和(如上所述)..您提出的解决方案将针对每个节点进行优化,但不是针对整个树..顺便说一句。非常感谢您的快速回复
-
@AshkanKzme 你删除了你的答案吗?还是我又做错了什么?当我刷新并没有发现任何东西时,我感到震惊..
-
我删除了答案,因为它没有为您的问题提供正确的解决方案。而且我有点认为你不能得到更好的 O(2^N) 运行时间与你的权重约束,这使得问题非常难以解决!
-
绝对有必要递归吗?我相信有很多方法可以在 O(n) 时间内获得您想要的结果,而无需使用递归
标签: algorithm binary-tree dynamic-programming approximation partition-problem