서브 세트에없는 슈퍼 세트에서 항목을 찾는 방법
문제
LINQ 덕분에 컬렉션을 반대하지 않기 위해 "NOT"이 있다는 것을 알고 있지만 Big OH Performance에 대해 걱정하고 있습니다.
해결책
항목의 하위 집합을 제거하는 유일한 방법 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
확장 방법 :
두 시퀀스의 세트 차이를 생성합니다.
다른 팁
순서대로 세트를 반복 할 수 있다면, "일반적으로 O (n)가 아닌 최악의 경우 O (n²)가 아닌 O (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