最小の移動数で数字を照合するアルゴリズム


11

これは編集距離の質問の一種で、とても簡単です。私はこの問題についてはかなり頭がおかしくて、今のところそれを理解することはできません。


一連の数値が与えられた場合、例えば

[3, 1, 1, 1]

「ムーブ」の数を最小限に抑えて、すべての数値を同じ数値に最も効率的に変換するにはどうすればよいでしょうか。「移動」とは、数値から1を追加または削除することを意味します。

上記の例では、最も効率的な移動は次のとおりです。

[1, 1, 1, 1]

これには2回の移動が必要で、最初の数を2回減らします。

数百の数のはるかに大きな配列を考えると、これを見つけるための最良の方法を見つけることができません。

私は最初に丸められた平均数(長さで割ったすべての合計)を計算してから、計算された平均に減らしましたが、上記の例はこれを壊し、2の代わりに4手を必要としました。

私は理解できると思います:

  1. 平均、
  2. モード、
  3. 中央値

そして、それぞれの編集距離を取得し、最小距離を選択します。ただし、これがすべてのインスタンスで正しいかどうかはわかりません。どうやって知ることが出来ますか?


ドメインが限られている場合は、最小から最大まですべての可能性を試すことができます。そうでない場合は、モードまたは中央値を使用してみてください。
Bartosz Przybylski 2014年

@Bartekに感謝します。数百または数千の数値を処理する場合、すべての可能性を試すのは非常に効率が悪いようです。モード/中央値を確認します。しかし、これらはすべての場合に結果を生み出すことは確かですか?それが私の主な質問です。特定の効率的なアルゴリズムを探しています。
2014年

数値は一連の数値に含まれている必要がありますか、それとも任意の整数にすることができますか?
TCSGrad 2014年

@TCSGradこれは任意の整数にすることができますが、明らかに最小値と最大値の間にあるものを選びたいでしょう。この場合、1、2、または3のいずれか
d'three

回答:


10

答えは中央値を取ることです。中央値の特性の1つは、各要素までのL1距離最小にすることです。(ウィキペディアの記事を理解するために、確率分布を元の一連の数値の一様分布と見なしてください)。

これは問題を解決するアルゴリズムです(元々は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

ええ、それはそれをしました。おかしいです。中央値がそうするようには見えませんが、ちょっと。どうもありがとう。
dthree 2014年

1
証明については私の答えを参照してください。
Yuval Filmus

@ dc2:「試してみる」ことはできません。
ラファエル

1
注意してください:O(n)時間の中央値を計算できます
Bartosz Przybylski

1
@Raphael OPを参照せずに、OPのコードを他の回答に含めても大丈夫ですか?
thefourtheye 2014年

10

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,,xnmδ(m+1)δ(m)0ximin(δ(x1),,δ(xn))

さらに、すべてのが別個であり、が奇数であるとします。してみましょう中央値も。次に、一方で、なので、は一意の最適値です。もしであっても、同様の計算を示し、我々は中央値を結ぶ区間内の任意のポイントを選択することができるということです。同様ですがより複雑な推論は、が区別されない場合でも中央値が最適であることを示しています。したがって、実際にはすべてのを計算する必要はありません。、N 、M 、X 、I δ M + 1 - δ M = 1 δ M - δ M - 1 = - 1 、M nはX I δ X Ixinmxiδ(m+1)δ(m)=1δ(m)δ(m1)=1mnxiδxi


あなたはそれを逃したかもしれませんが、この答えは(ほぼ)中央値が最適な選択であること証明します。
Yuval Filmus、2014年

1
あなたの答えは素晴らしく、私はそれを支持しました。残念ながら、私は科学的記法にあまり精通していないため、あまりにも優秀すぎて、ほとんどが文字化けしてしまいました。それはあなたの問題ではなく、私の問題です。
dthree 2014年

5

問題はLP問題として定式化できます。

数値のセット、次のLPを解きます:n[a1,a2...an]

min|aix|

(Raphaelが指摘したように必要ではなかった制約を削除)x

LPが解決されると、解に対応する値が得られます。場合 整数である、あなたが行われている-それ以外の、最も近い整数にそれラウンド。xx

編集:コメントで指摘されているように、目的関数は絶対差を合計する必要があります。それを標準LPに変換するために、LPを次のように書き直すことができます。

minai

対象:

A IA I - X I A X "0 I

aiaix i
aiaix i
ai,x0 i

最適解では、、そして解からの値を取得できます。Xai=|aix| ix


したがって、これを正しく理解している場合、私の例では、xは1〜3になるため、編集距離は1、2、3であり、その上で最小化を行いますか?
2014年

@ dc2:これにより、各数値と間の距離の合計が最小になります。ここで、は収束する数値です。制約により、LPは迅速に終了し、すべての整数を検索するわけではありません。xxx
TCSGrad 2014年

なぜ制約が必要なのですか?
ラファエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.