サブセットにないスーパーセットでアイテムを見つける方法
質問
Ienumerableのおかげで「Not」があります。これは、コレクションを反対するためにコレクションを取りますが、これを行うための最速のアルゴリズムは何ですか?
解決
アイテムのサブセットをから削除する唯一の方法 IEnumerable<T>
スーパーセットをループし、サブセットを介してスーパーセットループ内の各アイテムについて、サブセットにある場合はスーパーセットからそのアイテムを削除します。
これはあなたに与えます O(n²) 平均して。
これらのコレクションに関する追加情報がある場合(おそらく一方または両方がリストであるか、おそらく一方または両方がソートされています)、よりパフォーマンスのあるソリューションを作成するのに役立ちます。
興味がある場合は、ここに私が説明したことを行う拡張方法があります。
public static IEnumerable<T> Exclude<T>
(this IEnumerable<T> source, IEnumerable<T> items)
{
foreach (T t in source)
if (!items.Contains(t))
yield return t;
}
気にしないで、使用してください Enumerable.Except
拡張方法:
2つのシーケンスの設定された違いを生成します。
他のヒント
セットを順番に反復させることができる場合、o(n)の動作を保証できます(「通常はo(n)が最悪の場合はn²)ではなく、ハッシュセットが持っていることがあります)。ロックステップ。
例えば:
//loop boilerplate
if(itemA < itemB) {
itemA = a.next();
continue;
}
if(itemA > itemB) {
itemB = b.next();
continue;
}
a.remove(itemA);
境界チェックと他のボイラープレートを自分で追加する必要があります。
スーパーセットをハッシュテーブルに変換することにより、より良いパフォーマンスを得ることができます(通常はO(n)が、一定の時間でルックアップを実行できるようにします)。次に、サブセットを列挙して、各アイテムがスーパーセットに存在するかどうかを確認できます。操作全体には、O(n)余分なメモリとO(n)時間がかかります。
所属していません StackOverflow