HashSet vs HashTable vs Dictionary

 

세 가지 컬렉션 모두 해시 기반이기 때문에 검색의 복잡도가 O(1)로 굉장히 빠르다. 

순서가 존재하지 않으며 수학에서의 '집합' 개념에 해당한다.

 

1. Dictionary<TKey, TValue>

 - 세 가지 컬렉션 중 가장 많이 사용되고 익숙한 자료구조.

 - Key와 Value를 사용하여 자료를 저장한다.

 - 중복 Key를 허용하지 않는다.

 - 제네릭으로 키와 밸류의 타입을 미리 정할 수 있어 박싱과 언박싱이 발생하지 않는다.

var dict = new Dictionary<string, int>();

dict.Add("A", 1);
dict.Remove("A");

int myNum = dict["A"];

 

2. HashTable

 - Key와 Value를 사용하여 자료를 저장한다.

 - 중복 Key를 허용하지 않는다.

 - Key와 Value 둘 다 Object형식을 사용한다. (박싱 언박싱 발생)

 - Value가 Object형식이기 때문에 타입에 상관없이 여러 형태를 저장할 수 있다.

var hash = new Hashtable();

hash.Add("A", 1);
hash.Remove("A");

int myNum = (int)hash["A"];

 

3. HashSet<T>

 - 키가 별도로 존재하지 않으며, 밸류로만 이루어져 있다.

 - 순서가 존재하지 않으며, {0, 1, 2}는 {2, 1, 0} 과 같다.

 - 각 항목의 중복을 허용하지 않는다.

HashSet<int> uniqueVals = new HashSet<int>();

uniqueVals.Add(1);
uniqueVals.Remove(1);

 - Add함수의 bool 반환 값으로 중복여부를 알 수 있다.

if(hashset.Add(value))
    // 삽입 성공
else
    // 삽입 실패 (중복)

 

 

HashSet은 딱히 써보지 않았었는데,

의미 없는 키를 부여하거나 밸류와 동일한 키를 사용해서 Dictionary에 넣는 것보다

HashSet을 활용하는 게 나을 듯하다.

 

댓글

Designed by JB FACTORY