C# 일반 HashSet < T> 검색 성능은 O (1)이어야하고 ObservableCollection < T>의 검색 성능은 O (n)이어야합니다.C# HashSet <T> 검색 성능 (ObservableCollection <T>과 비교)?
많은 양의 고유 한 요소가 있습니다. 각 요소에는 고유하지 않은 DateTime 속성이 있습니다.
각 요소는 단순히 DateTime.GetHashCode()를 반환하여 HashCode를 계산합니다.
이제 내 데이터의 하위 집합을 가져오고 싶습니다. 나는 300.000 요소의 컬렉션이 LINQ 쿼리를 실행하면 년 3 월 2012 2012 년 6 월
var result = from p in this.Elements
where p.Date >= new DateTime(2012, 03, 01) &&
p.Date <= new DateTime(2012, 30, 06
select p;
사이의 날짜가있는 모든 요소가 지정된 범위 내에있는 80 개 요소를 반환 ~ 25 밀리 소요 - HashSet < T> 또는 ObservableCollection < T>를 사용하면 문제가되지 않습니다.
모든 요소를 수동으로 반복하여 확인하면 약 25ms의 시간이 걸립니다.
그러나 주어진 범위 내에있는 모든 날짜의 HashCode를 알고 있습니다. 내 HashSet < T>에서 지정된 HashCodes를 사용하여 모든 요소를 가져올 수 있습니까? 나는 그것이 훨씬 더 빠를 것이라고 생각한다 ...
LINQ 쿼리의 속도를 높일 수 있습니까? 내 HashSet의 특수 기능을 사용하지 않는다고 가정합니다. < T>?
각 요소의 해시 코드가 날짜입니까? – Jodrell
범위 내에있는 요소를 효율적으로 검색 할 수있는 HashSet의 특별한 기능은 없습니다. HashSet을 사용하면 특정 객체 또는 값이 집합에 있는지 여부를 신속하게 확인할 수 있습니다. –
hatchet
첫 번째 관찰은 객체가 다른 경우 가능한 경우 해시 코드가 달라야한다는 것입니다 (항상 분명하지는 않지만 분명히 목표로합니다). 귀하의 경우에는 그렇지 않습니다. 나쁜 요소가있는 동일한 해시 코드를 가진 다른 요소가 있습니다. 최악의 경우 세 가지 고유 한 날짜 만있는 경우 hashset에는 세 개의 버킷이 있으므로 해시 세트에서 무언가를 찾는 것은 해당 버킷의 모든 요소를 통해 정렬해야 O (n)이됩니다 (제공 또는 가져 오기). 또한 이것은 일반적인 질문이며 직접적으로 ques와 관련이 없다는 것을 알아야합니다. – Chris