1# Hash Table Project (ํด์ ํ
์ด๋ธ ํ๋ก์ ํธ)
2
3๋ค์ํ ํด์ ํจ์์ ์ถฉ๋ ํด๊ฒฐ ๊ธฐ๋ฒ์ ๊ตฌํํ ํด์ ํ
์ด๋ธ ํ๋ก์ ํธ์
๋๋ค.
4
5## ํ์ผ ๊ตฌ์ฑ
6
7### 1. hash_functions.c
8๋ค์ํ ํด์ ํจ์์ ๋น๊ต ๋ฐ ๋ถ์ ๋๊ตฌ
9
10**๊ตฌํ๋ ํด์ ํจ์:**
11- `hash_simple` - ๋จ์ ํฉ์ฐ (์ถฉ๋ ๋ง์, ๋์ ์)
12- `hash_djb2` - Daniel J. Bernstein (์ถ์ฒ)
13- `hash_sdbm` - sdbm ๋ฐ์ดํฐ๋ฒ ์ด์ค ํด์
14- `hash_fnv1a` - Fowler-Noll-Vo 1a
15
16**๊ธฐ๋ฅ:**
17- ํด์ ๊ฐ ๋น๊ต ์ถ๋ ฅ
18- ์ถฉ๋ ํ์ ๋ฐ ์ถฉ๋๋ฅ ๋ถ์
19- ๋ถํฌ ๊ท ์ผ์ฑ ๋ถ์ (๋ถ์ฐ ๊ณ์ฐ)
20- ํด์ ๋ถํฌ ์๊ฐํ
21
22### 2. hash_chaining.c
23์ฒด์ด๋(Separate Chaining)์ ์ด์ฉํ ํด์ ํ
์ด๋ธ ๊ตฌํ
24
25**ํน์ง:**
26- ์ถฉ๋ ์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ก ์ ์ฅ
27- ํ
์ด๋ธ ํฌ๊ธฐ ์ ํ ์์
28- ์ฝ์
/์ญ์ ๊ฐ๋จ
29
30**๊ตฌํ ๊ธฐ๋ฅ:**
31- `ht_create()` - ํด์ ํ
์ด๋ธ ์์ฑ
32- `ht_set()` - ์ฝ์
/์์
33- `ht_get()` - ๊ฒ์
34- `ht_delete()` - ์ญ์
35- `ht_print()` - ํ
์ด๋ธ ์ถ๋ ฅ
36- `ht_get_statistics()` - ํต๊ณ ์์ง
37- ์ฒด์ธ ๊ธธ์ด ๋ถํฌ ์๊ฐํ
38
39### 3. hash_linear_probing.c
40์ ํ ํ์ฌ(Linear Probing)๋ฅผ ์ด์ฉํ ์คํ ์ด๋๋ ์ฑ ํด์ ํ
์ด๋ธ
41
42**ํน์ง:**
43- ์ถฉ๋ ์ ๋ค์ ๋น ์ฌ๋กฏ ํ์
44- ์บ์ ํจ์จ ์ข์
45- DELETED ์ํ๋ก ์ญ์ ์ฒ๋ฆฌ
46
47**๊ตฌํ ๊ธฐ๋ฅ:**
48- ์ธ ๊ฐ์ง ์ฌ๋กฏ ์ํ (EMPTY, OCCUPIED, DELETED)
49- ์ ํ ํ์ฌ ์๊ณ ๋ฆฌ์ฆ
50- ํด๋ฌ์คํฐ๋ง ๋ถ์
51- ๋ก๋ ํฉํฐ๋ณ ์ฑ๋ฅ ๋น๊ต
52- ํด๋ฌ์คํฐ ์๊ฐํ
53
54### 4. dictionary.c
55ํด์ ํ
์ด๋ธ์ ํ์ฉํ ์ค์ฉ์ ์ธ ์ฌ์ ํ๋ก๊ทธ๋จ
56
57**์ฃผ์ ๊ธฐ๋ฅ:**
58- ๋จ์ด ์ถ๊ฐ/๊ฒ์/์ญ์
59- ์ ์ฒด ๋ชฉ๋ก ์ถ๋ ฅ
60- ํ์ผ ์ ์ฅ/๋ถ๋ฌ์ค๊ธฐ (dictionary.txt)
61- ๊ฒ์ ์ ์ (๋ถ๋ถ ์ผ์น)
62- ๊ฒ์ ํต๊ณ ๋ฐ ์ธ๊ธฐ ๋จ์ด Top 10
63- ๋์๋ฌธ์ ๊ตฌ๋ถ ์๋ ๊ฒ์
64
65**๋ฐ์ดํฐ ๊ตฌ์กฐ:**
66- ์ฒด์ด๋ ๋ฐฉ์
67- ํ
์ด๋ธ ํฌ๊ธฐ: 1000
68- ๊ฒ์ ํ์ ์ถ์
69
70## ์ปดํ์ผ ๋ฐ ์คํ
71
72### ๊ฐ๋ณ ์ปดํ์ผ
73```bash
74gcc -Wall -Wextra -std=c11 -o hash_functions hash_functions.c
75gcc -Wall -Wextra -std=c11 -o hash_chaining hash_chaining.c
76gcc -Wall -Wextra -std=c11 -o hash_linear_probing hash_linear_probing.c
77gcc -Wall -Wextra -std=c11 -o dictionary dictionary.c
78```
79
80### Makefile ์ฌ์ฉ
81```bash
82make # ๋ชจ๋ ํ๋ก๊ทธ๋จ ์ปดํ์ผ
83make hash_functions # ํน์ ํ๋ก๊ทธ๋จ๋ง ์ปดํ์ผ
84make clean # ์์ฑ๋ ํ์ผ ์ญ์
85make run_dict # ์ฌ์ ํ๋ก๊ทธ๋จ ์คํ
86```
87
88### ์คํ
89```bash
90./hash_functions # ํด์ ํจ์ ๋น๊ต
91./hash_chaining # ์ฒด์ด๋ ํ
์คํธ
92./hash_linear_probing # ์ ํ ํ์ฌ ํ
์คํธ
93./dictionary # ์ฌ์ ํ๋ก๊ทธ๋จ
94```
95
96## ํ์ต ํฌ์ธํธ
97
98### ํด์ ํจ์ ์ ํ
99- **djb2**: ์ผ๋ฐ์ ์ธ ์ฉ๋, ๊ท ํ์๋ ์ฑ๋ฅ
100- **FNV-1a**: ๋น ๋ฅธ ์๋ ํ์ ์
101- **sdbm**: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฉ๋
102- **Simple์ ์ฌ์ฉํ์ง ๋ง ๊ฒ** (์ถฉ๋๋ฅ ๋์)
103
104### ์ถฉ๋ ํด๊ฒฐ ๋ฐฉ๋ฒ ๋น๊ต
105
106| ๋น๊ต ํญ๋ชฉ | ์ฒด์ด๋ | ์คํ ์ด๋๋ ์ฑ |
107|-----------|--------|---------------|
108| ๋ฉ๋ชจ๋ฆฌ | ๋์ ํ ๋น | ๊ณ ์ ํฌ๊ธฐ |
109| ์ญ์ | ๊ฐ๋จ | DELETED ํ์ ํ์ |
110| ์บ์ ํจ์จ | ๋ถ๋ฆฌ | ์ ๋ฆฌ |
111| ๋ก๋ ํฉํฐ | >1 ๊ฐ๋ฅ | <1 ํ์ |
112| ๊ตฌํ ๋ณต์ก๋ | ๋ฎ์ | ์ค๊ฐ |
113
114### ์๊ฐ ๋ณต์ก๋
115
116| ์ฐ์ฐ | ํ๊ท | ์ต์
|
117|------|------|------|
118| ์ฝ์
| O(1) | O(n) |
119| ๊ฒ์ | O(1) | O(n) |
120| ์ญ์ | O(1) | O(n) |
121
122### ์ฑ๋ฅ ์ต์ ํ ํ
1231. ๋ก๋ ํฉํฐ 0.7 ์ดํ ์ ์ง
1242. ์ข์ ํด์ ํจ์ ์ ํ (djb2 ์ถ์ฒ)
1253. ํ
์ด๋ธ ํฌ๊ธฐ๋ ์์(prime number) ์ฌ์ฉ ๊ถ์ฅ
1264. ์ฒด์ด๋ vs ์คํ ์ด๋๋ ์ฑ ์ ํ์ ์ฉ๋์ ๋ฐ๋ผ
127
128## ์์ ์ถ๋ ฅ
129
130### hash_functions ์คํ ๊ฒฐ๊ณผ
131```
132=== ํด์ ํจ์ ๋น๊ต ===
133
134Key | Simple | djb2 | sdbm | fnv1a
135-------------|--------|------|------|------
136apple | 30 | 43 | 58 | 67
137banana | 9 | 42 | 49 | 52
138
139=== ์ถฉ๋ ๋ถ์ ===
140Simple | 14 | 28.0%
141djb2 | 6 | 12.0% โ ์ต์ ์ถฉ๋
142```
143
144### dictionary ์ฌ์ฉ ์
145```
146์ ํ: 1
147๋จ์ด: programming
148๋ป: ํ๋ก๊ทธ๋๋ฐ; ์ปดํจํฐ์ ๋ช
๋ น์ ์์ฑํ๋ ์์
149โ 'programming' ์ถ๊ฐ๋จ
150
151์ ํ: 2
152๊ฒ์ํ ๋จ์ด: prog
153'prog'๋ก ์์ํ๋ ๋จ์ด:
154 - programming
155์ด 1๊ฐ ๋ฐ๊ฒฌ
156```
157
158## ํ์ฅ ์์ด๋์ด
159
1601. **๋์ ํฌ๊ธฐ ์กฐ์ **: ๋ก๋ ํฉํฐ๊ฐ 0.7 ์ด๊ณผ ์ ํ
์ด๋ธ ํฌ๊ธฐ 2๋ฐฐ ํ์ฅ
1612. **์ด์ค ํด์ฑ**: ๋ ๋ฒ์งธ ํด์ ํจ์๋ก ํ์ฌ ๊ฐ๊ฒฉ ๊ฒฐ์
1623. **์ฌ์ ๊ธฐ๋ฅ ์ถ๊ฐ**:
163 - ๋จ์ด ์๋ฌธ
164 - ๋ฐ์ ๊ธฐํธ
165 - ๋์์ด/๋ฐ์์ด
1664. **์ฑ๋ฅ ์ธก์ **: ๊ฐ ์ฐ์ฐ์ ์ค์ ์ํ ์๊ฐ ์ธก์
1675. **๋ฉํฐ์ค๋ ๋**: ์ฝ๊ธฐ ๋์์ฑ ์ง์
168
169## ์ฐธ๊ณ ์๋ฃ
170
171- ํด์ ํจ์: [djb2, sdbm, FNV-1a ์๊ณ ๋ฆฌ์ฆ](http://www.cse.yorku.ca/~oz/hash.html)
172- ์ถฉ๋ ํด๊ฒฐ: Cormen et al., "Introduction to Algorithms"
173- ์ค์ ํ์ฉ: Python `dict`, Java `HashMap`, C++ `unordered_map`