私はこの問題に新しい何かを貢献できることを望みます。洗濯の全体的なパフォーマンスを低下させることなく、前処理を実行できる点が2つあるという事実はすべての回答で無視されていることに気付きました。
また、大家族の場合でも、靴下を多数想定する必要はありません。靴下は引き出しから取り出されて着用され、洗濯される前にとどまる場所(おそらくビン)に投げられます。私は言ったビンをLIFOスタックとは呼ばないでしょうが、
- 両方の靴下を箱のほぼ同じ場所で投げます
- ビンはどの時点でもランダム化されないため、
- このビンの上部から取得したサブセットには、通常、ペアの靴下が両方含まれています。
私が知っているすべての洗濯機はサイズが限られているため(洗う必要のある靴下の数に関係なく)、実際のランダム化は洗濯機で行われます。靴下の数に関係なく、ほとんど含まれていない小さなサブセットがあります。シングルトン。
私たちの前処理の2つの段階は、「洗濯物を靴下に置く」と「洗濯物から靴下を取り出す」ことです。これは、清潔であるだけでなく乾燥した靴下を手に入れるために必要です。洗濯機と同じように、物干し用ロープは有限であり、靴下を置くライン全体が見えると思います。
put_socks_on_line()のアルゴリズムは次のとおりです。
while (socks left in basket) {
take_sock();
if (cluster of similar socks is present) {
Add sock to cluster (if possible, next to the matching pair)
} else {
Hang it somewhere on the line, this is now a new cluster of similar-looking socks.
Leave enough space around this sock to add other socks later on
}
}
ソックスを移動したり、最適なマッチを探したりするのに時間を無駄にしないでください。これはすべてO(n)で行う必要があります。これは、並べ替えずにラインに配置するだけでも必要です。靴下はまだペアになっておらず、ライン上にはいくつかの類似クラスターしかありません。靴下のセットが限られていると便利です。これは、「良い」クラスタを作成するのに役立ちます(たとえば、靴下のセットに黒い靴下しかない場合、色でクラスタリングするのは適切ではありません)。
take_socks_from_line()のアルゴリズムは次のとおりです。
while(socks left on line) {
take_next_sock();
if (matching pair visible on line or in basket) {
Take it as well, pair 'em and put 'em away
} else {
put the sock in the basket
}
残りのステップの速度を向上させるために、次の靴下を無作為に選ぶのではなく、各クラスターから靴下の後に順次靴下を取ることが賢明であることを指摘しておきます。どちらの前処理ステップでも、靴下をラインまたはバスケットに入れるだけで、何もしなくて済むので、洗濯のパフォーマンスが大幅に向上します。
この後、ハッシュ分割アルゴリズムを実行するのは簡単です。通常、ソックスの約75%は既にペアリングされており、ソックスの非常に小さなサブセットが残っています。このサブセットはすでに(ある程度)クラスター化されています(前処理ステップの後でバスケットにエントロピーをあまり導入していません)。もう1つは、残りのクラスターは一度に処理できるほど小さい傾向があるため、クラスター全体をバスケットから取り出すことができるということです。
sort_remaining_clusters()のアルゴリズムは次のとおりです。
while(clusters present in basket) {
Take out the cluster and spread it
Process it immediately
Leave remaining socks where they are
}
その後、靴下は残りわずかです。これは、以前にペアになっていない靴下をシステムに導入し、特別なアルゴリズムなしで残りの靴下を処理する場所です。残りの靴下は非常に少なく、視覚的に非常に高速に処理できます。
残りのすべての靴下について、私はそれらの対応するものがまだ洗っていないと想定し、次の反復のためにそれらを保管します。ペアになっていない靴下の増加を登録した場合(「靴下の漏れ」)、ビンを確認する必要があります-ランダム化される可能性があります(眠っている猫はいますか?)
これらのアルゴリズムには多くの仮定があることを知っています。ある種のLIFOスタックとして機能するビン、制限された通常の洗濯機、制限された通常の物干しロープ-これは依然として非常に多くの靴下で機能します。
並列処理について:両方の靴下を同じ箱に捨てる限り、これらすべての手順を簡単に並列化できます。