arrays - 排序数组中的最低成本累积路径

标签 arrays algorithm

这个问题是之前提出的问题的延伸:
Least cost path in a sorted array

给定一个排序数组 A 例如{4,9,10,11,19}。从 i->j 移动的成本是
abs(A[j] - A[i]) + cost_incurred_till_i。从给定的元素开始,例如10。无需两次访问同一元素即可找到成本最低的路径。

对于给定的数组:

10->9->4->11->19 cost: 1+(1+5)+(1+5+7)+(1+5+7+8) = 41
10->4->9->11->19 cost: 5+(5+5)+(5+5+2)+(5+5+2+8) = 47
10->9->11->4->19 cost: 1+(1+2)+(1+2+7)+(1+2+7+15) = 39 
10->11->9->4->19 cost: 1+(1+2)+(1+2+5)+(1+2+5+15) = 35 --one of optimal paths
10->11->19->9->4 cost: 1+(1+8)+(1+8+10)+(1+8+10+5) = 53
10->11->19->4->9 cost: 1+(1+8)+(1+8+15)+(1+8+15+5) = 63
...

我尝试使用最近邻方法解决这个问题。

 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 启发式算法还是其他一些算法?

最佳答案

你很接近,你可以稍微修改一下最近的邻居。当两个邻居相等时,检查元素过去 那个邻居,然后朝较近的那个相反方向移动(以避免尽可能多地回溯)。如果这些元素的距离相同,请继续向前看,直到它们不一样。如果您在看到差异之前到达了界外,请朝它走。

你的例子很好看:

我们唯一的分支点是决定从 10 开始的第一步是访问 9 还是 11。从两个方向看过去显示 4194 更接近 10,所以远离它(到 11)。


显然,对于没有很多连续均匀间隔元素的数组,这会更快。如果它们没有是均匀分布的,它会和你的一样,运行 n 步。

最坏的情况是您必须在每一步都一路查看两端,这将访问每个元素。因为我们为每个 n 元素运行一次,所以它的结果是 O(n^2)。一个示例是一个包含所有 均匀间隔元素的数组,从死点开始搜索。

关于arrays - 排序数组中的最低成本累积路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19858066/

相关文章:

string - 有效地计算可被k整除的数字字符串的子字符串的数量?

java - 加密安全 PRNG(伪随机数生成器)

algorithm - 如何并行背包问题?

java - 我正在尝试创建一种方法来计算两个数组中数字的平均值

ios - 试图从对象 [0] 中插入 nil 对象?

java - 从 Java 字符串中提取 Int 时出错

arrays - 用 DI 序列排列排列

c++ - 在另一个结构中初始化一个结构数组

c++ - 当分子和分母都具有受限范围时找到实数的有理近似

CS50学分任务回顾