HashSet C # HashSet 데이터 구조는 .NET Framework 3.5에서 도입되었습니다. 구현 된 멤버의 전체 목록은 HashSet MSDN 페이지 .
- 어디에 사용됩니까?
- 왜 그것을 사용하고 싶습니까?
HashSet C # HashSet 데이터 구조는 .NET Framework 3.5에서 도입되었습니다. 구현 된 멤버의 전체 목록은 HashSet MSDN 페이지 .
답변:
A HashSet
는 일련의 객체를 보유하지만 객체가 이미 세트에 있는지 여부를 쉽고 빠르게 확인할 수 있도록합니다. 내부적으로 배열을 관리하고 객체의 해시 코드에서 계산 된 색인을 사용하여 객체를 저장합니다. 여기를보세요
HashSet
고유 한 요소를 포함하는 정렬되지 않은 컬렉션입니다. 표준 수집 작업 인 Add, Remove, Contains가 있지만 해시 기반 구현을 사용하므로 이러한 작업은 O (1)입니다. (예를 들어, 포함 및 제거의 경우 O (n) 인 목록과 달리) Union , 교차 및 대칭 차이 와 HashSet
같은 표준 설정 작업도 제공합니다 . 여기를보세요
다른 세트의 구현이 있습니다. 일부는 해시 요소를 통해 삽입 및 조회 작업을 매우 빠르게 만듭니다. 그러나 이는 요소가 추가 된 순서가 손실되었음을 의미합니다. 다른 구현에서는 더 느린 실행 시간으로 추가 주문을 유지합니다.
HashSet
C # 의 클래스는 첫 번째 접근 방식을 따르므로 요소의 순서를 유지 하지 않습니다 . 일반보다 훨씬 빠릅니다 List
. 일부 기본 벤치 마크는 기본 유형 (int, double, bool 등)을 처리 할 때 HashSet이 상당히 빠르다는 것을 보여주었습니다. 클래스 객체로 작업 할 때 훨씬 빠릅니다. 요점은 HashSet이 빠르다는 것입니다.
유일하게 파악할 수있는 HashSet
것은 인덱스로 액세스 할 수 없다는 것입니다. 액세스 요소에 당신도 열거를 사용하거나 변환하는 내장 기능을 사용할 수 있습니다 HashSet
에 List
그 통해 반복 처리. 여기를보세요
A HashSet
에는 내부 구조 (해시)가있어 항목을 빠르게 검색하고 식별 할 수 있습니다. 단점은 HashSet
(또는 인덱스별로 항목을 가져 오는) 반복하는 것이 다소 느리다는 것입니다.
그렇다면 왜 누군가가 세트에 항목이 있는지 알고 싶어할까요?
a HashSet
가 유용한 상황 은 중복이 존재할 수있는 목록에서 고유 한 값을 얻는 것입니다. 항목이 추가 HashSet
되면 해당 항목이 존재하는지 빠르게 판단 할 수 있습니다 ( Contains
연산자).
의 다른 장점은 HashSet
설정 작업이다 : IntersectWith
, IsSubsetOf
, IsSupersetOf
, Overlaps
, SymmetricExceptWith
, UnionWith
.
오브젝트 제한 조건 언어에 익숙 하면 이러한 세트 조작을 식별 할 수 있습니다. 또한 실행 가능한 UML 구현에 한 걸음 더 다가간 것을 알 수 있습니다.
간단히 말해서 부엌의 비밀을 밝히지 않고 :
일반적으로 세트는 중복 요소가 없으며 특정 순서가없는 컬렉션입니다. 따라서 A HashSet<T>
는 generic과 비슷 List<T>
하지만 순서가 손실되는 대신 이름이 암시하는 것처럼 해시 테이블을 통한 빠른 조회에 최적화되어 있습니다.
응용 프로그램 관점에서 볼 때 중복을 피해야하는 경우 HashSet
조회, 삽입 및 제거 복잡성이 O (1) -constant이므로 찾고 있습니다. 이것이 의미하는 바는 요소 HashSet
의 수를 확인하는 데 동일한 시간이 걸리는 요소의 수에 관계없이 O (1)에 요소를 삽입하기 때문에 이러한 종류의 작업에 완벽합니다.