ゴール
可能な限り最小限のデータを使用して、静的リストをある順序から別の順序に並べ替える方法を説明するデータをエンコードする方法は?
助けになるアルゴリズムやコンピュータ サイエンスの用語があると感じていますが、今のところ、この問題に固執しすぎて、それを他の方法で見ることができません。
背景の動機
私は、すべての通信が断続的な信じられないほど高価な衛星接続を介して行われる遠隔地に展開されるプログラムを持っています。少し誇張されていますが、データ コストは 1 キロバイトあたり 1 ドルに近く、1 日に数回しか発生しません。
一日の始まりに、ユーザーはアイテムのリストを与えられ、フィールドに出て何かをしますが、最終結果は多かれ少なかれ同じアイテムのリストが異なる順序でソートされます。他にもデータはありますが、この問題にとって重要ではありません。
現在、発生したすべての動きの記録を送り返し、それらを順番に再生しています。ユーザーがシステムに慣れてくると、ムーブ レコードのリストは、すべてのアイテム自体を送り返すだけのサイズに近づき始めており、多くの場合、いくつかのムーブの組み合わせによって前のムーブが元に戻されます。
仮定
- 開始リストと終了リストは、まったく同じアイテムのセットで構成されています
- 各アイテムには一意の ID (32 ビット整数) があります
- 各項目には固有のソート順 (32 ビット整数) があります。
- ユーザーは、数百から千以上のアイテムのリストを持っています
- 通常、ユーザーは 1 日に約 100 個のアイテムを再注文します。
- リスト内の新しい位置にアイテムを移動すると、順序の変更を検出できます
- 一部の「移動」は前の移動を元に戻す場合があります
- 最適解を求めるための計算リソースは安価/無制限
- 転送時間は高価です
- リスト全体を送り返すよりも、変更データを送り返す方がコストがかからない
最も単純なデータ構造
この問題を解決するために、次のデータ構造が利用可能であると仮定します。
- ListItem
- item_id
- sort_order
- MoveRecord
- item_a_id
- new_a_position
リストの例を次に示します。各リストの項目は同じです。変更されたアイテムはほんのわずかですが、すべてのアイテム ID に新しい並べ替え順序があるため、新しい item_id/sort_order_id ペアを送り返すことはできません。
**List 1: Original List** **List 2: Re-ordered List**
order - id order - id
1. 10 1. 90
2. 20 2. 30
3. 30 3. 40
4. 40 4. 50
5. 50 5. 60
6. 60 6. 10
7. 70 7. 80
8. 80 8. 70
9. 90 9. 20
可能な限り最小限のデータ量を使用して、リスト 1 の順序をリスト 2 の順序に変換するために必要な変更をエンコードするにはどうすればよいですか?
好奇心として、最適な解決策があることを証明することは可能ですか?
アップデート
同僚は、「スワップ」は正しい考え方ではないかもしれないと指摘しました。リストの一番上または一番下にアイテムを送信することもできます。これは、交換というより移動です。スワップは、2 つの移動の組み合わせになります。
ポインタをありがとう。これまでのところ、保証された最適なソリューションは見当たりません。さらに、問題が少し変わっただけです。
1 つの方法で最良の結果が得られることを証明できない場合は、すべての方法を使用して解決策を見つけ、使用した方法を示す小さなヘッダーを付けてその解決策を返信します。ただし、解決策を提案し続けてください。この質問を私の調査で更新します。
みんな、ありがとう!