1

この問題は、オブジェクトの配列 (順序付きセット) の同期で発生します。

具体的には、別のコンピューターに同期されたアイテムの配列を考えてみましょう。ユーザーは 1 つまたは複数のオブジェクトを移動して、配列を並べ替えます。プログラムが起動すると、新しい順序が表示され、古い順序がわかりました。変更を別のコンピューターに送信し、そこで新しい順序を再現する必要があります。次に例を示します。

index         0    1    2
old order     A    B    C
new order     C    A    B

移動を、特定のオブジェクトを特定の新しいインデックスに移動することとして定義します。問題は、通信リンクを介して最小数の移動を送信することによって並べ替えを表現することです。これにより、反対側は、移動されていないオブジェクトを古い順序で取得し、それらを新しい順序でまだ使用されていないインデックスに移動することにより、残りの移動を推測できます。最低のインデックスから始まり、上に向かっていきます。この転送方法は、少数のオブジェクトが大きな配列内で移動され、多数のオブジェクトが移動する場合に非常に効率的です。

ちょっとまって。例を続けましょう。我々は持っています

CANDIDATE 1
Move A to index 1
Move B to index 2
Infer moving C to index 0  (the only place it can go)

最初の 2 つの手を送信する必要があること注意してください。Move B をインデックス 2に送信しない場合、B はインデックス 0 に推論され、最終的に BAC になりますが、これは誤りです。2 つの手を送信する必要があります。もっとうまくやれるか見てみましょう…</p>

CANDIDATE 2
Move C to index 0
Infer moving A to index 1  (the first available index)
Infer moving B to index 2  (the next available index)

この場合、正しい答え CAB が得られ、Move C をインデックス 0 に1 つだけ送信します。したがって、候補 2 は候補 1 よりも優れています。さらに 4 つの候補がありますが、何かを行うには少なくとも 1 つの手が必要であることは明らかなので、ここでやめて、候補 2 が勝者であると宣言できます。

考えられるすべての候補を力ずくで試すことでこれを行うことができると思いますが、N個のアイテムの配列にはN個あります! (N factorial) 可能な候補であり、例のように不必要な検索を切り捨てるほど賢くても、何百ものオブジェクトを含む可能性のある典型的な配列では、依然としてかなりのコストがかかる可能性があります。

互換性のために、別のプログラムの送信をエミュレートする必要があるため、注文全体を送信するだけの解決策は受け入れられません。

誰かが答えを書き留めることができればそれは素晴らしいことですが、コンピュータ サイエンスの教科書 XXX の第 N 章を読むようにというアドバイスはまったく受け入れられます。私はただの電気技師なので、それらの本は知りません。

ありがとう!

ジェリー・クリノック

4

2 に答える 2

0

情報理論ベースのアプローチ

まず、0が「正順」に対応し、11が「不規則入」に対応するようなビット列を用意します。イレギュラーなエントリがあるたびに、次のエントリの元の場所も追加します。

例えば。次の場合に ABCDE の元の順序を仮定します。

ABDEC: 001 3 01 2

BCDEA: 1 1 0001 0

ここで、「移動」する確率が p の場合、この方法にはおおよそ n + n*p*log(n) ビットが必要です。

p が小さい場合、0 の数が多くなることに注意してください。結果をさらに圧縮して、次のことができます。

n*(p*log(1/p) + (1-p)*log(1/(1-p))) + n*p*log(n) ビット

于 2012-05-17T18:51:27.777 に答える
0

この問題は、 Longest common subsequence problemに還元できると思います。この共通部分列を見つけて、それに属さない動きを送信するだけです。最適性の証明はなく、私の直感だけなので、間違っている可能性があります。たとえ私が間違っていたとしても、それはより洗練されたアルゴリズムへの良い出発点になるかもしれません.

于 2012-05-17T07:31:30.527 に答える