質問
リストの要素を並べ替えるにはどうすればよいですか a 彼らが別の(スーパーセット)リストの注文に従うように b?複製がないと仮定します。
例えば a 8 2 5 1]を含む可能性があります b 5 6 9 8 7 4 1 2 3]が含まれている可能性があるので、整理したい a 5 8 1 2]になる
これを効率的に行う方法に興味があり、ランタイムの複雑さが良好です。
解決
もしも b のスーパーセットです a, 、私はただダンプします a ハッシュテーブル、スキャンに b そして、すべての要素を挿入する新しいリストを作成します b ハッシュテーブルに含まれています。 O(a)余分なメモリとO(b)ランタイムを使用します。
他のヒント
ここにいくつかのアイデアがあります:
(与えられた時間の複雑さでは、 n のサイズです a と m のサイズです b. 。時間の複雑さは単純化されていません。)
- 各要素に対して b, 、線形検索を行います a その要素がその中に存在するかどうかを確認します。もしそうなら、最初の要素と交換してください a それはまだ所定の位置に置かれていません。 時間の複雑さ:o(nm)
- 上記と同じですが、最初にの内容を置きます a 線形検索を回避するための効率的なルックアップ構造に。 時間の複雑さ:O(1)ルックアップを仮定するO(n + m)
- 選別 b. 。次に、各要素に対して a, 、そのインデックス(存在することが保証されている)を見つけます b バイナリ検索の使用。このインデックスを同じサイズの補助配列に記録します a. 。その一連のインデックスを、ソートするコンパレータへの入力として使用します a. 時間の複雑さ:o((m log m) +(n log n) +(n log n))
所属していません StackOverflow