Skip to content

Commit e948d04

Browse files
committed
feat : 자료구조(Queue&Stack, Hashtable&BST) 예상질문 정리
1 parent 05ae137 commit e948d04

File tree

1 file changed

+240
-0
lines changed

1 file changed

+240
-0
lines changed

data_structure/data_structure_yeji.md

Lines changed: 240 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,240 @@
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

Comments
 (0)