5.3 비선형 자료 구조 (Non-Linear Data Structures)

2025. 2. 5. 21:35·SW개발/면접을 위한 CS 전공지식 노트
반응형

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 복잡도  (1) 2025.02.05
참고. 데이터베이스 관련 면접 질문 리스트  (0) 2025.01.24
4.7 조인의 원리  (1) 2025.01.22
'SW개발/면접을 위한 CS 전공지식 노트' 카테고리의 다른 글
  • 추가. Red-black 트리 (레드블랙트리)
  • 5.2 선형 자료 구조 (Linear Data Structures)
  • 5.1 복잡도
  • 참고. 데이터베이스 관련 면접 질문 리스트
코코도롱
코코도롱
    반응형
  • 코코도롱
    도롱이의 전자공학소
    코코도롱
  • 전체
    오늘
    어제
    • 분류 전체보기 (61)
      • AI (17)
        • 데이터 분석과 모델 학습 (4)
        • 모델별 정리 (8)
        • (PJT)음성 화자 분류 (4)
      • SW개발 (38)
        • C++ (9)
        • 면접을 위한 CS 전공지식 노트 (24)
        • Django+Vue.js (0)
        • 이런저런 개발이야기 (1)
        • 갑자기 C코테를 봐야할때 (2)
        • RPI5 프로젝트 (1)
        • 트러블슈팅 (1)
      • ESG (2)
        • 내가 쓰는 Assay (1)
        • 뉴스 스크랩 (1)
      • 반도체 (4)
        • 반도체 (3)
        • 슬기로운 학부생활 (1)
        • 회로 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    반도체 물성
    페이징 기법
    홉바이홉통신
    운영체제
    데이터분석 #데이터전처리 #결측치 #머신러닝 #딥러닝 #Pandas #DataFrame
    MySQL
    데이터전처리 #데이터분석 #딥러닝 #머신러닝 #Pandas #Numpy #Python
    공백포함입력받기
    ios7계층
    입출력관리
    파일입출력 #DataFrame불러오기
    데이터분석 #머신러닝 #딥러닝 #데이터사이언스 #알고리즘 #데이터전처리
    word 수식
    면접을 위한 cs전공지식 노트
    반도체 소자 공학
    멀티프로세스
    홉바이홉
    CS지식
    반도체 공학
    ESG
    메시지큐
    c언어 입출력
    보고서 수식
    정리본
    c io
    os구조
    LAN
    전공 지식
    면접을 위한 CS 전공지식 노트
    요약본
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
코코도롱
5.3 비선형 자료 구조 (Non-Linear Data Structures)
상단으로

티스토리툴바