Arrays 排序数组中的最小代价路径

Arrays 排序数组中的最小代价路径,arrays,algorithm,traveling-salesman,Arrays,Algorithm,Traveling Salesman,给定排序数组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 &l

给定排序数组
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]
i=start;
While(数组不是空的)
ldiff=A[i]-A[i-1]
rdiff=A[i+1]-A[i]
(ldiff

这种解决方案并非在所有情况下都有效。我已经意识到这是TSP问题。解决这个问题的最佳方法是什么?我应该使用像赫里斯托菲德这样的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

一种低效的方法是使用递归,因为在每一步中,有两种可能性(去左边或右边最近的邻居)~2^N种可能性。@AbhishekBansal是的,这是我试图实现的,但效率非常低。我想知道是否可以用一些好的方法来解决这个问题。为什么成本为-6的解决方案10->19->11->9->4不是最低成本(或者比示例解决方案更好)?@chill假设成本为正。编辑文章。
10->11->9->4->19
中的第三个术语不应该是
1+2+5
?另外,你的第二部分是一个完全不同的问题,可能最好为此发布一个新问题。这种方法应该有效,因为这是TSP的一个特例,所有城市都在一条直线上。我想这在我的情况下应该有效。然而,它却让我的思绪变得更加嘈杂。谢谢。我接受这个,因为它回答了我问题的第一部分。谢谢