공부/Data Structure

자료구조 별 장단점(vector, list, queue, stack, map, hash map, tree)

sudo 2022. 9. 15. 18:34
  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)이 될 수도 있다

 

https://woo-dev.tistory.com/106

서로 다른 키값에 대해 해시 함수가 같은 값을 리턴(= 같은 bucket Index를 리턴)할 때 Hash Collision이라고 한다

 

1. Chaining  

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

 

What is the difference between HashMap and Map in C++?

Answer (1 of 4): Standard C++ does not have a container called “hash_map” but it has a container called “unordered_map” which is a map based on a hash table. Some quick googling revealed that some implementations of the STL (before much of the STL

www.quora.com