[Data_Structer] Hash Table
Hash table & BST(Binary Search Tree)
โญโญBST
[ํต์ฌ]
์ด์งํ์ํธ๋ฆฌ(Binary Search Tree; BST)๋ ์ ๋ ฌ๋ tree.
์ด๋ node๋ฅผ ์ ํํ๋ ํด๋น node์ left subtree์๋ ๊ทธ node์ ๊ฐ๋ณด๋ค ์์ ๊ฐ๋ค์ ์ง๋ node๋ค๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๊ณ , node์ right subtree์๋ ๊ทธ node์ ๊ฐ๋ณด๋ค ํฐ ๊ฐ๋ค์ ์ง๋ node๋ค๋ก๋ง ์ด๋ฃจ์ด์ ธ ์๋ binary tree
๊ฒ์๊ณผ ์ ์ฅ, ์ญ์ ์ ์๊ฐ๋ณต์ก๋๋ ๋ชจ๋ O(logn)์ด๊ณ , worst case๋ ํ์ชฝ์ผ๋ก ์น์ฐ์น tree๊ฐ ๋์ ๋ O(n)
[ ๐ฏย TIP]
๐ก BST๋ ์ ์ฅ๊ณผ ๋์์ ์ ๋ ฌ์ ํ๋ ์๋ฃ๊ตฌ์กฐ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ์ผ์ ํ ๊ท์น์ ๋ฐ๋ผ ์ ์ฅ.
BST
BST ์กฐ๊ฑด
- root node์ ๊ฐ๋ณด๋ค ์์ ๊ฐ์ left subtree์, ํฐ ๊ฐ์ right subtree์ ์๋ค.
- subtree๋ 1๋ฒ ์กฐ๊ฑด์ ๋ง์กฑํ๋ค.(Recursive)
search
O(logn)
โญโญ Hash table
hash table์ ํจ์จ์ ์ธ ํ์(๋น ๋ฅธ ํ์)์ ์ํ ์๋ฃ๊ตฌ์กฐ๋ก์จ key-value์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ. hash function $h$์ key๊ฐ์ ์ ๋ ฅ์ผ๋ก ๋ฃ์ด ์ป์ ํด์๊ฐ h(k)๋ฅผ ์์น๋ก ์ง์ ํ์ฌ key- value ๋ฐ์ดํฐ ์์ ์ ์ฅ. ์ ์ฅ, ์ญ์ , ๊ฒ์์ ์๊ฐ๋ณต์ก๋๋ ๋ชจ๋ O(1)
[ ๐ฏย TIP]
์ข์ hash function์ ์กฐ๊ฑด.
์ข์ hash function์ ํต์ฌ์ ์ธ ์กฐ๊ฑด์ ํด์๊ฐ์ด ๊ณ ๋ฅด๊ฒ ๋ถํฌ๋๊ฒ ํ๋ ๊ฒ
Direct-address Table
Direct-address Table(์ง์ ์ฃผ์ํ ํ ์ด๋ธ)์ด๋, key ๊ฐ์ผ๋ก k๋ฅผ ๊ฐ๋ ์์๋ index k์ ์ ์ฅํ๋ ๋ฐฉ์
key: ์ถ์๋ฒํธ, value: ์ด๋ฆ
(3, ๋
ธ์ ํธ)
(5, ๋ฐฐ์ค์)
(6, ์ ์ฌํ)
(7, ๋จ์์ฑ)
์ง์ ์ฃผ์ํ ๋ฐฉ๋ฒ์ผ๋ก ํตํด key-value ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ ํ๋ฉด ๋ง์ ๋ฌธ์ ๊ฐ ๋ฐ์
- ๋ถํ์ํ ๊ณต๊ฐ ๋ญ๋น
key: ํ๋ฒ, value: ์ด๋ฆ
(2022390, ๋
ธ์ ํธ)
(2022392, ๋ฐฐ์ค์)
(2022393, ์ ์ฌํ)
(2022401, ๋จ์์ฑ)
- key๊ฐ ๋ค์ํ ์๋ฃํ์ ๋ด์ ์ ์๊ฒ ๋จ
key: ID, value: ์ด๋ฆ
(nossi8128, ๋
ธ์ ํธ)
(js9876, ๋ฐฐ์ค์)
(zebra001, ์ ์ฌํ)
(nam1234, ๋จ์์ฑ)
Hash table
(key, value) ๋ฐ์ดํฐ ์์ ์ ์ฅํ๊ธฐ ์ํ ๋ฐฉ๋ฒ.
hash table์ hash function h๋ฅผ ์ด์ฉํด์ (key, value)๋ฅผ index: h(k)์ ์ ์ฅ.
์ด ๋, โํค k๊ฐ์ ๊ฐ๋ ์์๊ฐ ์์น h(k)์ hash๋๋ค.โ ๋๋ โh(k)๋ ํค k์ ํด์๊ฐ์ด๋คโ๋ผ๊ณ ํํ. key๋ ๋ฌด์กฐ๊ฑด ์กด์ฌํด์ผ ํ๋ฉฐ, ์ค๋ณต๋๋ key๊ฐ ์์ด์๋ ์๋๋ค.
ํํธ, hash table์ ๊ตฌ์ฑํ๊ณ ์๋, (key, value)๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ ๊ฐ๊ฐ์ ๊ณต๊ฐ์ slot ๋๋ bucket์ด๋ผ ํ๋ค.
Collision
collision์ด๋ ์๋ก ๋ค๋ฅธ key์ ํด์๊ฐ์ด ๋๊ฐ์ ๋๋ฅผ ๋งํ๋ค.
์ฆ, ์ค๋ณต๋๋ key๋ ์์ง๋ง ํด์๊ฐ์ ์ค๋ณต๋ ์ ์๋๋ฐ ์ด ๋ collision์ด ๋ฐ์ํ๋ค๊ณ ํ๋ค.
๋ฐ๋ผ์ collision์ด ์ต๋ํ ์ ๊ฒ ๋๋๋ก hash function์ ์ ์ค๊ณํด์ผํ๊ณ , ์ด์ฉ ์ ์์ด collision์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ seperate chaining ๋๋ open addressing๋ฑ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ํด๊ฒฐํด์ผ ํ๋ค.
์๊ฐ๋ณต์ก๋์ ๊ณต๊ฐํจ์จ
์๊ฐ๋ณต์ก๋๋ ์ ์ฅ, ์ญ์ , ๊ฒ์ ๋ชจ๋ ๊ธฐ๋ณธ์ ์ผ๋ก O(1)์ด์ง๋ง, collision์ผ๋ก ์ธํ์ฌ ์ต์ ์ ๊ฒฝ์ฐ O(n)์ด ๋ ์ ์๋ค.
๊ณต๊ฐํจ์จ์ฑ์ ๋จ์ด์ง๋ค. ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ ์ฅ๊ณต๊ฐ(slot, bucket)์ ํ๋ณดํด์ผ ํ๊ธฐ ๋๋ฌธ.
๋ฐ๋ผ์ ์ ์ฅ๊ณต๊ฐ์ด ๋ถ์กฑํ๊ฑฐ๋ ์ฑ์์ง์ง ์์ ๋ถ๋ถ์ด ๋ง์ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์ ์๋ค.
โญโญโญโญ Hash table์์ collision์ด ๋ฐ์ํ ๋ ํด๊ฒฐ๋ฐฉ๋ฒ
[ํต์ฌ ๋ต๋ณ]
collision์ด ๋ฐ์ํ ๊ฒฝ์ฐ ๋ํ์ ์ผ๋ก 2๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐ
์ฒซ ๋ฒ์งธ, open addressing ๋ฐฉ์์ collision์ด ๋ฐ์ํ๋ฉด ๋ฏธ๋ฆฌ ์ ํ ๊ท์น์ ๋ฐ๋ผ hash table์ ๋น์ด์๋ slot์ ์ฐพ๋๋ค.
๋น slot์ ์ฐพ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ํฌ๊ฒ Linear Probing, Quadratic Probing, Double Hashing์ผ๋ก ๋๋๋ค.
๋ ๋ฒ์งธ, separete chaining ๋ฐฉ์์ linked list๋ฅผ ์ด์ฉํ๋ค. ๋ง์ฝ์ collision์ด ๋ฐ์ํ๋ฉด linked list์ ๋ ธ๋(slot)๋ฅผ ์ถ๊ฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
๐ก hashtable์์ collision์ด ๋ฐ์ํ์ ๋, seperate chaining๊ณผ open addressing ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ํด๊ฒฐ์ ํ๋ค.
๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์ด๋ค ๋ฉ์ปค๋์ฆ์ผ๋ก ์๋ํ๋์ง, ์ด๋ค ์ฐจ์ด์ ์ด ์๋์ง ์ดํด
๋ํ seperate chaining์ ๊ฒฝ์ฐ worst case์ ์๊ฐ๋ณต์ก๋์ ๋ํด์ ์ค๋ช ํ ์ค ์์์ผ ํ๋ค.
์ฝ์ ๊ณผ ๊ฒ์, ์ญ์ ์ ์๊ฐ๋ณต์ก๋๋ O(1)์ด์ง๋ง, worst case์ ๊ฒฝ์ฐ์ O(n)๊ฐ ๋ ์ ์๋ค.
Open addressing
open addressing ๋ฐฉ์์ collision์ด ๋ฐ์ํ๋ฉด ๋ฏธ๋ฆฌ ์ ํ ๊ท์น์ ๋ฐ๋ผ hash table์ ๋น์ด์๋ slot์ ์ฐพ๋๋ค.
์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก linked list ๋๋ tree์๋ฃ๊ตฌ์กฐ๋ฅผ ํตํด ์ถ๊ฐ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํ๋ separate chaining๋ฐฉ์์ ๋นํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๊ฒ ์ฌ์ฉํ๋ค.
open addressing์ ๋น slot์ ์ฐพ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ํฌ๊ฒ Linear Probing, Quadratic Probing, Double Hashing์ผ๋ก ๋๋๋ค.
Linear Probing(์ ํ ์กฐ์ฌ๋ฒ)& Quadratic Probing(์ด์ฐจ ์กฐ์ฌ๋ฒ) : ์ ํ ์กฐ์ฌ๋ฒ์ ์ถฉ๋์ด ๋ฐ์ํ ํด์๊ฐ์ผ๋ก ๋ถํฐ ์ผ์ ํ ๊ฐ๋งํผ(+1, +2, +3, โฆ) ๊ฑด๋ ๋ฐ์ด, ๋น์ด ์๋ slot์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ค.
์ด์ฐจ ์กฐ์ฌ๋ฒ์ ์ ๊ณฑ์(+1^2, +2^2, +3^2, โฆ)๋ก ๊ฑด๋ ๋ฐ์ด, ๋น์ด ์๋ slot์ ์ฐพ๋๋ค.
์ถฉ๋์ด ์ฌ๋ฌ๋ฒ ๋ฐ์ํ๋ฉด ์ฌ๋ฌ๋ฒ ๊ฑด๋ ๋ฐ์ด ๋น slot์ ์ฐพ๋๋ค.
์ ํ ์กฐ์ฌ๋ฒ๊ณผ ์ด์ฐจ ์กฐ์ฌ๋ฒ์ ๊ฒฝ์ฐ ์ถฉ๋ ํ์๊ฐ ๋ง์์ง๋ฉด ํน์ ์์ญ์ ๋ฐ์ดํฐ๊ฐ ์ง์ค์ ์ผ๋ก ๋ชฐ๋ฆฌ๋ ํด๋ฌ์คํฐ๋ง(clustering)ํ์์ด ๋ฐ์ํ๋ ๋จ์
ํด๋ฌ์คํฐ๋ง ํ์์ด ๋ฐ์ํ๋ฉด, ํ๊ท ํ์ ์๊ฐ์ด ์ฆ๊ฐ
- Double Hashing(์ด์คํด์, ์ค๋ณตํด์) : ์ด์ค ํด์ฑ์ open addressing ๋ฐฉ์์ ํตํด collision์ ํด๊ฒฐํ ๋, probingํ๋ ๋ฐฉ์์ค์ ํ๋
linear probing์ด๋ quadratic probing์ ํตํด ํ์ฌํ ๋๋ ํ์ฌ์ด๋ํญ์ด ๊ฐ๊ธฐ ๋๋ฌธ์ ํด๋ฌ์คํฐ๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
ํด๋ฌ์คํฐ๋ง ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก 2๊ฐ์ ํด์ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ ์ด์ค ํด์ฑ์ด๋ผ๊ณ ํ๋ค. ํ๋๋ ์ต์ด์ ํด์๊ฐ์ ์ป์ ๋ ์ฌ์ฉํ๊ณ ๋ ๋ค๋ฅธ ํ๋๋ ํด์ ์ถฉ๋์ด ๋ฐ์ํ ๋ ํ์ฌ ์ด๋ํญ์ ์ป๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
Separate chaining
Separate chaining ๋ฐฉ์์ linked list(๋๋ Tree)๋ฅผ ์ด์ฉํ์ฌ collision์ ํด๊ฒฐํฉ๋๋ค. ์ถฉ๋์ด ๋ฐ์ํ๋ฉด linked list์ ๋ ธ๋(slot)๋ฅผ ์ถ๊ฐํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ
- ์ฝ์ : ์๋ก ๋ค๋ฅธ ๋ key๊ฐ ๊ฐ์ ํด์๊ฐ์ ๊ฐ๊ฒ ๋๋ฉด linked list์ node๋ฅผ ์ถ๊ฐํ์ฌ (key, value) ๋ฐ์ดํฐ ์์ ์ ์ฅ. ์ฝ์ ์ ์๊ฐ๋ณต์ก๋๋ O(1)
- ๊ฒ์: ๊ธฐ๋ณธ์ ์ผ๋ก O(1)์ ์๊ฐ๋ณต์ก๋ ์ด์ง๋ง ์ต์ ์ ๊ฒฝ์ฐ O(n)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค.
- ์ญ์ : ์ญ์ ๋ฅผ ํ๊ธฐ ์ํด์ ๊ฒ์์ ๋จผ์ ํด์ผํ๋ฏ๋ก ๊ฒ์์ ์๊ฐ๋ณต์ก๋์ ๋์ผ
๊ธฐ๋ณธ์ ์ผ๋ก $O(1)$์ด์ง๋ง ์ต์ ์ ๊ฒฝ์ฐ O(n)์ ์๊ฐ๋ณต์ก๋ ๊ฐ์ง๋ค.
worst case์ ๊ฒฝ์ฐ n๊ฐ์ ๋ชจ๋ key๊ฐ ๋์ผํ ํด์๊ฐ์ ๊ฐ๊ฒ ๋๋ฉด ๊ธธ์ด n์ linked list๊ฐ ์์ฑ๋๊ฒ ๋๋ค. ์ด ๋, ๊ฒ์์ ์๊ฐ๋ณต์ก๋๊ฐ O(n)
์ฐธ๊ณ : seperate chaining์ ๊ธฐ๋ณธ์ ์ผ๋ก linked list๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง๋ง, collision์ด ๋ง์ด ๋ฐ์ํ์ฌ linked list์ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง๋ฉด Binary Search Tree(BST)์๋ฃ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ๋ ํจ.
BST๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฒ์์ worst case ์๊ฐ๋ณต์ก๋๋ฅผ O(n) ์์ O(logn)์ผ๋ก ๋ฎ์ถ ์ ์๋ค.
์ฐธ์กฐ : ๊ฐ๋ฐ๋จ๋ ธ์จ ์๋ฃ๊ตฌ์กฐ
Leave a comment