문제

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) 시간이 걸립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top