반응형
5.3.1 그래프 (Graph)
그래프(Graph)는 정점(Vertex)과 간선(Edge)으로 이루어진 자료 구조
- 무방향 그래프 (Undirected Graph)
- 방향 그래프 (Directed Graph)
- 가중 그래프 (Weighted Graph)
C++ STL에서 그래프 구현
- 인접 리스트 (Adjacency List) → std::vector<std::list<int>>
- 인접 행렬 (Adjacency Matrix) → std::vector<std::vector<int>>
그래프의 시간 복잡도
표현 방법 | 메모리 | 간선 추가 | 간선 탐색 |
인접 행렬 (N×N) | O(N^2) | O(1) | O(1) |
인접 리스트 | O(N + M) | O(1) | O(N) |
예제 vector를 활용한 그래프 구현 (인접 리스트)
#include <iostream>
#include <vector>
using namespace std;
int main() {
int N = 5; // 정점 개수
vector<vector<int>> graph(N);
// 간선 추가 (무방향 그래프)
graph[0].push_back(1);
graph[1].push_back(0);
graph[1].push_back(2);
graph[2].push_back(1);
// 출력
for (int i = 0; i < N; i++) {
cout << "노드 " << i << "의 인접 노드: ";
for (int neighbor : graph[i]) {
cout << neighbor << " ";
}
cout << endl;
}
return 0;
}
노드 0의 인접 노드: 1
노드 1의 인접 노드: 0 2
노드 2의 인접 노드: 1
- std::vector<std::vector<int>>를 사용해 인접 리스트 방식으로 그래프를 구현
5.3.2 트리 (Tree)
트리(Tree)는 부모-자식 관계를 가지는 계층적 자료 구조
- 이진 트리 (Binary Tree)
- 이진 탐색 트리 (BST, Binary Search Tree)
- 균형 트리 (AVL 트리, Red-Black 트리)
C++ STL에서 트리 구현
- 이진 탐색 트리 (BST) → std::set, std::map
트리의 시간 복잡도 (BST 기준)
연산 | 평균 | 최악 |
삽입 (insert()) | O(log N) | O(N) |
삭제 (erase()) | O(log N) | O(N) |
탐색 (find()) | O(log N) | O(N) |
예제 set을 이용한 이진 탐색 트리 (BST)
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> bst;
bst.insert(10);
bst.insert(5);
bst.insert(15);
cout << "BST 원소 출력: ";
for (int x : bst) cout << x << " ";
cout << endl;
cout << "10이 존재하는가? " << (bst.find(10) != bst.end()) << endl;
return 0;
}
BST 원소 출력: 5 10 15
10이 존재하는가? 1
- std::set은 Red-Black Tree 기반의 BST로 동작하며 O(log N)의 탐색
5.3.3 힙 (Heap)
힙(Heap)은 완전 이진 트리(Complete Binary Tree) 기반의 우선순위 자료 구조
- 최대 힙 (Max Heap) → 부모가 자식보다 크다.
- 최소 힙 (Min Heap) → 부모가 자식보다 작다.
C++ STL에서 힙 구현
- std::priority_queue 사용
힙의 시간 복잡도
연산 | 시간 복잡도 |
삽입 (push()) | O(log N) |
삭제 (pop()) | O(log N) |
최댓값 조회 (top()) | O(1) |
예제 코드: std::priority_queue 사용
#include <iostream>
#include <queue>
using namespace std;
int main() {
priority_queue<int> maxHeap;
maxHeap.push(30);
maxHeap.push(10);
maxHeap.push(20);
cout << "최댓값: " << maxHeap.top() << endl;
return 0;
}
- std::priority_queue는 기본적으로 최대 힙을 제공한다.
5.3.4 우선순위 큐 (Priority Queue)
우선순위 큐(Priority Queue)는 가장 우선순위가 높은 요소를 먼저 처리하는 큐
C++ STL에서 std::priority_queue를 사용하여 쉽게 구현
우선순위 큐의 시간 복잡도
연산 | 시간 복잡도 |
삽입 (push()) | O(log N) |
삭제 (pop()) | O(log N) |
조회 (top()) | O(1) |
예제 priority_queue
#include <iostream>
#include <queue>
using namespace std;
int main() {
priority_queue<int> pq;
pq.push(10);
pq.push(20);
pq.push(5);
cout << "최댓값: " << pq.top() << endl;
pq.pop();
cout << "pop() 후 최댓값: " << pq.top() << endl;
return 0;
}
최댓값: 20
pop() 후 최댓값: 10
- priority_queue는 최대 힙(Max Heap)을 기본으로 사용하여, 가장 큰 값을 top()에서 반환
- push() 및 pop() 연산은 O(log N)의 시간 복잡도
우선순위 큐를 최소 힙으로 사용하는 방법
priority_queue<int, vector<int>, greater<int>> minPQ;
- greater<int>을 사용하면 최소 힙(Min Heap)
5.3.5 맵 (Map)
맵(Map)은 (Key, Value) 쌍으로 이루어진 자료 구조
- 정렬된 맵 (Ordered Map) → std::map (BST 기반)
- 해시 맵 (Unordered Map) → std::unordered_map (해시 테이블 기반)
맵의 시간 복잡도
연산 | std::map (O(log N)) | std::unordered_map (O(1)) |
삽입 (insert()) | O(log N) | O(1) |
삭제 (erase()) | O(log N) | O(1) |
탐색 (find()) | O(log N) | O(1) |
예제 코드: std::map 사용
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, int> scores;
scores["Alice"] = 90;
scores["Bob"] = 80;
cout << "Alice 점수: " << scores["Alice"] << endl;
return 0;
}
5.3.6 셋 (Set)
셋(Set)은 중복을 허용하지 않는 자료 구조
C++ STL에서는 std::set과 std::unordered_set을 제공
셋의 유형
- 정렬된 셋 (Ordered Set) → std::set (Red-Black Tree 기반, 자동 정렬)
- 해시 셋 (Unordered Set) → std::unordered_set (해시 테이블 기반, 순서 없음)
셋의 시간 복잡도
연산 | std::set (O(log N)) | std::unordered_set (O(1)) |
삽입 (insert()) | O(log N) | O(1) |
삭제 (erase()) | O(log N) | O(1) |
탐색 (find()) | O(log N) | O(1) |
예제 코드: std::set 사용
#include <iostream>
#include <set>
using namespace std;
int main() {
set<int> orderedSet;
orderedSet.insert(20);
orderedSet.insert(10);
orderedSet.insert(30);
cout << "정렬된 셋: ";
for (int x : orderedSet) cout << x << " ";
cout << endl;
return 0;
}
- std::set은 자동 정렬되며, 중복 원소를 허용하지 않는다.
5.3.7 해시 테이블 (Hash Table)
해시 테이블(Hash Table)은 Key를 해싱(Hashing)하여 저장하는 자료 구조
C++ STL에서는 std::unordered_map을 제공
해시 테이블의 시간 복잡도
연산 | 시간 복잡도 |
삽입 | O(1) (평균) / O(N) (최악) |
삭제 | O(1) (평균) / O(N) (최악) |
탐색 | O(1) (평균) / O(N) (최악) |
예제 unordered_map
#include <iostream>
#include <unordered_map>
using namespace std;
int main() {
unordered_map<string, int> hashTable;
hashTable["apple"] = 1;
hashTable["banana"] = 2;
cout << "apple의 값: " << hashTable["apple"] << endl;
return 0;
}
반응형
'SW > 면접을 위한 CS 전공지식 노트' 카테고리의 다른 글
추가. Red-black 트리 (레드블랙트리) (0) | 2025.02.07 |
---|---|
5.2 선형 자료 구조 (Linear Data Structures) (0) | 2025.02.05 |
5.1 복잡도 (0) | 2025.02.05 |
참고. 데이터베이스 관련 면접 질문 리스트 (2) | 2025.01.24 |
4.7 조인의 원리 (1) | 2025.01.22 |