Hayden's Archive

[자료구조] 트리 / 이진 트리 / 이진 탐색 트리 / m원 탐색 트리 / B 트리 / B* 트리 / B+ 트리 본문

Study/CS

[자료구조] 트리 / 이진 트리 / 이진 탐색 트리 / m원 탐색 트리 / B 트리 / B* 트리 / B+ 트리

_hayden 2020. 11. 14. 12:16

참고 : 방통대 자료구조 강의

 

  •  트리
    • 검색의 편리함
    • 논리적 계층
    • 계급적 특성

 

  • 트리의 구성
    • 노드 : 트리의 항목 / 트리에 저장되는 데이터(값+포인터)의 묶음
    • 부모노드-자식노드 : 상하 계층구조가 있고 링크나 포인터를 통해 직접적으로 연결된 노드로서 상위계층의 부모노드와 하위계층의 자식노드를 뜻함 (바로 위가 아니면 조상과 자손)
    • 루트노드 : 트리의 최상위 노드(부모가 없는 노드)
    • 서브트리 : 부모 노드를 삭제하면 생기는 트리들
    • 리프노드 : 트리의 맨 끝(바닥)에 있으면서, 자신의 서브트리를 갖지 않는 노드

 

  • 진입/진출 차수
    • 루트 노드 : 진입차수 = 0 (부모가 없음)
    • 루트를 제외한 모든 노드의 진입 차수 : 1
    • 리프 노드 : 진출차수 = 0 (자식이 없음)

 

  • 트리의 레벨
    • 루트를 시작으로 트리를 정의하고 접근함. 루트를 기준으로 같은 레벨인지 아닌지 알 수 있음.
    • 노드의 레벨 : 루트로부터 그 노드까지 이어진 간선(경로)의 길이
    • 루트노드는 레벨 0, 그 다음 자식은 레벨 1, ... , 리프 노드는 레벨 N 이런 식

 

  • 트리의 높이
    • 루트로부터 가장 멀리 있는 노드까지 이어진 간선(경로)의 길이에 1을 더한 값
    • 리프 노드가 레벨 N일 때 높이는 N+1인 것.

 

  • 이진 트리(Binary Tree)
    • 따라서 모든 노드의 차수가 2 이하(0이거나 1이거나 2)인 트리 = 자식 노드가 0개 또는 1개 또는 2개
    • 수학적으로 이진트리의 구성에 관한 이론을 정리하기 쉽고, 컴퓨터 내부에서 구현하기에도 배열을 쓰든 포인터를 쓰든 유연하게 쓸 수 있음
    • 모든 노드가 2개 이하의 자식노드를 가짐 -> 일반성을 잃지 않고 '오른쪽', '왼쪽'이라는 방향 개념 부여 가능

 

  • 포화 이진 트리
    • 이진 트리의 각 레벨에서 허용되는 최대 개수 노드를 가지는 트리
    • 레벨 0에서 가질 수 있는 자식노드는 최대 2개,  레벨 1에서 가질 수 있는 자식노드는 최대 4개, 레벨 2에서 가질 수 있는 자식노드는 최대 8개
    • 맨 마지막 리프노드는 제외

 

  • 완전 이진 트리
    • 높이가 k인 이진 트리가 0 레벨에서부터 k-2 레벨까지 다 채우고 마지막 k-1 레벨에서 다 채우진 않더라도 왼쪽부터 순서대로 채워진 이진트리

 

  • 이진 탐색 트리(BS 트리, Binary Search Tree)
    • 내가 원하는 데이터를 찾을 때 이진트리를 변형해서 이진 탐색 트리를 사용함
    • 특정 데이터를 검색하고, 노드를 삽입/삭제하는 응용 문제에 가장 효과적인 이진 트리
    • 탐색에 최적화된 이진 트리
    • 키 : 이진 트리의 노드의 데이터(노드를 특정할 수 있는 값). 노드 하나가 갖고 있는 유니크한 값을 키 값이라고 함.
    • 트리를 구성하고 구축하는 제한 사항 - 부모는 왼쪽 자식노드보다 크고, 오른쪽 자식노드보다 작다
    • 아래 그림에서 두 트리 모두 이진 트리에 해당하지만 왼쪽은 이진 탐색 트리가 맞고, 오른쪽은 이진 탐색 트리가 아니다.

 

  • 이진 탐색 트리에서 일반적으로 노드의 개수가 많아지면 트리의 높이가 커지게 됨
  • 트리는 탐색해서 내가 원하는 값을 찾을 때는 효율이 좋음. 하지만 재구성할 때, 트리 구조를 만들어주고 그걸 유지할 때는 오버헤드가 크다.

 

  • m원 탐색 트리
    • 트리의 노드가 m개 이하의 가지를 가질 수 있는 탐색 트리
    • 이진 탐색 트리의 확장된 형태임. 높이를 줄이고자 할 때 활용.
    • 탐색 트리의 제한을 따르되 2개 이상(m개 이하) 자식을 가질 수 있음 (3원 탐색 트리, 4원 탐색 트리, ...)

 

  • B 트리
    • m원 탐색 트리는 높이를 줄이는 데 집중하다 보니 균형이 안 맞음 -> 그래서 등장하게 된 게 B 트리
    • 조건
      • 루트와 잎 노드를 제외한 트리의 각 노드는 최소 (m/2보다 크거나 같은 정수)개의 서브트리를 갖는다.
      • 트리의 루트는 최소한 2개의 서브트리를 갖는다.(3원 탐색 트리라고 봤을 때, 3/2 = 1.5 니까 1.5보다 크거나 같은 정수는 2임. 따라서 트리의 루트는 최소 2개의 서브트리를 가져야 함)
      • 트리의 모든 잎노드는 같은 레벨에 있다.

 

  • B* 트리
    • m원 탐색 트리에서 균형을 맞추려고 등장한 게 B 트리인데, B 트리에서 높이를 줄이는 게 또 생각나서 등장한 게 B* 트리
    • 노드의 약 2/3 이상이 채워지는 B 트리 (B 트리는 1/2 이상이었음)
    • 노드가 꽉 차면 분리하지 않고, 키와 포인터를 재배치하여 다른 형제 노드로 옮김
    • 삽입/삭제 시 발생하는 노드 분리를 줄이려고 고안됨.
    • 즉, 각각의 레벨에서의 각각의 노드들이 갖는 키 값의 개수가 많아지면 높이는 줄어든다

 

  • B+ 트리
    • 탐색 트리로 구성하면 매우 빠르게 탐색할 수 있지만, 전체 데이터를 하나씩 차례로 다 찾아서 처리하기는 불편함 -> B+ 트리 등장!
    • 인덱스된 순차 파일을 구성하는 데 사용됨.
    • B 트리와 같이 각 노드의 키가 적어도 1/2이 채워져야 하는 점은 같음
    • 모든 키값이 잎노드에 있고, 그 키값에 대응하는 실제 데이터(파일 내용)에 대한 주소를 잎노드만이 가지고 있음.
      • 직접 탐색은 잎노드에 도달해야 종료
      • 중간노드는 잎노드까지 찾아가기 위한 징검다리 역할만 한다.

 

  •  내용 정리