サブセットにないスーパーセットでアイテムを見つける方法

StackOverflow https://stackoverflow.com/questions/1911646

  •  19-09-2019
  •  | 
  •  

質問

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)時間がかかります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top