vector는 배열을, unordered_map은 hash_table를 사용해 hash를 구현한 모두 유명한 자료구조 컨테이너이다.
unordered_map의 탐색 시간 복잡도는 O(1)이다.
그렇다면 전체 순회의 경우 vector와 비교할 때는 어떻게 될까?
단순히 시간복잡도만을 계산하면 둘 다 O(n)인데 어떤 것이 더 빠를까?
직접 해보자
#include <iostream>
#include <chrono>
#include <unordered_map>
#include <vector>
#define COUNTER 1000000
int main() {
using namespace std::chrono;
// std::chrono::milliseconds is an instatiation of std::chrono::duration:
int tmp;
std::vector<int> v;
std::unordered_map<int, int> m;
for (int i = 0; i < COUNTER; i++)
v.push_back(i);
for (int i = 0; i < COUNTER; i++)
m[i] = i;
auto startv = system_clock::now();
for (auto iter = v.begin(); iter != v.end(); ++iter)
tmp = (*iter);
auto endv = system_clock::now();
duration<double> vector_elapsed = endv - startv;
std::cout <<"백만개 순회"<<"\n";
std::cout <<"std::vector<int> : "<< vector_elapsed.count()<<"ms" << std::endl;
auto startm = system_clock::now();
//for (auto iter = m.begin(); iter != m.end(); ++iter)
// tmp = iter->second;
for (int i = 0; i < COUNTER; i++)
tmp = m[i];
auto endm = system_clock::now();
duration<double> map_elapsed = endm - startm;
std::cout << "std::unordered_map<int, int> : " << map_elapsed.count() << "ms" << std::endl;
}
iterator로 접근하나 key로 접근하나 둘다 vector가 성능이 뛰어나다.
특히 key로 접근하는 경우에는 차이가 성능이 6배이상까지 벌어졌다.
결론
생각해보면 전체순회의 경우는 당연히 unordered_map의 의도에 맞지않는 방법이다.
전체 순회를 할 경우 vecter를 사용하자.
쓸대없는 짓을 하지말자.
REFERENCE
https://en.cppreference.com/w/cpp/container/unordered_map
https://en.cppreference.com/w/cpp/container/vector
- 논외로 map과 hash_map(unordered_map)에 대한 고찰도 있다. 좋은 글이니 여유가 되면 참고하시길
'Algorithm > 유용한 팁 (Tips)' 카테고리의 다른 글
[C++,구현] 백준 1764번 듣보잡 문제풀이, 배열,vector,map 속도비교 (0) | 2019.03.26 |
---|---|
[C,C++] 지역변수와 전역변수 특징,백준 1463번 1로 만들기 풀이 (0) | 2019.03.11 |
[C,C++] 1,2차원 배열 원소 선언, 정적 동적 전체 초기화 (2) | 2018.08.23 |
[C++] 입출력 속도 가속시키기 백준 2741번 N찍기 풀이 std::ios_base::sync_with_stdio(0) (0) | 2018.08.06 |
댓글