본문 바로가기

카테고리 없음

[스터디 3일차] Heap, Stack&Queue, Tree

1. Heap                                                                  

1) heap의 정의

-  각 노드의 키값이 자식의 키값보다 작지 않거나(최대힙) 그 자식의 키값보다 크지 않은(최소힙) 완전이진트리

 

2) Heap의 장점

- Heap에서 최대/최소값을 찾을 때 O(log N) 만큼 걸림 ( 배열에서의 O(N)보다 짧음)

 

3) Heap의 종류

- 최대 힙(Max Heap) : 부모노드 키값 > 자식노드 키값

- 최소 힙(Min Heap) : 부모노드 키값 < 자식노드 키 값 

 

4) Heap 구현

- 배열로 구성하며, 1번 인덱스부터 사용함

- 부모 노드 인덱스 번호 = 자식 노드 인덱스 번호 / 2

- 왼쪽 자식 노드 인덱스 번호 = 부모 노드 인덱스 번호 * 2

- 오른쪽 자식 노드 인덱스 번호 = 부모 노드 인덱스 번호 * 2 + 1

 

2. Stack & Queue                                                                     

1) Stack의 개념

-  한 쪽 끝에서만 자료를 넣고 뺄 수 있는 LIFO (Last In First Out) 형식의 자료 구조

 

2) Stack과 배열의 차이

- 배열과 달리 스택은 상수 시간에 i번째 접근이 불가

- 스택은 배열과 달리 데이터 추가/삭제 연산을 상수시간에 가능

- 데이터를 탐색하기보다 앞 단의 데이터만 넣고 빼고 하는 과정이 빈번하게 일어나는 경우, 스택 자료 구조가 효율적

 

3) Stack의 사용 사례

 - 함수의 호출

: 메모리의 stack영역에는 함수의 호출과 관계되는 지역변수들이 저장되며, 함수의 호출이 완료되면 소멸함

스택 영역에 차례대로 저장되는 함수의 호출 정보를 스택 프레임이라고 하며, 스택프레임이 있기에 함수 호출이 끝난 후 해당 함수가 호출되기 이전 상태로 돌아갈 수 있음

- 재귀 알고리즘

: 자기 자신을 다시 호출하는 함수. 자기 자신을 계속 스택에 넣으면서 종료 조건에 도달하면 스택에서 제거하는 방식과 유사

- 후위 표기법

: 연산자가 피연산자 뒤에 위치하는 방식 ex) AB + CD + *

 

4) Queue의 개념

- 한 쪽 끝에서만 자료를 넣고 뺄 수 있는 FIFO (First In First Out) 형식의 자료 구조

 

5) Queue의 사용 사례

- 너비 우선 탐색 

: 루트 노트 (혹은 임의의 노드)에서 시작해서 인접한 노드를 먼저 탐색하는 방법이며 큐를 사용하여 구현함

- 스케줄링 큐 

: 여러 프로세스가 번갈아가며 수행되는 과정에서, 프로세스들이 순서를 대기하는 공간을 스케줄링 큐라 함

  • Job Queue: 하드디스크에 있는 프로그램이 실행되기 위해 메인 메모리의 할당 순서를 기다리는 큐
  • Ready Queue: CPU 점유 순서를 기다리는 큐
  • Devide Queue: I/O 장치를 기다리는 큐

- 페이지 교체 알고리즘 중 FIFO

: First In First Out 알고리즘, 메모리에 올라온 지 가장 오래된 페이지를 교체하는 방식이며 각 페이지가 올라온 순서를 큐에 저장하는 방식을 사용함

 

3. Tree                                                                                           

1) Tree의 특징

- 스택이나 큐와 달리 비선형 자료구조이자, 계층적 관계(Hierarchical Relationship)을 표현하는 자료구조

- 사이클이 존재하지 않음(그래프와 차이)

- 루트에서 한 노드로 가는 경로는 유일

- N개의 노드와 N-1개의 간선이 존재

 

2) Binary Tree 

- 루트 노드를 중심으로 두 개의 서브 트리로 나뉘어지며, 각 서브 트리 또한 이진트리

- Perfect Binary Tree(포화 이진 트리) : 모든 레벨이 꽉 찬 트리

- Complete Binary Tree(완전 이진 트리) : 위 -> 아래, 왼 ->오 순서대로 채워진 이진트리

- Full Binary Tree (정 이진 트리): 모든 노드가 0개 또는 2개의 자식 노드를 갖는 이진트리

 

3) Binary Search Tree 

- 이진 탐색과 연결 리스트를 합한 이진 트리

- 이진 탐색의 탐색 소요 시간 O(log N) 장점과, 연결 리스트의 삽입삭제 시간 O(1)의 장점을 모두 가짐

-> 즉, 효율적인 탐색 능력을 가지고, 자료의 삽입 및 삭제가 가능한 자료구조

- 데이터 저장 규칙

1.이진 탐색 트리의 노드에 저장된 키는 유일하다
2.부모의 키가 왼쪽 자식 노드의 키보다 크다
3.부모의 키가 오른쪽 자식 노드의 키보다 작다
4.왼쪽과 오른쪽 서브트리도 이진 탐색 트리이다

- 단점 : 편향 트리( 노드가 한쪽으로 치우친 트리)가 되어 탐색 시간 복잡도가 O(N)이 될 수 있다.

해당 단점을 보완하기 위해 트리의 균형을 맞춰주는 Rebalancing(재조정)이 필요하며, 그러한 기법을 이용한 트리에는 Red Black Tree AVL Tree가 있음

 

4) Red Black Tree

- BST를 기반으로 한 자료구조로, 데이터의 탐색, 삽입, 삭제 연산이 전부 O(log n)

- 만족 규칙

  • 모든 노드는 Black 또는 Red의 색을 갖는다
  • 루트 노드의 색은 Black이다
  • 단말 노드의 색은 Black이다
  • 어떤 노드의 색이 Red라면 다른 두 개의 자식의 색은 Black이다
  • 각 노드에 대해서 노드로부터 descendant leaves 까지의 단순 경로는 전부 같은 수의 Black 노드를 포함하고 있다 이때, 해당 Black 노드의 수를 Black Height라고 부른다