문제

상 대 LINQ 하기 좋아하는 공급자는 여기]이 질문에 대한 검색 필터링에서 메모리 컬렉션이 있습니다.

알 LINQ(또는 찾/필터링 확장 방법)에서 작동을 구현하는 객체 IEnumerableIEnumerable<T>.질문입니다: 의 특성 때문에 열거하는 모든 질의 복잡성에서 최소 O(n)?

예를 들어:

var result = list.FirstOrDefault(o => o.something > n);

이 경우에,각 알고리즘상 걸릴 것입니다 O(n)list 주문한 대하여 'something', 는 경우에는 검색을해야 O(로그(n)):그것이 있어야 이진 검색합니다.까지,남녀노소 누구나 좋아합니다 제대로 이해하고,이 쿼리를 통해 해결될 열거형,그래서 그것을 취해야 한다 O(n), 도 list 이전에 주문했다.

  • 내가 할 수 있는 해결에서 쿼리 O(로그(n))?
  • 고 싶은 경우에는 성능이 사용해야 합니까 배열입니다.종류와 배열입니다.BinarySearch?
도움이 되었습니까?

해결책

도 parallelisation,그것은 여전히 O(n).일정한 요인이 다른 것입(에 따라 귀하의 코어의 개수)그러나 n 다양한 총 시간은 여전히 따라 선형적인.

물론 작성할 수 있습니다 당신의 자신의 구현의 다양한 LINQ 연산자를 통해 자신의 데이터 형식이지만,그들은 단지에 적합한 매우 특정 상황에 따라 달라질 수 있을 확실히 알고있는 조건자만 운영에 최적화된 측면의 데이터입니다.예를 들어,만약 당신이 가지고있는 사람들의 목록의 주문에 의해 나이를,그것은 당신을 도울 것으로 쿼리를 시도하는 사람을 찾으로 특히 이름:)

을 검사하는 조건자,당신이 사용하는 표현 대신 나무의 대리인,그리고 인생이 될 것이 많은 어렵습니다.

내가 의심되 나는 일반적으로 추가하는 새로운 방법을 만드는것은 분명 너를 사용하여 색인/주문/어떤 성격의 데이터 입력,그리고 항상 적절하게 작동.당신은 쉽지 않다는 호출 그분의 방법에서 쿼리를 표현의 과정,그러나 여전히 사용할 수 있습 LINQ 점 표기법으로.

다른 팁

예, Sklivvz가 말했듯이 일반적인 경우는 항상 O (n)입니다.

그러나, 많은 LINQ 방법은 ienumerable을 구현할 때에 대한 특별한 경우를위한 특별한 경우. (나는 이것을 ienumerable에 대해 보았습니다. 적어도 포함합니다.)

실제로 이것은 LINQ IENUMERABLE을 의미합니다.

IEnumerable<int> mySet = new HashSet<int>();

// calls the fast HashSet.Contains because HashSet implements ICollection.
if (mySet.Contains(10)) { /* code */ }

리플렉터를 사용하여 LINQ 메소드가 정의되는 방법을 정확히 확인할 수 있습니다. 이것이 제가이 점을 알아 냈습니다.

아, 그리고 LINQ에는 ienumerable.todictionary (맵 키) 및 ienumerable.tolookup (지도 키가 다중 값에 대한 맵)을 포함합니다. 이 사전/조회 테이블은 한 번만 만들어 여러 번 사용될 수 있으며, 이는 LINQ 집약적 코드 속도가 크기로 속도를 높일 수 있습니다.

그렇습니다. IEnumerable O (n)을 의미하는 방법을 사용하는 것입니다.

언어 디자이너가 일반성을 위해 성과를 거래하기로 결정한 고전적인 사례처럼 보입니다.

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