vector | list | |
장점 | 1. 일반 배열처럼 연속적인 메모리에 저장돼서 Index로 빠르게 접근 가능 2. 동적으로 메모리가 확장되는 기능 |
1. 어느 위치에서든 삽입/삭제가 빠름 |
단점 | 1. 중간 삽입/삭제가 느림 2. 확장이 필요할 때에 메모리 재할당과 복사로 비용 발생 -> Move Semantic으로 커버 가능 |
1. Index로 접근 불가능 |
stack | queue | |
장점 | 1. LIFO 로 원소가 필요할 때 사용 가능 2. top에 위치한 원소에 빠르게 접근 가능 |
1. FIFO로 원소가 필요할 때 사용 가능 2. front에 위치한 원소에 빠르게 접근 가능 |
단점 | 1. 중간에 위치한 원소에 대해 접근 불가능 | 1. 중간에 위치한 원소에 대해 접근 불가능 |
hash_map | tree | |
장점 | 1. Key값을 이용해서 모든 원소를 O(1)에 탐색 가능 | 1. skewed tree가 아닌 이진트리라면 탐색, 삽입, 삭제를 O(logn)에 가능 |
단점 | 1. 해시 충돌 발생시 성능이 떨어질 수 있음 -> 충돌했을 때 성능 하락을 최소화하기 위해 Chaining, Open Addressing을 사용할 수 있음 |
1. skewed tree라면 탐색, 삽입, 삭제의 시간 복잡도가 O(n)이 될 수도 있다 |
서로 다른 키값에 대해 해시 함수가 같은 값을 리턴(= 같은 bucket Index를 리턴)할 때 Hash Collision이라고 한다
1. Chaining
2. Open-Addressing
Open Addressing은 해당 인덱스의 버킷에 이미 원소가 들어 있으면 대신 다른 비어있는 버킷 인덱스를 찾아서 활용하는 방식으로 충돌을 피하는 기법이다.
다른 비어있는 버킷 인덱스를 찾는 방법에는 linear probing, quadratic probing, double hashing(또 다른 해시 함수를 사용해서 두번째 해시 함수는 첫번째 해시 함수가 리턴하는 인덱스로부터 Offset으로 활용해서 탐사 하는 방식)이 있다.
map vs hash_map
사실 MSDN에서도 hash_map보단 unordered_map 사용을 권장하고, unordred_map은 표준(namespace가 std)인 반면에hash_map은 비표준(namespace가 stdext)이다.
map
1. Key 값으로 자료에 접근할 때, 이진 탐색 트리를 이용해서 값에 접근한다. 최근엔 Red-Black Tree를 사용한다. 따라서 탐색, 삽입, 삭제에 시간 복잡도는 O(logN)이다
2. 3번째 정렬 함수가 디폴트로 less가 들어가 있어서 오름차순으로 정렬되어 있다. 만약 내림차순으로 정렬하고 싶은 경우에는
map<key 타입, value 타입, std::greater<key 타입> > map1;
이런식으로 3번째 인자에 greater 를 써주면 된다
3. 중복을 허용하지 않는다(multimap은 정렬을 허용)
hash_map
1. hash_map도 일종의 map이므로, Key값으로 자료에 접근하지만 이때 Key는 해시 함수가 만든 Key값을 사용해서 자료에 접근
2. 탐색에 시간 복잡도는 O(1)이다. 단 Hash Collision이 자주 일어나지 않아야 한다.
3. 자료가 정렬되어 있지 않다.
upper_bound, lower_bound 메서드
map과 set클래스는 upper_bound과 lower_bound라는 메서드를 가지고 있다.
lower_bound : Key값이 인자로 넘겨준 값보다 크거나 같은 첫번재 원소를 리턴한다. 없다면 last를 리턴한다.
upper_bound : Key값이 인자로 넘겨준 값보다 큰 첫번째 원소를 리턴한다. 그런 원소가 없다면 last를 리턴한다.
Reference
https://www.quora.com/What-is-the-difference-between-HashMap-and-Map-in-C
'공부 > Data Structure' 카테고리의 다른 글
해시 테이블(Hash Table) (0) | 2021.08.12 |
---|---|
AVL Tree (0) | 2021.08.06 |
이진 탐색 트리(Binary Search Tree), 화살표 연산자 오버로딩(-> operator overloading, arrow operator overloading) (0) | 2021.08.06 |
Linked list 구현 (0) | 2021.08.02 |