개발로 자기계발
article thumbnail
728x90

큐(Queues)

- 자료의 입력과 출력이 각각 한쪽 끝에서 이루어지는 자료 구조 = 'FIFO(First-In-First-Out) 구조'

- 대표적인 선형 자료구조로, 삽입(insert)과 삭제(delete)를 수행

- 큐는 보통 배열(array)이나 연결 리스트(linked list)로 구현

- 큐에 데이터를 삽입하는 것을 '인큐(Enqueue)'

- 큐에서 데이터를 꺼내는 것을 '디큐(Dequeue)'

- 선입선출

* 스택은 후입선출

 

1) 큐의 연산
- Enqueue(item) : 큐의 끝(rear)에 item을 추가 O(1)

- Dequeue() : 큐의 첫(front) 항목을 반환(큐에서 제거 O) O(n)
- isEmpty() : 큐가 비어 있는지 검사 O(1)

- peek() : 큐의 첫(front) 항목을 반환(큐에서 제거 X) O(1)

- size(): 현재 큐에 들어 있는 데이터 원소의 수를 검사 O(1)

* 추가

- isFull(): 큐에 데이터가 꽉 채워져 있는지 검사

 

환형 큐(Circular Queues)

- 일반적인 큐와는 달리 마지막 항목 다음에 첫 번째 항목이 연결된 형태로 원형으로 구성된 큐

- 선형 구조의 문제점을 보완하고, 메모리 공간을 더 효율적으로 사용

- 대규모 데이터의 처리나, 시간 제약이 있는 작업에서 많이 사용

- 큐가 가득 차면 어떻게 되는지? => 더이상 원소를 넣을 수 없음(큐 길이 파악 필요)

출처 - https://reakwon.tistory.com/30

- 데이터 제거는 Front, 데이터 추가는 Rear

 

우선순위 큐(Priority Queues)

- 데이터들이 우선순위를 가지고 있으며, 이러한 우선순위에 따라 큐에서 제거되는 자료구조

- 구현간의 방식

  1. 큐에 원소를 넣을 때 (enqueue 할 때) 우선순위 순서대로 정렬해 두는 방법 - 더 유리하다.
  2. 큐에서 원소를 꺼낼 때 (dequeue 할 때) 우선순위가 가장 높은 것을 선택하는 방법

- 2가지의 구조

  1. 선형 배열 이용
  2. 연결 리스트 이용 - 더 유리하다

트리(Trees)

- 노드(node)와 노드 사이를 연결하는 간선(edge)으로 구성된 자료 구조

출처 - https://galid1.tistory.com/174

- 노드의 차수(Degree) = 자식(서브트리)의 수

ex) A:degree:3 / B:degree,2 / F:degree:2 / J, K:degree:0

- 루트(root node), 내부 노드(internal nodes), 리프 노드, 단말 노드(leaf nodes)

 

이진트리(Binary Tree)

- 모든 노드의 차수가 2 이하인 트리

- 즉, 모든 노드는 자식이 없거나, 하나가 있거나, 둘 있는 경우에만 해당

 

1) 이진트리 연산

- 삽입(Insertion): 새로운 노드를 트리에 추가
- 삭제(Deletion): 트리에서 노드를 삭제
- 검색(Search): 특정한 값을 가진 노드를 찾기
- 순회(Traversal): 트리의 모든 노드를 특정한 순서로 방문

 

2) 이진트리의 순회(Traversal)

- 깊이 우선 순회(depth first traversal)

* 중위 순회(in-order traversal)

순회 순서: Left -> Root -> Right

* 전위 순회(pre-order traversal)

순회 순서: Root -> Left -> Right

* 후위 순회(post-order traversal)

순회 순서: Left -> Right -> Root

 

- 넓이 우선 순회(breadth first traversal)

* 레벨이 낮은 노드를 우선으로 순회

* 같은 레벨의 노드들 사이에는 부모 노드의 방문 순서에 따라 방문하고 왼쪽을 오른쪽보다 먼저 순회

 

 

포화 이진트리(Full Binary Tree)

- 모든 노드가 2개의 자식 노드를 가지며, 모든 리프 노드(차수가 0인 노드)들이 같은 레벨에 위치하는 이진트리를 의미

- 높이가 k이고 노드의 개수가 2^k-1인 이진트리

 

완전 이진트리(Complete Binary Tree)

- 모든 레벨에서 노드들이 왼쪽에서 오른쪽으로 순서대로 채워진 이진트리

- 즉, 마지막 레벨을 제외한 모든 노드들은 채워져 있고, 마지막 레벨에서는 노드들이 왼쪽에서 오른쪽으로 채워져 있다.

 

1) 번호 규칙

노드 번호 m을 기준으로

- 왼쪽 자식의 번호: 2 * m

- 오른쪽 자식의 번호: 2 * m + 1

- 부모 노드의 번호: m//2

 

이진 탐색 트리(Binary Search Trees)

- 탐색을 빠르게 수행하기 위해 만들어진 자료구조

- 왼쪽 서브트리에 있는 모든 노드들의 값은 루트 노드의 값보다 작다.
- 오른쪽 서브트리에 있는 모든 노드들의 값은 루트 노드의 값보다 크다.

 

1) 이진 탐색 트리가 효율적이지 못한 경우는?

- 입력 순서에 따라 트리가 한쪽으로 치우쳐져서 깊이가 매우 깊어진 경우

- 일정한 패턴을 가지는 입력으로 인해 트리가 완전히 균형을 잃어버린 경우

- 이러한 경우 탐색, 삽입, 삭제 등의 연산에서 최악의 경우 시간 복잡도가 O(n)이 될 수 있다.

개선하기 위한 트리종류)

- AVL 트리, 레드-블랙 트리 등의 균형 잡힌 트리(Balanced Tree)를 사용

- 노드를 삽입, 삭제할 때마다 트리를 재조정하여 효율적인 탐색, 삽입, 삭제 연산을 보장한다.

 

2) 노드들의 관계 정리

- Root 노드 (루트 노드): 이진 탐색 트리의 가장 상위에 있는 노드로, 트리의 시작점
루트 노드는 부모 노드가 없다.


- Parent 노드 (부모 노드): 트리에서 다른 노드와 연결된 노드
각 노드는 최대 하나의 부모 노드를 가질 수 있다.


- Child 노드 (자식 노드): 부모 노드와 연결된 노드
각 노드는 최대 두 개의 자식 노드를 가질 수 있다. (왼쪽 자식 노드와 오른쪽 자식 노드).


- Left Child 노드 (왼쪽 자식 노드): 부모 노드보다 작은 키 값을 가진 노드
각 노드는 최대 하나의 왼쪽 자식 노드를 가질 수 있다.


- Right Child 노드 (오른쪽 자식 노드): 부모 노드보다 큰 키 값을 가진 노드
각 노드는 최대 하나의 오른쪽 자식 노드를 가질 수 있다.


힙(Heap)

- 완전 이진트리(Complete Binary Tree)의 일종으로, 부모 노드와 자식 노드 간의 대소 관계가 항상 일정한 규칙을 가지는 자료구조

- 보통 최대 힙(max heap)과 최소 힙(min heap) 두 가지 종류가 있다.

 

1) 이진 탐색 트리와 비교

구분 원소들은 완전히 크기 순 정렬인지? 특정 키 값을 가지는 원소를 빠르게 검색되는지? 부가의 제약 조건은?
이진 탐색 트리 O O X
느슨하게 정렬 힘듬 완전 이진 트리여야만 함

 

2) 종류 분석

- 일반적으로 최댓값 또는 최솟값을 빠르게 찾기 위한 자료구조로 사용된다.

- 최댓값을 빠르게 찾기 위한 경우에는 최대 힙(max heap)

- 최솟값을 빠르게 찾기 위한 경우에는 최소 힙(min heap)

- 최대 힙은 부모 노드가 자식 노드보다 크거나 같은 완전 이진트리(Complete Binary Tree)

- 최소 힙은 부모 노드가 자식 노드보다 작거나 같은 완전 이진트리

- 힙은 대개 배열(Array)을 기반으로 구현되며, 이진 힙(binary heap)이 가장 일반적인 형태

 

3) 연산

- 삽입: 제일 마지막의 노드 뒤에 삽입 후 부모와 대소 관계를 비교해서 위치를 변경한다.

- 삭제: 제일 마지막의 노드와 루트 노드와 위치를 변경 후 마지막 노드를 삭제 후 자식과 대소 관계를 비교해서 위치를 변경한다.

 

4) 응용

- 우선 순위 큐

Enqueue 할 때 "느슨한 정렬"을 이루고 있도록 한다: O(logn)

Dequeue 할 때 최댓값을 순서대로 추출: O(logn)

 

- 힙 정렬

정렬되지 않은 원소들을 아무 순서로나 최대 힙에 삽입: O(logn)

삽입이 끝나면, 힙이 비게 될 때까지 하나씩 삭제: O(logn)

 


어려웠던 점

- 이진 탐색 트리에서 노드들의 관계

- 환형 큐의 데이터 제거

728x90
SMALL

'Develop > 기초지식' 카테고리의 다른 글

OrderedDict 사용해보기  (0) 2023.04.26
좋은 코드 란?  (0) 2023.04.20
자료구조 & 알고리즘 - 2  (0) 2023.04.11
자료구조 & 알고리즘 - 1  (0) 2023.04.10
코딩 테스트 특강 간단 정리  (0) 2023.04.10
profile

개발로 자기계발

@김잠봉

틀린부분이나 조언이 있다면 언제든 환영입니다:-)