조각들

1. Array, ArrayList, Linked List

 

Array는 사이즈 수정이 안 된다. 그런데 ArrayList는 사이즈 수정이 된다.

둘 다 index를 활용하기 때문에 검색하는 상황에 유용하게 쓰인다.

 

하지만 삽입, 삭제를 할 때 앞 뒤 요소를 다 앞으로 땡기거나 뒤로 미는 작업이 이루어지기 때문에 cost가 크다.

 

검색이 주가되고 수정이 드물 때, 사이즈 수정 여부를 고려해서 Array 또는 ArrayList를 사용하면 좋다.

 

LinkedList는 node라는 개념을 활용한다.

index라는 개념이 없고 삽입, 삭제를 할 때 그냥 link를 끊고 새로 연결만 하면 되기 때문에 Array, ArrayList보다 cost가 적다. 검색을 할 때는 순차적으로 하기 때문에 시간이 오래 걸려서 비효율적이다.

 

→ 검색을 덜 하고 수정이 잦은 data를 관리할 때 LinkedList를 사용하면 좋다.

 

[참고한 포스팅]

 

 


 

2. Stack and Queue, 우선순위 큐

 

스택

후입선출이다.

push(), pop(), peek(), empty(), search() 메서드가 있다.

 

자바에서 기본으로 제공하는 Stack 클래스를 써도 되고 직접 만들어서 써도 된다.

배열로 스택을 구현할 수 있고, Linked List로도 구현할 수도 있다.

 

참고로 자바의 Stack 클래스는 Linked List로 구현된 클래스이다.

 

[참고한 포스팅]

 

 

선입선출이다.

 

스택처럼 자바에서 제공되는 게 있다. 하지만 클래스가 아닌 인터페이스로 제공된다는 차이가 있다.

이 또한 배열 또는 Linked List를 써서 직접 만들어 써도 된다.

 

enqueue는 data가 큐에 들어가는 것을 의미한다.

dequeue는 data가 큐에서 나오는 것을 의미한다.

 

  • queuelsEmpty() : 큐 안이 비었는지 판단하는 함수
  • queueIsFull() : 배열의 최대크기를 벗어나면 안되기에 큐에 더이상 들어갈 공간이 없는지 판단하는 함수
  • size() : queue에 현재 들어가 있는 데이터의 개수를 return하는 함수
  • push(int value) : 큐 안에 데이터를 집어넣는 함수
  • peek() : 큐 안의 데이터들중 가장 먼저 나오는 데이터를 return 하는 함수
  • pop() : 큐 안의 데이터들 중 가장 먼저 나올수 있는 데이터를 return 하고 삭제하는 함수

 

[참고한 포스팅]

 

 

우선순위 큐

 

선입선출이나 후입선출처럼 시간 개념에 따라 순번이 갈리는 게 아닌,

사용자가 부여한 기준에 따라 우선 순위가 정해지고 그 우선순위대로 data를 빼내는 구조이다.

 

[참고한 포스팅]

 


3. Tree

  • Binary Tree (이진트리)

각 노드가 최대 2개의 자식 노드를 갖는 걸 말한다.

 

  • Full Binary Tree (전이진트리)

모든 노드가 0개 또는 2개의 자식 노드를 갖는 걸 말한다.

 

  • Complete Binary Tree (완전이진트리)

노드가 왼쪽에서 오른쪽 순으로 채워진다.

leaf node를 제외한 나머지는 다 차있다.

 

  • BST (Binary Search Tree) (이진탐색트리)

부모 노드가 왼쪽 자식 노드보다 크다.

오른쪽 자식 노드가 부모 노드보다 크다.

이진탐색트리에서 노드에 저장된 값은 유일하다.

 

[참고한 포스팅]


 

4. Binary Heap (= Heap)

최대 힙, 최소 힙 2종류로 나뉘는 완전이진트리의 일종이다.

 

[참고한 포스팅]

 


5. Red Black Tree

 

[자료구조] 레드-블랙 트리(Red-Black Tree)란? | 레드-블랙 트리 쉽게 이해하기

레드-블랙 트리(Red-Black Tree) 레드-블랙 트리는 자가 균형 이진 탐색 트리이다. 레드-블랙 트리는 다음과 같은 조건들을 만족한다. 1. 모든 노드는 빨간색 혹은 검은색이다. 2. 루트 노드는 검은색

code-lab1.tistory.com

 

트리가 너무 한 쪽으로 쏠리는 걸 방지하기 위해 나온 트리이다.

특별히 생각할 게 없다. 그냥 규칙을 받아들이고 적용만 하면 된다.

 

 

전체적인 틀을 잡는 규칙은 아래와 같다.

 

1. 새로 삽입하는 노드는 빨간색.

2. 빨간색은 연속으로 2번 나올 수 없음. (검은색은 가능하단 얘기)

3. root node는 검은색

4. leaf 노드까지 가는 모든 경로에서의 검은색 node 갯수는 같다.

 

 

상황에 따라 아래와 같은 세부 규칙이 2개 더 존재한다.

 

1. recolor

2. restructure

 

삼촌 노드가 새로 삽입된 노드와 같이 빨간색이면 recolor, 검은색이면 restructure로 진행하는 것이다.

 

 

restructure

 

restructure는 새로 삽입된 N, 부모인 P, 조상인 G 노드를 오름차순으로 정렬하고 중간값을 G로 하여

완전이진트리 규칙에 맞게 작은 게 왼쪽, 큰 게 오른쪽으로 가게 배치한다.

이때 원래 딸려있는 게 있으면 set로 같이 움직인다.

 

배치를 마친 후 기본규칙을 다시 적용한다.

가령 root node가 빨간색이면 검정색으로 바꿔준다.

 

 

recolor

 

P,G,U 노드의 색을 다 뒤집는다. 이러면 끝이다.

그런데 이렇게 뒤집어 줬을 때 double red 이슈가 생기면 추가 작업이 생긴다.

이것도 별 건 없다. double red 이슈가 생긴 node를 기준으로 해서 또 P,G,U를 다 뒤집어주고 root를 검정색으로 맞춰주면 된다.

 

'CS > 스터디' 카테고리의 다른 글

cs 스터디 6주차  (0) 2022.11.22
cs 스터디 5주차  (0) 2022.11.15
cs 스터디 4주차  (1) 2022.11.13
cs 스터디 (3주차)  (0) 2022.11.01
cs 스터디 (2주차)  (0) 2022.10.21