반응형

힙 트리란?

힙(Heap)은 완전 이진 트리의 일종으로, 특정한 조건을 만족하도록 정렬된 트리 구조입니다. 힙은 보통 우선순위 큐(Priority Queue)를 구현하기 위해 사용되며, 최소 힙(Min-Heap)과 최대 힙(Max-Heap)으로 나뉩니다.


힙 트리의 특징

  1. 완전 이진 트리:
    • 힙은 항상 완전 이진 트리 형태를 유지합니다.
    • 이는 모든 레벨이 꽉 차 있어야 하며, 마지막 레벨은 왼쪽부터 차례로 채워져야 함을 의미합니다.
  2. 힙 속성:
    • 최소 힙(Min-Heap):
      • 부모 노드의 값이 자식 노드의 값보다 작거나 같습니다.
      • 루트 노드는 항상 최솟값을 가집니다.
    • 최대 힙(Max-Heap):
      • 부모 노드의 값이 자식 노드의 값보다 크거나 같습니다.
      • 루트 노드는 항상 최댓값을 가집니다.
    • 힙 속성(최소 힙 또는 최대)은 트리의 전체적 구조가 아닌 부모-자식 간의 관계에 의해서만 보장
  3. 사용 사례:
    • 우선순위 큐 구현
    • 정렬 알고리즘(힙 정렬)
    • 작업 스케줄링

힙 트리의 동작

1. 삽입 연산

새로운 요소를 힙에 삽입할 때는 완전 이진 트리의 형태를 유지하기 위해 마지막 위치에 삽입한 후, 힙 속성을 만족하도록 재구성합니다.

예시: 최소 힙에 삽입

초기 상태:

    10
   /  \
  20  30
 /
40

 

1. 50 삽입: 새로운 요소를 마지막 위치에 삽입.

    10
   /  \
  20   30
 /  \
40  50

 

2. 힙 속성 확인: 부모 노드와 비교하여 최소 힙 속성을 만족하므로 재구성 불필요.

예시: 최대 힙에 삽입

초기 상태:

    50
   /  \
  30  40
 /
20

 

1. 60 삽입: 새로운 요소를 마지막 위치에 삽입.

    50
   /  \
  30   40
 /  \
20  60

 

2. 힙 속성 확인: 삽입한 노드(60) > 부모 노드(30), 두 노드의 값을 교환.

    50
   /  \
  60  40
 /  \
20  30

 

3. 힙 속성 확인 반복: 삽입한 노드(60) > 부모 노드(50), 두 노드의 값을 교환.

    60
   /  \
  50  40
 /  \
20  30

2. 삭제 연산

힙에서 삭제는 보통 루트 노드(최솟값 또는 최댓값)를 제거하는 연산입니다. 루트 노드를 제거한 후, 마지막 노드를 루트로 이동시키고 힙 속성을 유지하도록 재구성합니다.

예시: 최소 힙에서 삭제

초기 상태:

    10
   /  \
  20  30
 /  \
40  50

 

1. 루트 노드(10) 제거: 마지막 노드(50)를 루트로 이동.

   50
  /  \
 20  30
 /
40

 

2. 힙 속성 복구: 루트(50) > 자식 노드(20), 두 노드의 값을 교환.

   20
  /  \
 50  30
 /
40

 

3. 힙 속성 확인 반복: 루트(50) > 자식 노드(40), 두 노드의 값을 교환.

   20
  /  \
 40  30
 /
50
예시: 최대 힙에서 삭제

초기 상태:

    60
   /  \
  50  40
 /  \
20  30

 

1. 루트 노드(60) 제거: 마지막 노드(30)를 루트로 이동.

   30
  /  \
 50  40
 /
20

 

2. 힙 속성 복구: 루트(30) < 자식 노드(50), 두 노드의 값을 교환.

   50
  /  \
 30  40
 /
20

 

3. 힙 속성 확인 반복: 추가 재구성 불필요.


힙 트리의 장점과 단점

장점:

  • 삽입 및 삭제가 O(log n)의 시간 복잡도를 가짐.
  • 우선순위 큐를 효율적으로 구현 가능.

단점:

  • 중간 검색이나 특정 값의 삭제는 비효율적(O(n)).
  • 배열 기반 구현 시 동적 크기 조정이 필요할 수 있음.

마무리

힙은 특정 조건을 만족하는 완전 이진 트리로, 효율적인 삽입, 삭제 연산이 가능하여 다양한 알고리즘과 데이터 구조에서 활용됩니다. 최소 힙과 최대 힙의 동작 방식을 이해하면, 우선순위 큐 구현과 힙 정렬과 같은 응용 문제를 효율적으로 해결할 수 있습니다.

뭔가 쓰는 중…

반응형

'개발 부트캠프 > SW공학' 카테고리의 다른 글

[자료구조] AVL 트리  (0) 2025.01.17
[자료구조] 이진 탐색 트리  (0) 2025.01.17
[자료구조] Tree  (0) 2025.01.17
[시스템 아키텍처] HA 실습  (0) 2024.11.26
반응형

AVL 트리란?

AVL 트리는 1962년 G. M. Adelson-Velsky와 E. M. Landis에 의해 개발된 이진 탐색 트리(Binary Search Tree, BST)의 한 유형으로, 트리의 균형을 유지하는 것이 특징입니다. AVL 트리는 균형 조건을 만족하여 삽입, 삭제 등의 연산이 항상 O(log n)의 시간 복잡도를 보장합니다.


AVL 트리의 특징

  1. 균형 조건 (Balance Factor):
    • 각 노드의 왼쪽 서브트리 높이와 오른쪽 서브트리 높이의 차이가 1 이하인 트리입니다.
    • 이를 균형 인수(Balance Factor)라고 합니다.
  2. 높이 제한:
    • AVL 트리는 삽입과 삭제 시 균형 조건을 유지하므로, 가장 높은 경우에도 트리의 높이가 O(log n)에 제한됩니다.
  3. 회전(Rotation) 연산:
    • 균형이 깨진 경우 트리를 재조정하기 위해 회전 연산을 수행합니다.
    • 회전은 단순 회전(Single Rotation)과 이중 회전(Double Rotation)으로 나뉩니다.

AVL 트리의 주요 동작

1. 삽입 연산

AVL 트리에 새로운 값을 삽입하면 균형 인수가 −1, 0, 1 중 하나가 되어야 합니다. 만약 균형이 깨진다면, 회전을 통해 균형을 복구합니다.

삽입 후 회전의 유형
1. LL 회전 (Left-Left):
  • 불균형이 왼쪽 자식의 왼쪽 서브트리에 발생한 경우.
  • 오른쪽으로 단순 회전.

예시: 삽입 순서: 50, 40, 30

  1. 50 삽입: 루트 노드.
  2. 40 삽입: 40 < 50, 50의 왼쪽 자식으로 삽입.
  3. 30 삽입: 30 < 40 < 50, 40의 왼쪽 자식으로 삽입.
  4. 결과: LL 회전 수행.

회전 전 트리:

    50
   /
  40
 /
30

 

회전 후 트리:

  40
 / \
30 50

 

 2. RR 회전 (Right-Right):

  • 불균형이 오른쪽 자식의 오른쪽 서브트리에 발생한 경우.
  • 왼쪽으로 단순 회전.

예시: 삽입 순서: 30, 40, 50

  1. 30 삽입: 루트 노드.
  2. 40 삽입: 40 > 30, 30의 오른쪽 자식으로 삽입.
  3. 50 삽입: 50 > 40 > 30, 40의 오른쪽 자식으로 삽입.
  4. 결과: RR 회전 수행.

회전 전 트리:

30
 \
  40
   \
    50

 

회전 후 트리:

  40
 / \
30 50

 

3. LR 회전 (Left-Right):

  • 불균형이 왼쪽 자식의 오른쪽 서브트리에 발생한 경우.
  • 왼쪽 자식에 대해 왼쪽 회전 후, 부모 노드에 대해 오른쪽 회전.

예시: 삽입 순서: 50, 30, 40

  1. 50 삽입: 루트 노드.
  2. 30 삽입: 30 < 50, 50의 왼쪽 자식으로 삽입.
  3. 40 삽입: 40 > 30, 30의 오른쪽 자식으로 삽입.
  4. 결과: LR 회전 수행.

회전 전 트리:

   50
  /
 30
  \
   40

 

중간 단계: 30의 서브트리에서 왼쪽 회전.

   50
   /
  40
 /
30

 

최종 결과: 50에서 오른쪽 회전.

  40
 / \
30 50

 

4. RL 회전 (Right-Left):

  • 불균형이 오른쪽 자식의 왼쪽 서브트리에 발생한 경우.
  • 오른쪽 자식에 대해 오른쪽 회전 후, 부모 노드에 대해 왼쪽 회전.

예시: 삽입 순서: 30, 50, 40

  1. 30 삽입: 루트 노드.
  2. 50 삽입: 50 > 30, 30의 오른쪽 자식으로 삽입.
  3. 40 삽입: 40 < 50, 50의 왼쪽 자식으로 삽입.
  4. 결과: RL 회전 수행.

회전 전 트리:

30
 \
 50
 /
40

 

중간 단계: 50의 서브트리에서 오른쪽 회전.

30
  \
  40
    \
    50

 

최종 결과: 30에서 왼쪽 회전.

  40
 / \
30 50


2. 삭제 연산

AVL 트리에서 값을 삭제하면 균형 조건이 깨질 수 있으며, 이를 복구하기 위해 적절한 회전이 필요합니다.

예시
  • 삭제 순서: 50 (기존 트리는 위 삽입 예시와 동일)
  1. 50 삭제: 40의 오른쪽 자식을 제거.
  2. 결과: 균형 유지, 추가 조치 불필요.

복잡한 경우에는 회전을 통해 균형을 복구합니다.


AVL 트리의 장점과 단점

장점:

  • 항상 균형을 유지하여 최악의 경우에도 O(log n)의 시간 복잡도를 보장.
  • 이진 탐색 트리보다 검색, 삽입, 삭제 연산이 빠름.

단점:

  • 삽입 및 삭제 시 균형을 유지하기 위한 회전 연산으로 추가적인 계산 비용 발생.
  • 구현이 일반적인 이진 탐색 트리에 비해 복잡.

마무리

AVL 트리는 균형 이진 탐색 트리의 대표적인 구현체로, 검색, 삽입, 삭제 모두 안정적으로 수행할 수 있는 데이터 구조입니다. 그러나 균형 유지에 드는 비용과 구현의 복잡성을 고려하여 실제 사용 시 적합한 경우에 선택해야 합니다.

 

반응형

'개발 부트캠프 > SW공학' 카테고리의 다른 글

[자료구조] Heap 트리  (0) 2025.01.17
[자료구조] 이진 탐색 트리  (0) 2025.01.17
[자료구조] Tree  (0) 2025.01.17
[시스템 아키텍처] HA 실습  (0) 2024.11.26
반응형

이진 탐색 트리 (Binary Search Tree)란?

이진 탐색 트리(Binary Search Tree, 이하 BST)는 각 노드가 최대 두 개의 자식 노드를 가지는 이진 트리(Binary Tree)의 일종으로, 특정 조건을 만족하는 트리 구조입니다. 이 조건 덕분에 BST는 데이터 검색, 삽입, 삭제 등의 연산을 효율적으로 수행할 수 있습니다.


BST의 특징

  1. 노드의 구조:
    • 각 노드는 키(key)와 데이터를 포함하며, 두 개의 자식 노드를 가질 수 있습니다. (왼쪽 자식 노드와 오른쪽 자식 노드)
  2. 값의 정렬 조건:
    • 왼쪽 서브트리의 모든 노드 값은 부모 노드 값보다 작습니다.
    • 오른쪽 서브트리의 모든 노드 값은 부모 노드 값보다 큽니다.
    • 이 규칙은 모든 노드에 대해 재귀적으로 적용됩니다.
  3. 중복값 허용 여부:
    • 대부분의 구현에서는 중복 값을 허용하지 않지만, 중복 값을 허용하는 변형도 존재합니다.
  4. 탐색 효율성:
    • 평균적으로 탐색, 삽입, 삭제 연산이 O(log n)의 시간 복잡도를 가지지만, 트리가 균형을 이루지 못하면 최악의 경우 O(n)이 될 수 있습니다.

BST의 동작 원리

BST의 주요 연산은 탐색, 삽입, 삭제로 나눌 수 있으며, 각 연산은 재귀적 또는 반복적으로 수행됩니다. 아래에서는 숫자를 이용해 각 연산의 과정을 구체적으로 설명하겠습니다.

1. 삽입 연산

새로운 값을 삽입할 때는 BST의 조건을 유지하며 노드를 추가합니다.

  • 예시: 50, 30, 70, 20, 40, 60, 80 순서로 삽입
  1. 50 삽입: 트리가 비어 있으므로 루트 노드로 설정.
  2. 30 삽입: 30 < 50, 왼쪽 자식 노드로 삽입.
  3. 70 삽입: 70 > 50, 오른쪽 자식 노드로 삽입.
  4. 20 삽입: 20 < 50 (왼쪽으로 이동), 20 < 30, 30의 왼쪽 자식 노드로 삽입.
  5. 40 삽입: 40 < 50 (왼쪽으로 이동), 40 > 30, 30의 오른쪽 자식 노드로 삽입.
  6. 60 삽입: 60 > 50 (오른쪽으로 이동), 60 < 70, 70의 왼쪽 자식 노드로 삽입.
  7. 80 삽입: 80 > 50 (오른쪽으로 이동), 80 > 70, 70의 오른쪽 자식 노드로 삽입.

결과 트리 구조:

     50
    / \
   30 70
  / \ / \
20 40 60 80

2. 탐색 연산

특정 값을 찾기 위해 트리를 탐색합니다. 현재 노드의 값과 찾고자 하는 값을 비교하며 이동합니다.

  • 예시: 40을 탐색
  1. 루트(50)에서 시작. 40 < 50, 왼쪽으로 이동.
  2. 30에서 탐색. 40 > 30, 오른쪽으로 이동.
  3. 40에서 탐색 종료. 값을 찾음.

3. 삭제 연산

노드를 삭제할 때도 BST의 조건을 유지해야 하며, 삭제할 노드의 자식 노드 수에 따라 세 가지 경우로 나뉩니다:

  1. 자식이 없는 노드 삭제: 단순히 노드를 제거.
    • 예: 20 삭제
  2. 자식이 하나인 노드 삭제: 부모 노드가 삭제할 노드의 자식을 대신 참조하도록 함.
    • 예: 40 삭제 (40의 부모인 30이 40의 자식 노드를 참조)
  3. 자식이 두 개인 노드 삭제: 삭제할 노드의 오른쪽 서브트리에서 가장 작은 값을 가진 노드(또는 왼쪽 서브트리에서 가장 큰 값)를 찾아 교체.
    • 예: 50 삭제
      • 오른쪽 서브트리(70, 60, 80)에서 가장 작은 값인 60으로 교체.
      • 60을 삭제한 후 트리를 정리.

결과 트리 구조:

 
60
/ \
30 70
/ \
20 80

BST의 장점과 단점

장점:

  • 데이터 탐색, 삽입, 삭제가 평균적으로 빠름(O(log n)).
  • 데이터가 정렬된 상태로 저장되어 있어 순회(traversal)를 통해 정렬 데이터를 쉽게 얻을 수 있음.

단점:

  • 트리가 편향될 경우(예: 삽입 순서가 정렬된 데이터일 경우), 시간 복잡도가 O(n)으로 감소.
  • 균형을 유지하기 위한 추가적인 로직(Red-Black Tree, AVL Tree 등)이 필요할 수 있음.

마무리

이진 탐색 트리는 데이터를 효율적으로 관리하고 검색하는 데 유용한 자료구조입니다. 그러나 성능을 유지하기 위해 트리의 균형을 고려해야 하며, 경우에 따라 AVL 트리나 레드-블랙 트리와 같은 균형 트리를 사용하는 것이 더 적합할 수 있습니다. BST를 올바르게 이해하고 사용하면 다양한 문제를 효과적으로 해결할 수 있습니다.

뭔가 쓰는 중…

반응형

'개발 부트캠프 > SW공학' 카테고리의 다른 글

[자료구조] Heap 트리  (0) 2025.01.17
[자료구조] AVL 트리  (0) 2025.01.17
[자료구조] Tree  (0) 2025.01.17
[시스템 아키텍처] HA 실습  (0) 2024.11.26
반응형

자료구조에서의 트리 (Tree)란?

트리(Tree)는 계층적(hierarchical) 데이터 구조로, 노드(Node)와 이를 연결하는 간선(Edge)으로 구성됩니다. 트리는 하나의 루트 노드(Root Node)를 중심으로 계층적으로 연결되며, 각 노드는 0개 이상의 자식 노드를 가질 수 있습니다. 트리는 그래프의 한 종류이지만, 사이클(Cycle)이 없는 비순환 그래프(Acyclic Graph)라는 특징이 있습니다.


트리의 주요 용어

  1. 루트 노드 (Root Node): 트리의 최상단에 있는 노드로, 부모가 없습니다.
  2. 자식 노드 (Child Node): 특정 노드의 하위에 연결된 노드입니다.
  3. 부모 노드 (Parent Node): 특정 노드를 직접 연결하는 상위 노드입니다.
  4. 리프 노드 (Leaf Node): 자식 노드가 없는 노드입니다.
  5. 레벨 (Level): 트리에서 루트 노드로부터의 거리입니다.
  6. 깊이 (Depth): 트리에서 루트 노드에서 특정 노드까지의 경로 길이입니다.
  7. 높이 (Height): 트리의 최대 레벨입니다.
  8. 차수 (Degree): 각 노드가 가진 자식 노드의 개수입니다.

트리의 종류

  1. 이진 트리 (Binary Tree):
    • 각 노드가 최대 두 개의 자식 노드를 가질 수 있는 트리입니다.
    • 종류: 포화 이진 트리, 완전 이진 트리, 균형 이진 트리 등.
  2. 이진 탐색 트리 (Binary Search Tree, BST):
    • 왼쪽 서브트리에는 루트보다 작은 값, 오른쪽 서브트리에는 루트보다 큰 값을 저장하는 이진 트리입니다.
    • 빠른 검색, 삽입, 삭제가 가능합니다.
  3. 균형 이진 트리 (Balanced Binary Tree):
    • AVL 트리, 레드-블랙 트리 등, 트리의 높이를 최소화하여 연산 효율을 높인 트리입니다.
  4. N진 트리 (N-ary Tree):
    • 각 노드가 최대 N개의 자식을 가질 수 있는 트리입니다.
  5. 힙 (Heap):
    • 완전 이진 트리의 일종으로, 루트 노드가 항상 최댓값(최대 힙) 또는 최솟값(최소 힙)을 유지합니다.
  6. 트라이 (Trie):
    • 문자열이나 접두사를 효율적으로 저장하고 검색하기 위한 트리입니다.
  7. 스팬 트리 (Spanning Tree):
    • 그래프에서 모든 정점을 포함하는 최소 연결 부분 그래프입니다.
  8. B-트리 및 B+트리:
    • 데이터베이스에서 사용되는 균형 트리로, 노드에 여러 값을 저장하여 디스크 I/O를 최소화합니다.

트리의 주요 특징

  1. 계층 구조: 데이터가 부모-자식 관계로 계층적으로 조직됩니다.
  2. 사이클 없음: 트리는 비순환 구조이므로 한 노드에서 시작하여 다시 자기 자신으로 돌아올 수 없습니다.
  3. 재귀적 구조: 트리는 재귀적으로 정의되며, 서브트리(subtree)가 독립된 트리 구조를 형성합니다.
  4. 효율적 탐색: 이진 탐색 트리와 같은 트리는 데이터 검색과 삽입, 삭제를 효율적으로 수행할 수 있습니다.

트리의 사용 사례

  1. 데이터 계층 표현:
    • 파일 시스템: 디렉토리와 파일 간의 계층적 구조를 표현.
    • 조직도: 회사의 계층 구조를 표현.
  2. 효율적인 탐색 및 정렬:
    • 이진 탐색 트리: 데이터베이스, 검색 엔진.
    • 힙: 우선순위 큐 구현.
  3. 네트워크 구조:
    • 라우팅 테이블: 네트워크 경로 탐색.
    • 트라이: DNS 조회, 문자열 자동 완성.
  4. 데이터 압축:
    • 허프만 트리(Huffman Tree): 데이터 압축 알고리즘에서 사용.
  5. 문자열 처리:
    • 트라이: 사전 검색, 접두사 기반 검색.
  6. 데이터베이스:
    • B-트리, B+트리: 데이터 저장 및 검색 최적화.

결론

트리는 자료 구조 중에서도 계층적 관계를 표현하거나 데이터 탐색을 효율화할 때 매우 유용한 구조입니다. 다양한 종류의 트리가 존재하며, 각 종류는 특정 문제를 해결하기 위한 특징과 용도를 가지고 있습니다. 문제의 성격에 따라 적합한 트리를 선택하여 사용하면 성능과 효율성을 극대화할 수 있습니다.

뭔가 쓰는 중…

반응형

'개발 부트캠프 > SW공학' 카테고리의 다른 글

[자료구조] Heap 트리  (0) 2025.01.17
[자료구조] AVL 트리  (0) 2025.01.17
[자료구조] 이진 탐색 트리  (0) 2025.01.17
[시스템 아키텍처] HA 실습  (0) 2024.11.26
반응형

HA(High Availability, 고가용성)

메인 서버가 돌아가지 않아도 다른 서버로 돌아가야한다. (서버 이중화)

HAProxy를 활용한 웹 서버 이중화실습

이 글은 실습 과정을 통해 HAProxy 기반의 로드 밸런싱을 다룹니다. 모든 민감한 정보는 변수 이름으로 대체되었습니다.


0W. 가상 머신 생성

HA 서버 1개와 Web 서버 2개를 구성할 가상 머신 3대를 생성합니다.

1. HA 서버 HAProxy 이중화 구성

1.1 관리자 로그인

sudo su - root

1.2 네트워크 설정

vi /etc/netplan/00-installer-config.yaml

다음 내용을 추가합니다.

network:
  renderer: networkd
  ethernets:
    <NETWORK_INTERFACE>:  # 네트워크 인터페이스 이름으로 대체
      addresses:
        - <IP_ADDRESS>/24  # HAProxy 서버 IP 주소
      nameservers:
        addresses: [8.8.8.8]
      routes:
        - to: default
          via: <GATEWAY_IP>  # 게이트웨이 IP 주소
  version: 2

1.3 설정 적용

netplan apply

1.4 패키지 업데이트

apt update

1.5 HAProxy 설치

apt install haproxy

1.6 HAProxy 설정

vi /etc/haproxy/haproxy.cfg

파일 맨 아래에 아래 내용을 추가합니다.

관리 페이지 설정:

listen stats
    bind *:<STATS_PORT>  # HAProxy 통계 페이지 포트 (예: 9000)
    mode http
    option dontlog-normal
    stats enable
    stats realm Haproxy\ Statistics
    stats uri /stats

로드 밸런싱 설정:

frontend webserver
  bind *:<HTTP_PORT>  # HTTP 포트 (예: 80)
  mode http
  default_backend nginx-server
  
backend nginx-server
  mode http
  balance roundrobin
  option httpchk GET /
  server nginx1 <WEB_SERVER_1_IP>:<HTTP_PORT> check
  server nginx2 <WEB_SERVER_2_IP>:<HTTP_PORT> check

1.7 설정 적용 및 실행 확인

systemctl restart haproxy systemctl status haproxy netstat -anlp | grep :<STATS\_PORT>

웹 브라우저에서 http://<HA_PROXY_IP>:<STATS_PORT>/stats로 접속하여 통계를 확인합니다.

 

1.8 web서버의 nginx에 example.html 파일 생성

cd /var/www/html
touch example.html
vi example.html

각 web서버 example.html파일의 내용은 다르게 작성합니다.

 

웹 브라우저에서 http://<HA_PROXY_IP>:<HTTP_PORT>/example.html로 접속하고 새로 고침을 누르며 내용을 통해 두개의 WEB 서버에 번갈아가며 접속되는지 확인합니다.

반응형

'개발 부트캠프 > SW공학' 카테고리의 다른 글

[자료구조] Heap 트리  (0) 2025.01.17
[자료구조] AVL 트리  (0) 2025.01.17
[자료구조] 이진 탐색 트리  (0) 2025.01.17
[자료구조] Tree  (0) 2025.01.17

+ Recent posts