CS 전공지식

24.01.19 비선형 자료 구조 1

김용글 2024. 1. 19. 13:42

1. 비선형 자료 구조

    - 일렬로 나열하지 않고 자료 순서나 관계가 복잡한 구조

    - 일반적으로 트리나 그래프를 말함

 

  1) 그래프

       - 정점과 간선으로 이루어진 자료구조

     (1) 정점과 간선

           - 어떠한 곳에서 어떠한 곳으로 무언가를 통해 간다고 했을 때 어떠한 곳은 정점(vertex)이 되고

             무언가는 간선(edge)이 됨

           - 짝사랑은 단반향 간선이고 서로 좋아하는 것은 양방향 간선과 같다

           - 예) 아래 그림처럼 집으로 간다고 했을 때 나와 아파트는 하나의 정점이고 거기로 가는 길은 간선이 됨

 

           - 정점으로 나가는 간선을 해당 정점의 outdegree 라고 하며, 들어오는 간선을 해당 정점의 indegree 라고 한다

           - 위의 그림의 정점 V 는 outdegree 는 세개, indegree 는 두개인 상태

           - 정점은 약자로 V 또는 U 라고 하고, 보통 어떤 정점으로부터 시작해서 어떤 정점까지 간다를

              U 에서 부터 V 로 간다라고 표현

           - 정점과 간선으로 이루어진 집합을 그래프라고함

           A) 가중치

                - 간선과 정점 사이에 드는 비용

                - 1번 노드와 2번 노트까지 가는 비용이 한칸이라면 가중치는 한칸

                - 예) 성남이라는 정점에서 네이버라는 정점까지 가는데 걸리는 택시비가 13,000원이라면

                        성남에서 네이버까지 가는 가중치는 13,000원이 됨

 

  2) 트리

       - 그래프 중 하나로 그래프의 특징처럼 정점과 간선으로 이루어져 있고, 트리구조로 배열된 일종의

         계층적 데이터의 집합

       - 루프 노드, 내부 노드, 리프 노드 등으로 구성됨

       - 트리로 이루어진 집합을 숲이라고 함

 

     (1) 트리의 특징

           - 그래프의 일종이며 다음 특징을 가진 다는 점이 다르다

              * 부모, 자식 계층 구조를 가짐 5번 노드는 6번 노드와 7번 노드의 부모노드이고 6번 노드와 7번 노드는

                 5번 노드의 자식노드이다. 같은 경로상에서 어떤 노드보다 위에 있으면 부모, 아래 있으면 자식노드가 됨

              * V - 1 = E 라는 특징이 있다. 간선 수는 노드수 -1 임

              * 임의의 두 노드 사이의 경로는 유일무이하게 존재한다. 즉, 트리 내의 어떤 노드와 어떤 노드까지의

                경로는 반드시 있다

 

     (2) 트리의 구성

           - 루트 노드, 내부 토드, 리프 노드로 이루어짐     

           A) 루트 노드

                - 가장 위에 있는 노드

                - 트리 문제가 나오고 트리를 탐색할 때 루트 노드를 중심으로 탐색하면 문제가 쉽게 풀리는 경우가 많다

           B) 내부 노드

                - 루트 노드와 내부 노드 사이에 있는 도드

           C) 리프 노드

                - 자식 노드가 없는 노드

 

     (3) 트리의 높이와 레벨

           - 깊이 : 각 노드마다 다르며, 루트 노드부터 특정 노드까지 최단 거리로 갔을 때의 거리를 말한다 

                       예) 4번 노드의 깊이는 2 이다

           - 높이 : 루트 노드부터 리프 노드까지 거리 중 가장 긴 거리를 의미하며 위 그림의 트리 높이는 3이다

           - 레벨 : 주어지는 문제마다 조금씩 다르지만 보통 깊이와 같은 의미를 지닌다

                        1번 노드를 0레벨이라고 하고 2번 노드, 4번 노드까지의 레벨을 1레벨이라고 할 수도 있고,

                        1번 노드를 1레벨 이라고 한다면 2번 노드와 3번 노드는 2레벨이 됨

           - 서브트리 : 트리 내의 하위 집합을 서브트리라고한다

                               트리 내에 있는 부분 집합이라고 보면됨

                               5번, 6번, 7번 노드가 이 트리의 하위 집합으로 저 노드들은 서비트리 이다 라고함

 

     (4) 이진 트리

           - 자식의 노드 수가 두개 이하인 트리를 말함

           - 아래와 같이 분류

              * 정이진 트리(full binary tree) : 자식 노드가 0 또는 두개인 이진 트리

              * 완전 이진 트리(complete binary tree) : 왼쪽에서부터 채워져 있는 이진트리

                                                                              마지막 레벨을 제외하고는 모든 레벨이 완전히 채워져 있으며

                                                                              마지막 레벨의 경우 왼쪽부터 채워짐

              * 변질 이진 트리(degenerate binary tree) : 자식 노드가 하나밖에 없는 이진트리

              * 포화 이진 트리(perfecte  binary tree) : 모든 노드가 꽉 차 있는 이진트리

              * 균형 이진 트리(balanced  binary tree) : 왼쪽과 오른쪽 노드의 높이 차이가 1 이하인 이진트리

                                                                               map, set 을 구성하는 레드 블랙 트리는 균형 이진 트리중 하나다

 

     (5) 이진 탐색 트리 (BST)

           - 노드의 하위 트리에는 노드 값보다 큰 값이 있는 노드만 포함되고, 왼쪽 하위 트리에는 노드 값보다

             작은 값이 들어있는 트리

           - 왼쪽 및 오른쪽 하위 트리도 해당 특성을 가짐

           - 검색하기에 용이하다

           - 왼쪽에는 작은 값 오른쪽에는 큰 값이 이미 정해져 있기 때문에 10을 찾으려고 한다면 25의

             왼쪽 노드들만 찾으면됨

           - 보통 요소를 찾을때 이진 탐색 트리의 경우 O(logn) 이 걸린다 최악의 경우 O(n) 이걸림

           - 그 이유는  아래그림처럼 삽입 순서에 따라 선형적일 수 있기 때문

  

     (6) AVL 트리 (Adelson - Velsky and Landis tree)

           - 앞서 설명한 최악의 경우 선형적인 트리가 되는 것을 방지하고 스스로 균형을 잡는 이진 탐색 트리

           - 두자식 서브트리의 높이는 항상 최대 1만큼 차이 난다는 특징이 있다

           - 이진 탐색 트리는 선형적인 트리 형태를 가질 때 최악의 경우 O(n) 의 시간 복잡도를 가진다

           - 이러한 최악의 경우를 배제하고 항상 균형 잡힌 트리로 만들자 라는 개념을 가진 트리가 AVL 트리

           - 탐색, 삽입, 삭제 모두 시간 복잡도가 O(logn)이며 사입, 삭제를 할 때 마다 균형이 안맞는 것을

             맞추기 위해 트리 일부를 왼쪽 혹은 오른쪽으로 회전시키며 균형을 잡는다

 

     (7) 레드 블랙 트리

           - 균형 이진 탐색 트리로 탐색, 삽입, 삭제 모두 시간 복잡도가 O(logn) 이다

           - 각 노드는 빨간색 또는 검은색의 색상을 나타내는 추가 비트를 저장하며, 삽입 및 삭제 중에 트리가

             균형을 유지하도록 하는데 사용됨

           - C++ STL 의 set, multiset, map, and multimap 이 레드 블랙 트리를 이용해 구현됨

           - 모든 리프 노드와 루트 노드는 블랙이고 어떤 노드가 레드이면 그 노드의 자식은 반드시 블랙이다 등의

             규칙을 기반으로 균형을 잡는 트리