想象一个列表[e1, e2, ..., en]
和一个函数f(e1, e2) -> number
,它在固定时间内返回任意两个元素之间的距离。
f(e, e) = 0
e1 != e2 => f(e1, e2) > 0
f(e1, e2) <= f(e1, e3) + f(e3, e2)
目标是对列表进行置换,以便元素的成对距离之和最大。
我想出了一个O(n^2)
贪心算法,似乎是这样做的:
请告诉我它是否不正确。 你能提出/建议更快的算法或实质性(非复杂性)加速吗?解决这个问题的最小复杂性是什么?
此问题类似于在严格正加权完整图中找到最长路径,除了您知道距离函数的特征这一事实外,它还与最小跨度有一些相似之处树(这可能比我目前意识到的还要多吗?)。
(可能这个问题相当于一些已知的问题,我有兴趣知道哪个问题)
答案 0 :(得分:1)
您的最佳排列会产生一条路径,其中每个节点都连接到您的置换列表中的下一个节点。因此,您正在寻找最长的简单路径,即使对于您描述的度量空间也是NP难度的。 (参见最长路径问题的维基百科)。你贪婪的解决方案有一个问题,如果你选择两个距离最远的元素,那么如果有两个相同的元素投射到连接两个原始选定元素的线段的中点,那么最佳解决方案是这四个点实际上是创建一条从第一个端点到一个中心点到另一个端点到另一个中心点的链,而不是最初连接最远的顶点(这会导致然后连接到一个中心点,并且然后连接到距离0处的另一个中心点,通过三角形不等式创建一条较短的路径。