정의 : HashSet이란 무엇입니까?


420

HashSet C # HashSet 데이터 구조는 .NET Framework 3.5에서 도입되었습니다. 구현 된 멤버의 전체 목록은 HashSet MSDN 페이지 .

  1. 어디에 사용됩니까?
  2. 왜 그것을 사용하고 싶습니까?


3
가능한 중복 HashSet <T> 유형
nawfal

내부적으로 해시 테이블을 사용합니다. 해시 테이블 구현이 좋으면 (예 : Dictionary <T>) HashSet을 쉽게 구현할 수 있습니다.
Raz Megrelidze

답변:


614
    1. A HashSet는 일련의 객체를 보유하지만 객체가 이미 세트에 있는지 여부를 쉽고 빠르게 확인할 수 있도록합니다. 내부적으로 배열을 관리하고 객체의 해시 코드에서 계산 된 색인을 사용하여 객체를 저장합니다. 여기를보세요

    2. HashSet고유 한 요소를 포함하는 정렬되지 않은 컬렉션입니다. 표준 수집 작업 인 Add, Remove, Contains가 있지만 해시 기반 구현을 사용하므로 이러한 작업은 O (1)입니다. (예를 들어, 포함 및 제거의 경우 O (n) 인 목록과 달리) Union , 교차대칭 차이HashSet같은 표준 설정 작업도 제공합니다 . 여기를보세요

  1. 다른 세트의 구현이 있습니다. 일부는 해시 요소를 통해 삽입 및 조회 작업을 매우 빠르게 만듭니다. 그러나 이는 요소가 추가 된 순서가 손실되었음을 의미합니다. 다른 구현에서는 더 느린 실행 시간으로 추가 주문을 유지합니다.

HashSetC # 의 클래스는 첫 번째 접근 방식을 따르므로 요소의 순서를 유지 하지 않습니다 . 일반보다 훨씬 빠릅니다 List. 일부 기본 벤치 마크는 기본 유형 (int, double, bool 등)을 처리 할 때 HashSet이 상당히 빠르다는 것을 보여주었습니다. 클래스 객체로 작업 할 때 훨씬 빠릅니다. 요점은 HashSet이 빠르다는 것입니다.

유일하게 파악할 수있는 HashSet것은 인덱스로 액세스 할 수 없다는 것입니다. 액세스 요소에 당신도 열거를 사용하거나 변환하는 내장 기능을 사용할 수 있습니다 HashSetList그 통해 반복 처리. 여기를보세요


13
해시 셋과 유사한 두 가지가 C #이 아닌 .NET입니다. 또한 HashSet은 순서를 유지하지 않습니다. 해시 세트에서 항목을 추가하고 제거해보십시오. 나중에 반복하는지 알 수 있습니다.
nawfal

13

A HashSet에는 내부 구조 (해시)가있어 항목을 빠르게 검색하고 식별 할 수 있습니다. 단점은 HashSet(또는 인덱스별로 항목을 가져 오는) 반복하는 것이 다소 느리다는 것입니다.

그렇다면 왜 누군가가 세트에 항목이 있는지 알고 싶어할까요?

a HashSet가 유용한 상황 은 중복이 존재할 수있는 목록에서 고유 한 값을 얻는 것입니다. 항목이 추가 HashSet되면 해당 항목이 존재하는지 빠르게 판단 할 수 있습니다 ( Contains연산자).

의 다른 장점은 HashSet설정 작업이다 : IntersectWith, IsSubsetOf, IsSupersetOf, Overlaps, SymmetricExceptWith, UnionWith.

오브젝트 제한 조건 언어에 익숙 하면 이러한 세트 조작을 식별 할 수 있습니다. 또한 실행 가능한 UML 구현에 한 걸음 더 다가간 것을 알 수 있습니다.


20
다시 : 단점. 아니요, HashSet을 반복하는 것이 완벽합니다. 둘째, 항목을 색인별로 가져올 수 없습니다. 실제로 요소는 정렬되지 않은 상태로 저장됩니다.
Nigel Touch

@Nigel Touch. 인덱스 (추가 된 순서)에 신경 쓰지 않으면 반복이 빠릅니다. 그러나 인덱스가 염려되면 각 해시 키와 함께 인덱스를 저장해야하므로 목록을 철저하게 검색하여 올바른 항목을 검색해야하므로 속도가 느려질 수 있습니다. 이 동작은 항목이 추가 된 순서대로 색인이 생성 된 목록과는 매우 다릅니다.
k rey

두 해시가 동일하지 않기 때문에 왜 빠를 지 이해가됩니다. 쿼리가 "단락"접근 방식을 활용하여 특정 기준을 신속하게 배제 할 수 있습니다.
Chef_Code

8

간단히 말해서 부엌의 비밀을 밝히지 않고 : 일반적으로 세트는 중복 요소가 없으며 특정 순서가없는 컬렉션입니다. 따라서 A HashSet<T>는 generic과 비슷 List<T>하지만 순서가 손실되는 대신 이름이 암시하는 것처럼 해시 테이블을 통한 빠른 조회에 최적화되어 있습니다.


1
그러나 HashSet <T>는 동일한 내용을 가진 동일한 속성을 가진 두 개의 Product 클래스와 같이 동일한 데이터를 가진 두 개의 객체를 저장할 수 있습니까?
Johan Herstad

나는 우리가 결코 알지 못할 것 같아
Denny

@JohanHerstad 클래스에 대한 EqualityComparer가 해당 속성에 관심이 있다고 가정하거나 해당 속성에 관심이있는 IEqualityComparer로 HashSet을 구성한다고 가정하면 왜 그렇지 않을지 모르겠습니다. HashSet에 대한 설명서는 고유성을 결정하기 위해 하나 또는 다른 것에 의존한다는 것을 분명히합니다.
베이컨 비트

2

응용 프로그램 관점에서 볼 때 중복을 피해야하는 경우 HashSet조회, 삽입 및 제거 복잡성이 O (1) -constant이므로 찾고 있습니다. 이것이 의미하는 바는 요소 HashSet의 수를 확인하는 데 동일한 시간이 걸리는 요소의 수에 관계없이 O (1)에 요소를 삽입하기 때문에 이러한 종류의 작업에 완벽합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.