blog

たくさんの靴下があるが、最も高速で効率的なアルゴリズムで靴下を合わせるにはどうすればいいだろうか?

問題の説明\n\nコンピュータ科学者として、私は何をすべきか悩んでいました。すぐに思いついたのは、複雑さがOになるように大きさの色でソートすることでした。\nハッシュや他の「その場でない」方法は、靴下...

Jul 12, 2025 · 3 min. read
シェア

問題の説明

コンピュータサイエンティストとして、私は何をすべきか悩んでいました。私はすぐに、複雑さがO(NlogN)になるように、大きさの色でソートすることを考えました。

ハッシュやその他の "場違い "な方法は、ここでは好ましくありません。

そこで基本的な質問です:

対数レベルの余分なスペースを使って、それぞれの靴下が対になっている別の靴下を見つけるのに、最も速く最も効率的なアルゴリズムはどのようにすればよいでしょうか?

以下の点を考慮して回答していただければ幸いです:

  1. このアルゴリズムは、膨大な数の靴下に対しても同じように機能します。
  2. 現実的には、靴下はそれほど多くはないでしょう。私と配偶者を合わせても、30足以上は持っていませんから
  3. 質問は同等ですか?

***回答

上記のような並べ替えも考えられますが、ちょっともったいない。順番は必要なく、ただ「同じ」性質を持つものだけでいいのです;

そのため、ハッシュアルゴリズムは十分で高速です。

1.ヒープの別の見方は、ヒープは靴下のすべての色で形成されているということです。したがって、入力バスケットの中のすべての靴下を繰り返し処理し、色に応じてそれらを異なるバスケットに入れます。

2.上記の新しく形成されたバスケットを繰り返し、ソックスを形状などの他の特性に基づいて2つ目のバスケットに入れます。

3.すべての靴下がとても小さなカゴに入るまで、上記を再帰的に適用します。

この実装では、巨大なコレクションの追加や結合を行う際に、この再帰的ハッシュ分割法を使用します。これは入力を複数の集合に分割し、各集合は互いに独立です。この方法は、任意のデータ量とマルチコアCPUに対して線形複雑度を与えます。

各バスケット内の要素数が十分に小さく、簡単に処理できるような値が見つかれば、再帰なしで分割することができます。残念ながら、靴下にはそのような性質はないと思います。

それぞれの靴下に "PairID "が整数で設定されていれば、ハッシュアルゴリズムPairID%10に基づき、すべての靴下を10個のバスケットに入れることは簡単です。

実際に最も効果的な分け方は、長方形の箱の一辺を色に、もう一辺を形にすることだと思います。なぜ長方形の箱なのでしょうか?なぜなら、O(1)のコストでボックス内の要素にランダムアクセスできるからです。

回答更新

並列処理を考えたらどうでしょう?複数の人が集まって靴下のペアリングをした方が速いですか?

1.最も単純な並列戦略のひとつは、複数の作業員が靴下の入ったカゴをペアにして一緒に作業することです。これは、100人が10個の靴下の山を扱うと仮定すると、ほんの少ししかスピードアップしません。この方法では、複数人の間で同期をとるコストが効率とスピードを低下させます。これはデッドロックにつながるのでしょうか?いいえ、各ワーカーは一度に一つのバスケットにしかアクセスしないからです。デッドロックを防ぐために必要なロックは1つだけです。ライブロックが発行されるかどうかは、ワーカーがどのように協力してバスケットにアクセスするかによって決まります。物理的なレベルで、どれがメッシュに排他的にアクセスできるかを決めるために、そのようなバイナリ指数バックオフアルゴリズムを使うかもしれません。もしこれがNICでうまくいくなら、ワーカーでも同じようにうまくいくでしょう。

2.各作業員が自分のバスケットのコレクションを持てば、その規模は無限に近くなります。ワーカーは非常に大きなバスケットから靴下を取ることができ、すべての靴下をペアリングするときに同期するために互いに通信する必要はありません。***そして、各作業員が持っているすべてのバスケットを組み合わせます。すべてのワーカーが集約ツリーを形成できれば、この問題は複雑さO(logW*P)でできると思います。

要素の一意性はどうなるの?前述したように、要素の一意性はO(n)で解くことができます。ソックス問題も同様に、代入ステップが1つで済むならO(n)で処理できます。

すべてのアルゴリズムの中で最速のものがO(n)を超えることはできないので、***の下界に達することは明らかです。

出力は正確には等しくないかもしれませんが、漸近的な複雑さは確かに等しくなります。

Read next

最適なハイパーバイザーを選ぶための5つのステップ (2)

最初の2つのステップは、パート1「最適なものを選ぶための5つのステップ」で説明しましたので、残りの3つのステップに進んでください。

Jul 12, 2025 · 2 min read