繁体   English   中英

排序数组中的最低成本路径

[英]Least cost path in a sorted array

给定排序的数组A例如{4,9,10,11,19} i->j移动的成本是abs(A[j]-A[i]) 从给定元素开始,例如10 找出最少的成本路径,而无需两次访问相同的元素。 因此,在该示例中,解决方案将是10->9->4->11->191 + 5 + 7 + 8 = 21

我试图用最近邻法来解决这个问题。

 i = start;
 While (array is not empty)
    ldiff = A[i] - A[i-1]
    rdiff = A[i+1] - A[i]
    (ldiff < rdiff) ? sum += ldiff : sum += rdiff
    remove A[i]

此解决方案并非在所有情况下都有效。 我意识到这是TSP问题。 什么是解决这个问题的最佳方法? 我应该使用像Christofides或其他算法的TSP启发式算法吗?

对于你的情况,最低成本是21,见

10->9->4->11->19 ==>  1 + 5 + 7 + 8 = 21.

我认为,对于一般情况,如果你从第i个位置开始,最低成本是路径,最小值

A[i]->A[i-1]-> ...->A[1] -> A[i+1] -> A[i+2] -> ...->A[n]  and

A[i]->A[i+1]-> ... ->A[n] ->A[i-1] ->A[i-2] -> ...->A[1]

处理较小或最大的元素,取决于哪个更接近(在值中,不是索引)到起始元素,然后简单地处理剩余元素到右边或左边(取决于我们是否处理了最小或最大元素)。

所以,从10开始给出4,9,10,11,19

10到最小元件4的距离是6,从10到最大元件19的距离是9,所以移动到4

然后按排序顺序处理剩余的元素 - 9, 11, 19

这给了我们10 -> 4 -> 9 -> 11 -> 19 ,其成本为6 + 5 + 2 + 8 = 21

这可以在O(n)

注意:

值得注意的是,只要我们首先向最近的一侧移动,然后向另一侧移动(无论我们处理哪个元素,只要我们不多次改变方向),我们将获得最佳结果。

这就是为什么10 -> 9 -> 4 -> 11 -> 19也给出21

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM