|
| 1 | +# Queue & Stack |
| 2 | + |
| 3 | +### 1. Queue는 무슨 자료구조 인가요? |
| 4 | + |
| 5 | +<details> |
| 6 | +<summary>답변</summary> |
| 7 | +<div markdown="1"> |
| 8 | + |
| 9 | +``` |
| 10 | +Queue는 선입선출(FIFO) 형태의 자료구조입니다. 삽입,삭제시 O(1)의 시간복잡도를 가집니다. |
| 11 | +활용 예시는 Cache구현, 프로세스 관리, 너비우선탐색(BFS) 등이있습니다. |
| 12 | +``` |
| 13 | +</div> |
| 14 | +</details> |
| 15 | + |
| 16 | + |
| 17 | +### 2. Stack은 무슨 자료구조 인가요? |
| 18 | + |
| 19 | +<details> |
| 20 | +<summary>답변</summary> |
| 21 | +<div markdown="1"> |
| 22 | + |
| 23 | +``` |
| 24 | +Stack은 후입선출(LIFO) 형태의 자료구조입니다. 삽입,삭제시 O(1)의 시간복잡도를 가집니다. |
| 25 | +활용 예시는 후위 표기법 연산, 괄호 유효성 검사, 웹 브라우저 방문기록(뒤로 가기), 깊이우선탐색(DFS) 등이 있습니다. |
| 26 | +``` |
| 27 | + |
| 28 | +</div> |
| 29 | +</details> |
| 30 | + |
| 31 | +### 3. Stack두개를 이용해서 Queue를 구현해보세요. |
| 32 | + |
| 33 | +<details> |
| 34 | +<summary>답변</summary> |
| 35 | +<div markdown="1"> |
| 36 | +example/data_structure/Queue.java |
| 37 | +</div> |
| 38 | +</details> |
| 39 | + |
| 40 | + |
| 41 | +### 4. Queue두개를 이용해 Stack을 구현해보세요. |
| 42 | + |
| 43 | +<details> |
| 44 | +<summary>답변</summary> |
| 45 | +<div markdown="1"> |
| 46 | +example/data_structure/Stack.java |
| 47 | +</div> |
| 48 | +</details> |
| 49 | + |
| 50 | +### 5. Queue와 PriorityQueue를 비교하여 설명해주세요. |
| 51 | + |
| 52 | +<details> |
| 53 | +<summary>답변</summary> |
| 54 | +<div markdown="1"> |
| 55 | + |
| 56 | +``` |
| 57 | +Queue는 시간 순서상 먼저 들어간 데이터가 먼저 나오는 선입선출형 자료구조입니다. |
| 58 | +반면 PriorityQueue는 시간 순서에 상관없이 우선순위가 높은 데이터가 먼저 나오는 우선순위 자료구조입니다. |
| 59 | +Queue의 삽입,삭제 시간복잡도는 O(1)이고, PriorityQueue는 삽입시 내부적으로 우선순위에 따라 정렬하므로 O(logN), |
| 60 | +삭제시에도 삭제 후 우선순위 정렬을 하므로 O(logN)의 시간복잡도가 걸립니다. |
| 61 | +``` |
| 62 | + |
| 63 | +</div> |
| 64 | +</details> |
| 65 | + |
| 66 | + |
| 67 | +# Hashtable & BST(Binary Search Tree) |
| 68 | + |
| 69 | +### <img src="https://img.icons8.com/doodle/48/null/blossom-powerpuff-girls.png" width="25" height="25" style="padding: 0;margin-bottom:-5px;" /> 1. Hashtable은 무슨 자료구조인가요? |
| 70 | + |
| 71 | +<details> |
| 72 | +<summary>답변</summary> |
| 73 | +<div markdown="1"> |
| 74 | + |
| 75 | +``` |
| 76 | +hash table은 효율적인 탐색(빠른 탐색)을 위한 자료구조로써 key-value쌍의 데이터를 입력받습니다. |
| 77 | +hash function h에 key값을 입력으로 넣어 얻은 해시값 h(k)를 위치로 지정하여 key- value 데이터 쌍을 저장합니다. |
| 78 | +저장, 삭제, 검색의 시간복잡도는 모두 O(1)입니다. |
| 79 | +``` |
| 80 | + |
| 81 | +</div> |
| 82 | +</details> |
| 83 | + |
| 84 | +<details> |
| 85 | +<summary>꼬꼬무</summary> |
| 86 | +<div markdown="1"> |
| 87 | + |
| 88 | +Q. <img src="https://img.icons8.com/doodle/48/null/blossom-powerpuff-girls.png" width="25" height="25" style="padding: 0;margin-bottom:-5px;" /> Hashtable 과 HashMap의 차이점은 뭔가요? |
| 89 | + |
| 90 | +- [자바 HashMap은 어떻게 동작하는가?](https://d2.naver.com/helloworld/831311) |
| 91 | + |
| 92 | +``` |
| 93 | +
|
| 94 | +크게 4가지의 차이점이 있습니다. |
| 95 | +첫번째로, Thread-safe의 여부입니다. Hashtable은 Thread-safe하고 HashMap은 Thread-safe하지 않습니다. 그렇기에 |
| 96 | +멀티스레드 환경이 아니라면 HashMap을 쓰는 것이 좋습니다. |
| 97 | +두번째로, Null값의 허용 여부입니다. HashMap은 key에 null을 허용하지만 Hashtable은 key에 null을 허용하지 않습니다. |
| 98 | +세번째로, Enumeration의 여부입니다. Hashtable은 not fail-fast Enumeration을 제공하지만, HashMap은 Enumeration을 제공하지 않습니다. |
| 99 | +마지막으로 HashMap은 보조해시를 사용하기 때문에 보조 해시 함수를 사용하지 않는 Hashtable에 비하여 해시 충돌(hash collision)이 덜 발생할 수 있어 상대적으로 성능상 이점이 있습니다. |
| 100 | +
|
| 101 | +``` |
| 102 | + |
| 103 | +</div> |
| 104 | +</details> |
| 105 | + |
| 106 | + |
| 107 | +### 2. BST(Binary Search Tree)는 무슨 자료구조인가요? |
| 108 | + |
| 109 | +<details> |
| 110 | +<summary>답변</summary> |
| 111 | +<div markdown="1"> |
| 112 | + |
| 113 | +``` |
| 114 | +이진탐색트리는 정렬된 tree입니다. |
| 115 | +어느 node를 선택하든 해당 node의 left subtree에는 그 node의 값보다 작은 값들을 지닌 node들로만 이루어져 있고, |
| 116 | +node의 right subtree에는 그 node의 값보다 큰 값들을 지닌 node들로만 이루어져 있는 binary tree입니다. |
| 117 | +검색과 저장, 삭제의 시간복잡도는 모두 O(logN)이고, worst case는 한쪽으로 치우친 tree가 됐을 때 O(n)입니다. |
| 118 | +``` |
| 119 | + |
| 120 | +</div> |
| 121 | +</details> |
| 122 | + |
| 123 | +<details> |
| 124 | +<summary>꼬꼬무</summary> |
| 125 | +<div markdown="1"> |
| 126 | + |
| 127 | +Q. 이진 트리는 어떤 자료구조인가요? |
| 128 | + |
| 129 | +``` |
| 130 | +이진트리는 모든 node의 child node의 갯수가 2 이하인 트리를 이진트리 라고합니다. |
| 131 | +``` |
| 132 | + |
| 133 | +Q. BST는 worst case 시간복잡도가 O(n)입니다. 어떨때 발생하나요? |
| 134 | + |
| 135 | +``` |
| 136 | +균형이 많이 깨져서 한 쪽으로 치우친 BST의 경우에 worst case가 됩니다. |
| 137 | +이렇게 되면 Linked list와 다를게 없어집니다. 따라서 탐색시에 $O(logn)$이 아니라 $O(n)$이 됩니다. |
| 138 | +``` |
| 139 | + |
| 140 | +Q. worst case O(n)의 해결방법에는 무엇이 있나요? |
| 141 | + |
| 142 | +``` |
| 143 | +자가 균형 이진 탐색 트리(Self-Balancing BST)는 알고리즘으로 이진 트리의 균형이 잘 맞도록 유지하여 높이를 가능한 낮게 유지합니다. |
| 144 | +대표적으로 AVL트리와 Red-black tree가 있습니다. JAVA에서는 hashmap의 seperate chaning으로써 Linked list와 Red-black tree를 병행하여 저장합니다. |
| 145 | +``` |
| 146 | + |
| 147 | +</div> |
| 148 | +</details> |
| 149 | + |
| 150 | +### 3. Hashtable에서 collision이 발생하면 어떻게 되나요? |
| 151 | + |
| 152 | +<details> |
| 153 | +<summary>답변</summary> |
| 154 | +<div markdown="1"> |
| 155 | + |
| 156 | +``` |
| 157 | +collision이 발생할 경우 대표적인 2가지 해결방법이 있습니다. |
| 158 | +첫번째로 open addressing 방식이 있습니다. open addressing 방식은 collision이 발생하면 미리 정한 규칙에 따라 Hashtable의 비어있는 slot을 찾습니다. |
| 159 | +빈 slot을 찾는 방법은 크게 linear Porbing, Quadratic Probing, Double Hasing으로 나뉩니다. |
| 160 | +두번째로 seperate chaining 방식이 있습니다. 이 방식은 Linkedlist를 이용합니다. 만약에 collision이 발생하면 Linkedlist에 slot을 추가해 데이터를 저장합니다. |
| 161 | +
|
| 162 | +``` |
| 163 | + |
| 164 | +</div> |
| 165 | +</details> |
| 166 | + |
| 167 | + |
| 168 | +<details> |
| 169 | +<summary>부연설명</summary> |
| 170 | +<div markdown="1"> |
| 171 | + |
| 172 | +### Open Addressing |
| 173 | + |
| 174 | +``` |
| 175 | +open addressing 방식은 collision이 발생하면 미리 정한 규칙에 따라 hashtable의 비어있는 slot을 찾습니다. 추가적인 메모리를 사용하지 않으므로 |
| 176 | +linkedlist 또는 tree자료구조를 통해 추가로 메모리를 할당하는 seperate chaining방식에 비해 메모리를 적게 사용합니다. |
| 177 | +openAddressing은 빈 slot을 찾는 방법에 따라 크게 Linear Probing, Quadratic Probing, Double Hashing으로 나뉩니다. |
| 178 | +``` |
| 179 | + |
| 180 | +- Linear Probing(선형조사법) & Quadratic Probing(이차 조사법) |
| 181 | + |
| 182 | +``` |
| 183 | +선형 조사법은 충돌이 발생한 해시값으로 부터 일정한 값만큼(+1, +2, +3, ...) 건너 뛰어, 비어 있는 slot에 데이터를 저장합니다. |
| 184 | +이차 조사법은 제곱수 (+1², +2², +3², ...)로 건너 뛰어, 비어 있는 slot을 찾습니다. |
| 185 | +
|
| 186 | +충돌이 여러번 발생하면 여러번 건너 뛰어 빈 slot을 찾습니다. 선형조사법과 이차조사법의 경우 충돌 횟수가 많아지면 특정 영역에 데이터가 |
| 187 | +집중적으로 몰리는 클러스터링(clustering)현상이 발생하는 단점이 있습니다. 클러스터링 현상이 발생하면, 평균 탐색 시간이 증가하게 됩니다. |
| 188 | +``` |
| 189 | + |
| 190 | +- Double Hashing (이중해시, 중복해시) |
| 191 | + |
| 192 | +``` |
| 193 | +이중 해싱은 open addressing 방식을 통해 충돌(collision)을 해결할 때, 조사(Probing)하는 방식중에 하나입니다. linear probing이나 quadratic probing을 통해 |
| 194 | +탐사할 때는 탐사이동폭이 같기 때문에 클러스터링 문제가 발생할 수 있습니다. 클러스터링 문제가 발생하지 않도록 2개의 해시함수를 사용하는 방식을 이중해싱이라고 합니다. |
| 195 | +하나는 최초의 해시값을 얻을 때 사용하고 또 다른 하나는 해시 충돌이 발생할 때 탐사 이동폭을 얻기 위해 사용합니다. |
| 196 | +``` |
| 197 | + |
| 198 | +- 해싱 |
| 199 | + |
| 200 | +``` |
| 201 | +key와 인덱스를 매핑하는 방법 |
| 202 | +``` |
| 203 | + |
| 204 | +### Seperate Chaining |
| 205 | + |
| 206 | +``` |
| 207 | +Seperate Chaining방식은 LinkedList(또는 Tree)를 이용하여 충돌(collision)을 해결합니다. 충돌이 발생하면 LinkedList에 노드(slot)을 추가하여 데이터에 저장합니다. |
| 208 | +
|
| 209 | +삽입 : 서로 다른 두 key가 같은 해시 값을 갖게 되면 LinkedList에 두 node를 추가하여 (key,value) 데이터 쌍을 저장합니다. 삽입의 시간복잡도는 O(1)입니다. |
| 210 | +검색 : 기본적으로 O(1)의 시간복잡도 이지만 최악의 경우 O(n)의 시간복잡도를 갖습니다. |
| 211 | +삭제 : 삭제를 하기 위해선 검색을 먼저 해야하므로 검색의 시간복잡도와 동일합니다. 기본적으로 O(1)이지만 최악의 경우 O(n)의 시간복잡도를 갖습니다. |
| 212 | +
|
| 213 | +worst case의 경우 n개의 모든 key가 동일한 해시값을 갖게되면 길이 n의 LinkedList가 생성되게 됩니다. 이때, 시간복잡도가 O(n)이 됩니다. |
| 214 | +``` |
| 215 | + |
| 216 | +</div> |
| 217 | +</details> |
| 218 | + |
| 219 | + |
| 220 | +<details> |
| 221 | +<summary>꼬꼬무</summary> |
| 222 | +<div markdown="1"> |
| 223 | + |
| 224 | +Q. worst case의 시간복잡도는 O(n)인데 어떤 상황에 발생하나요? |
| 225 | + |
| 226 | +``` |
| 227 | +n개의 모든 key가 동일한 해시값을 갖게 되면 길이 n의 Linkedlist가 생성되게 됩니다. |
| 228 | +이 때, 특정 key를 찾기 위해서는 길이 n의 Linkedlist를 검색하는 O(n)의 시간복잡도와 동일하게 됩니다. |
| 229 | +``` |
| 230 | + |
| 231 | +Q. 이중해싱(Double Hashing)이 무엇인지 설명해주세요. |
| 232 | + |
| 233 | +``` |
| 234 | +이중해싱은 open addressing 방식을 통해 충돌(collision)을 해결할 때, 조사(porbing)하는 방식 중에 하나입니다. |
| 235 | +linear probing이나 quadratic probing을 통해 탐사할 때는 탐사이동폭이 같기 때문에 클러스터링 문제가 발생할 수 있습니다. |
| 236 | +클러스터링 문제가 발생하지 않도록 2개의 해시함수를 사용하는 방식을 이중 해싱이라고 합니다. 하나는 최초의 해시값을 얻을 때 사용하고 또 다른 하나는 해시 충돌이 발생할 때 탐사 이동폭을 얻기 위해 사용합니다. |
| 237 | +``` |
| 238 | + |
| 239 | +</div> |
| 240 | +</details> |
0 commit comments