【问题标题】:Shortest time for everyone to get to the destination每个人到达目的地的最短时间
【发布时间】:2021-10-02 01:40:18
【问题描述】:

我要设计一个算法来解决一个问题: 我们有两组人(A组和B组,A组的人数总是小于或等于B组的人数),都站在一维线上,每个人都有一个对应的数字指示其位置。当计时器开始时,A组的每个人都必须找到B组的伙伴,但B组的人根本不能移动,B组的每个人最多只能有1个伙伴。

假设 A 组的人移动 1 个单位/秒,如何找到 A 组每个人找到搭档的最短时间?

例如,如果位置为 {5,7,8} 的 A 组中有 3 人,位置 {2,3,4,9} 的 B 组中有 4 人,则最佳解决方案将是 3 秒,因为最大值(5-3,7-4,9-8)=3

我可以用蛮力来解决它,但是有没有更好的方法来解决这个问题?

【问题讨论】:

  • 我认为您的问题可能会简化为this,其中有一个已接受的O(n) 答案。

标签: algorithm shortest-path


【解决方案1】:

这个问题是edit distance problem 的一个特例,因此可以使用类似的动态规划解决方案来解决它。对于这种特殊情况,可能存在更快的解决方案。

A = [a_0, a_1...,a_(m-1)] 是我们m 移动人员的(排序)位置,B = [b_0, b_1...,b_(n-1)]n(排序)目的地点,m <= n。对于编辑距离类比,允许的操作是:

  1. A(免费)中插入一个数字,或者
  2. 用成本|a-a'| 替换A 中的元素a -> a'

我们可以在O(n*m) 时间内解决这个问题(如果需要,加上AB 的排序时间)。

我们可以通过成本函数C(i, j) 定义动态规划,这是仅使用第一个jb_0, ... b_(j-1) 移动第一个ia_0, ... a_(i-1) 的最小成本。你想要C(m,n)。定义C如下:

【讨论】:

  • 不能把这个问题简化为this,显然有O(n) 的解决方案(在那里回答)?
  • (显然我们保留了顺序,因为将 A 的元素相互交叉会不必要地增加成本。)
  • @גלעדברקן 我最初的反应是这个问题应该是可以简化的;从sum of squared distances 度量到max distance 度量在这里可能是一个问题,但我不知道度量的哪些属性被用来证明解决方案的正确性。不过,这是一个非常迷人且令人惊讶的解决方案,因此我需要一些时间来研究它以了解它的工作原理和原因。
  • 我不认为距离函数在那里有什么不同。在他们的代码中交换距离函数并针对具有鲁棒随机输入的 DP 进行测试也很容易。
  • @גלעדברקן 你是对的;大规模随机测试表明,他们的代码对我的动态编程解决方案产生了看似相同的答案。它也绝对看起来是O(n);也就是说,我仍然不知道它为什么会起作用,但是代码和算法写得很清楚。给定一些时间思考它应该不是不可能的。 btilly 还在几个地方给出了粗略的校样草图。
猜你喜欢
  • 1970-01-01
  • 2014-06-30
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多