🖥️ CS/Data Structure & Algorithm
map과 unordered_map, 그리고 map과 value 정렬
한국의 메타몽
2021. 10. 13. 11:38
map과 unordered_map의 차이 요약
map | unordered_map | |
시간복잡도 | O(logN) | O(1) |
데이터 정렬 | 레드블랙 트리 (Red-Black Tree) -> 중복허용 X, Key를 기준으로 오름차순 자동정렬 |
해시테이블 (Hash Table) -> 중복허용 X, 정렬되지 않음 |
권장하는 사용법 | 1. 데이터 양이 보다 적을때 권장 2. Key를 이용하여 정렬을 해야할때 권장 |
대량의 데이터를 저장할때 권장 |
* 레드블랙트리 : 이진탐색트리의 일종
* 해시테이블 : 키 값을 주소로 사용
map활용 예시 : 사용된 영어 단어들을 1. 빈도순 2. 문자순으로 정렬
예를들어 사용된 단어들이 1. 많이 사용됐을수록, 2. 사전순으로 앞에 올수록 더 앞에 위치하게 정렬을 한다고 가정해보자. map을 사용하면 해결이 될 것 같지만 map은 key값을 기준으로 오름차순으로 정렬된다. 또한, 사전순으로 앞에 올 수록이라는 조건까지 추가되어 단순히 map만으로는 정렬이 쉽지 않을 것 같다.
이럴경우 먼저 다음과 같은 로직으로 구현을 하면 된다.
1. map에 사용된 영어단어들과 빈도수를 저장
2. map의 값들을 vector에 저장
3. vector를 사용자의 편의에 맞춰 정렬
[예시 코드]
#include <iostream>
#include <algorithm>
#include <vector>
#include <unordered_map>
using namespace std;
bool comp(pair<string,int> &a, pair<string,int> &b) {
if (a.second == b.second) return a.first < b.first;
return a.second > b.second;
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
unordered_map<string, int> mp; // "abc", "acb", "ade", "abcccccccc", "abdddddddd";
mp["abdddddddd"]+=2;
mp["abcccccccc"]++;
mp["ade"]++;
mp["acb"] += 2;
mp["abc"] += 2;
vector<pair<string, int>> v(mp.begin(), mp.end());
sort(v.begin(), v.end(), comp);
for (auto i : v) cout << i.first << " " << i.second << "\n";
return 0;
}
[결과]
목표대로 1. 많이 사용될수록 2. 사전순으로 앞에 올수록 정렬이 되었다.