[英]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->19
即1 + 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.