2009-08-21 2 views
0

나는 나의 webservice로 보내지는 정수의 큰 목록을 가지고있다. 우리 비즈니스 규칙은 이러한 값이 고유해야한다고 말합니다. 복제물이 있는지 알아내는 가장 효과적인 방법은 무엇입니까? 나는 가치관을 알 필요가 없다. 단지 2 개의 가치가 같은지 알아야한다.정수 컬렉션으로 존재를 확인하는 가장 좋은 방법은 무엇입니까?

처음에는 정수 및 List.Exists() 메서드의 일반 목록을 사용하려고 생각했지만 이것은 O (n)의 결과입니다.

그런 다음 Dictionary 및 ContainsKey 메서드를 사용하려고 생각했습니다. 그러나, 나는 단지 키가 필요하고, 나는 값을 필요로하지 않는다. 그리고 저는 이것이 선형 검색이라고 생각합니다.

목록에서 고유성을 찾는 데 사용할 수있는 더 나은 데이터 유형이 있습니까? 아니면 선형 검색으로 붙어 있습니까?

답변

15

사용하십시오 HashSet<T> :

HashSet의 클래스는 고성능 설정 작업을 제공합니다. 집합 요소

HashSet<T>a constructor that accepts an IEnumerable<T> 노출없이 특정 순서가 중복 요소 등을 포함하지 않는 컬렉션 이다. List<T>HashSet<T>'s 생성자에 전달하면 원래 List<T>과 다른 일련의 항목이 포함될 새로운 HashSet<T>에 대한 참조로 끝납니다.

+4

inputList.Count! = hashSet.Count, "Houston, 우리는 복제본을 가지고 있습니다!" – user7116

+0

아직도 O (n)인데, 그가 얻을 수있는 최선이라고 생각합니다. – Marc

+0

@sixlettervariables - 우수 포인트! –

1

는 프레임 워크 3.5을 사용하는 경우가 HashSet 모음을 사용할 수 있습니다

0

... Hashset위한 작업 같은데.

그렇지 않으면 가장 좋은 옵션은 Dictionary입니다. 각 항목의 가치는 낭비되지만 최상의 성능을 제공합니다.

나중에 계산하지 않고 항목을 HashSet/Dictionary에 추가하는 동안 중복 항목을 확인하면 중복이없는 경우 O (n)보다 성능이 좋아집니다. 첫 번째 사본을 찾는 것.

0

숫자 집합이 희박한 경우 다른 사람들은 HashSet을 사용하도록 제안합니다.

그러나 숫자 집합이 가끔 간격이있는 순서대로있는 경우 정렬 된 배열 또는 시작, 끝 쌍의 이진 트리로 설정된 숫자를 저장하면 훨씬 좋습니다. 그런 다음 검색 키보다 작은 가장 큰 시작 값을 가진 쌍을 찾고 해당 쌍의 최종 값과 비교하여 집합에 있는지 확인하십시오. 어떤 일에 대한

0

는 :

list.Distinct().Count() != list.Count() 

나는이의 성능에 대해 궁금합니다. 나는 그것이 O (n)만큼 좋지만 코드가 적고 쉽게 읽을 수 있다고 생각한다.

관련 문제