Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- architecture
- MyVoca
- 프로그래머스
- MiTweet
- 코루틴
- 암호학
- androidStudio
- 코드포스
- activity
- AWS
- ProGuard
- Compose
- boj
- Rxjava
- android
- Coroutines
- 쿠링
- pandas
- 백준
- Hilt
- Kotlin
- Codeforces
- Python
- relay
- livedata
- TEST
- textfield
- Gradle
- GitHub
- Coroutine
Archives
- Today
- Total
이동식 저장소
std::set은 생각보다 더 느리다 본문
그래프의 노드에 자연수 번호가 붙여져 있다고 가정할 때, 그래프를 인접 행렬로 저장하려면 vector의 vector를 저장하거나 set의 vector를 저장해야 한다. 나는 중복을 제거하고 싶을 경우에만 뒤의 방법을 쓰고, 평소에는 거의 앞의 방법을 사용한다.
그런데 오늘 2-SAT - 4를 풀면서 조금 생각이 바뀌었다.
위가 vector<vector<int>>, 아래가 vector<set<int>>를 사용한 코드이다. 분명 자료구조만 바꿨는데도 시간 차이가 크게 난다. 이쯤되면 중복 제거할 때도 set을 사용하지 않을 것 같다. vector에서도 $NlogN$ 시간에 중복을 제거할 수 있기 때문이다.
// https://stackoverflow.com/questions/1041620/whats-the-most-efficient-way-to-erase-duplicates-and-sort-a-vector
sort(vec.begin(),vec.end());
vec.erase(unique(vec.begin(), vec.end()), vec.end());
자료의 순서를 되돌리고 싶다면 std::pair<int, int>에 각각 값과 순서를 저장해 놓고, 중복을 제거한 다음 pair.second 기준으로 정렬하면 된다. 근데 애초에 인접 행렬에서는 순서가 크게 중요하지 않아서 이런 걸 자주 쓸 일은 없을 듯 하다.
예전에 BOJ 슬랙에서 어떤 분이 std::set은 $logN$ 자료구조 중에서도 독보적으로 느리다고 하시는 걸 봤는데, 오늘 그 말을 이해했다. 아마 Red-Black tree를 사용하기 때문이라고 했던 것 같은데, 나중에 이게 왜 느린지도 공부해 봐야겠다.
'Primary' 카테고리의 다른 글
프로그래머스 월간 코드 챌린지 시즌1 11월 후기 (0) | 2020.11.07 |
---|---|
프로그래머스 월간 코드 챌린지 2020-10 (0) | 2020.10.08 |
Hyperskill - 단계식 프로그래밍 학습 사이트 (0) | 2020.07.29 |
상수에 관한 오해 (0) | 2020.07.12 |
프로그래머스 - 코딩 테스트 연습 사이트 (0) | 2020.05.03 |
Comments