用最少的移动次数匹配数字的算法


11

这是一种编辑距离问题,非常简单。我只是在这个问题上脑子死了,到目前为止还不能弄清楚。


给定一系列数字,例如

[3, 1, 1, 1]

如何以最少的“移动”数将所有数字最有效地转换为相同的数字?“移动”是指从数字中添加或删除一个。

在上面的示例中,最有效的举动是:

[1, 1, 1, 1]

这将需要2步,将第一个数字减少两次。

给定大得多的数百个数字数组,我无法找出找到此结果的最佳方法。

我最初尝试计算四舍五入的平均值(所有值的总和除以长度),然后将其减小为计算的平均值,但是上面的示例破坏了这一点,需要4步而不是2步。

我想我可以算:

  1. 平均
  2. 模式,
  3. 中位数

并获得它们各自的编辑距离,并选择最小距离。但是,我不确定在每个实例中这是否正确。我怎么知道?


如果域有限,则可以尝试从最小到最大的所有可能性。否则,您可以尝试使用众数或中位数。
Bartosz Przybylski 2014年

谢谢@Bartek。如果处理成百上千的数字,似乎尝试所有可能的方法将效率极低。我将检查模式/中位数。但是这些确定是否可以在每种情况下产生结果?这是我的主要问题。我正在寻找一种有效的算法。
2014年

该数字是否必须在数字集中,或者可以是任何整数?
TCSGrad 2014年

@TCSGrad可以是任何整数,但是显然您想选择一个介于最小值和最大值之间的整数。在这种情况下,无论是1,2或3
dthree

Answers:


10

答案是取中位数。中位数的特性之一是,它使与每个元素的L1距离最小。(要理解Wikipedia的文章,请将概率分布设为原始数字序列的均匀分布)。

这是解决问题的算法(最初由dc2编写):

function median(arr) {
  arr.sort(function(a, b) { return a - b; });
  var half = floor(arr.length/2);
  if ( arr.length % 2 ) {
    return arr[half];
  } else {
    return (arr[half-1] + arr[half]) / 2.0;
  }
}

function minl1(arr) {
  var moves = 0;
  var mdn = median(arr);
  for ( var i = 0; i < arr.length; ++i ) {
    moves += Math.abs(mdn - arr[i]);
  }
  return moves;
}

minl1([3, 1, 1, 1]); // -> 2

是的,做到了。真有趣。看起来中位数似乎无法做到,但嘿。非常感谢。
2014年

1
请参阅我的答案以获取证明。
Yuval Filmus 2014年

@ dc2:您无法通过“尝试”来“确保”。
拉斐尔

1
只是要注意的:你可以计算出平均O(n)的时间
巴尔托什Przybylski

1
@Raphael是否可以将OP的代码包含在其他答案中,而不引用OP?
thefourtheye 2014年

10

正如TCSGrad所提到的,给定整数的列表,您正在寻找最小 的整数 计算: 当从变为,量从变为。而且,它仅在点处切换值x1,,xnm

δ(m)=i=1n|mxi|.
δ(m+1)δ(m)
δ(m+1)δ(m)=i=1n{+1mxi1m<xi=#{i:mxi}#{i:m<xi}.
m+δ(m+1)δ(m)nnx1,,xn。不难检查的最优值是否是的最小点。这个最小点是,因此编辑距离是。mδ(m+1)δ(m)0ximin(δ(x1),,δ(xn))

进一步假设所有是唯一的,而是奇数。令为的中位数。那么而,因此是唯一的最优值。如果为偶数,则类似的计算表明我们可以选择连接中值的区间中的任意点。类似但更详尽的推理表明,即使不明显,任何中位数也是最佳的。因此,实际上无需在所有上计算。xinmxiδ(m+1)δ(m)=1δ(m)δ(m1)=1mnxiδxi


您可能已经错过了,但是这个答案(几乎)证明了中位数是最佳选择。
Yuval Filmus 2014年

1
您的回答很好,我赞成。对我来说不幸的是,它有点太出色了,因为我对科学记数法不那么精通,因此大部分都变得乱码。那是我的问题,不是你的问题。
2014年

5

该问题可以表述为LP问题:

给定一组数字,求解以下LP:n[a1,a2...an]

min|aix|

(删除了约束,正如Raphael所指出的那样,这是不必要的)x

LP解决后,您将获得与解决方案相对应的值。如果 是整数,则说明您已经完成-否则,将其舍入到最接近的整数。xx

编辑:如评论中指出,目标函数应为绝对差之和。为了将其转换回标准LP,我们可以将LP重写为:

minai

受:

一个' 一个 - X 一个' X '0

aiaix i
aiaix i
ai,x0 i

在最佳解决方案中,,我们可以从解中得到的值。Xai=|aix| ix


因此,如果我正确理解这一点,在我的示例中,x将为1-3,因此我将找到1、2和3的编辑距离,然后对此进行最小化?
2014年

@ dc2:这将最小化每个数字与之间的距离之和,其中是会聚数。约束条件确保LP快速终止,并且不会搜索所有整数!Xxx
TCSGrad 2014年

为什么需要约束?
拉斐尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.