この問題に何か新しいことを貢献できることを願っています。すべての答えが、全体的な洗濯性能を低下させることなく前処理を実行できる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スタックとして機能するビン、制限された通常の洗濯機、そして制限された通常の物干し-しかしこれはまだ非常に多くの靴下で機能します。
並列処理について:両方の靴下を同じビンに入れる限り、これらのすべての手順を簡単に並列化できます。