์ด๋ฒ์ ์๊ณ ๋ฆฌ์ฆ ํ์ด๋ฅผ ํ ๋ ๊ต์ฅํ ๋น๋ฒํ๊ฒ ์ฐ์ด๋ ๋์ ๋๋ฆฌ์ ๋ํด ์์๋ดค๋ค.
๋์
๋๋ฆฌ๋ key
๊ฐ์ผ๋ก value
๋ฅผ ์ฐพ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
์ผ๋จ ๋์
๋๋ฆฌ์ ๋ด๋ถ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ธฐ ์ ์ ํด์ ํ
์ด๋ธ
์ด๋ผ๋ ๊ฐ๋
์ ์์์ผ ํ๋ค.
ํด์ ํ
์ด๋ธ์ ํด์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ์ฌ ๊ทธ์ ๋งคํ๋๋ ๊ฐ์ ์ฐพ๋ ์๋ฃ๊ตฌ์กฐ์ด๋ค.
ํด์ ํ ์ด๋ธ์ ์๋ ค๋ฉด ๋ ํด์ํจ์๋ฅผ ์์ผ์ผ ํ๋๋ฐ ๊ฐ๋จํ๊ฒ ์์๋ณด์๋ฉด ์์ ๊ธธ์ด์ ๋ฌธ์์ด์ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ํด ๊ณ ์ ๋ ๊ธธ์ด์ ๋ฌธ์์ด๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด๋ค.
์ ํด์ ํ
์ด๋ธ์ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ํ ๋ฒ ์๊ฐํด๋ณด์.
ํด์ฑ๋ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ฑ์ค๋ก ์ด๋ค๊ณ ํ๋๋ฐ ํด์ฑ๋ ๋ฌธ์์ด์ ๊ทธ๋๋ก ์ธ ์ ์์ผ๋ ํด์ ํ
์ด๋ธ์ ํฌ๊ธฐ๋ก ํด์ฑ๋ ๋ฌธ์์ด์ ๋๋จธ์ง ์ฐ์ฐ ํ ๊ฒฐ๊ณผ๋ฅผ ์ธ๋ฑ์ค๋ก ์ฌ์ฉํ๋ค. ๊ทธ๋ฌ๋ฉด ํค ๊ฐ์ ์ญํ ์ ํ ํด์ฑ๋ ๋ฌธ์์ด์ ํด์ ํ
์ด๋ธ์ ๋ค์ด๊ฐ ์ ์๋ ์ธ๋ฑ์ค์ ๋ฒ์๋ก ๊ณ์ฐ์ด ๋ ๊ฒ์ด๊ณ ํด๋น ์ธ๋ฑ์ค์ ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์ฌ๊ธฐ๊น์ง ๋ง๋ก ํ ๋ด์ฉ์ ์ฝ๋๋ก ์ฎ๊ฒจ๋ณด์.
์ง์ ํ์ด์ฌ์ ๋์
๋๋ฆฌ๋ฅผ ๊ตฌํ๋ณด๋ ๊ฒ์ด๋ค.
class Dict:
HASH_TABLE_SIZE = 8
def __init__(self):
self.hash_table = [0] * self.HASH_TABLE_SIZE
def put(self, key, value):
index = hash(key) % self.HASH_TABLE_SIZE
self.hash_table[index] = value
def get(self, key):
index = hash(key) % self.HASH_TABLE_SIZE
return self.hash_table[index]
๋ด๋ถ์ ์ผ๋ก ํด์ ํ ์ด๋ธ์ ์ญํ ์ ํ ๋ฆฌ์คํธ๋ฅผ ๊ฐ๋๋ค. ์ธ๋ฑ์ค๋ฅผ ์ก๊ธฐ ์ํด ๋ฆฌ์คํธ๋ ๋ฐ๋์ ์ด๊ธฐํํด์ค์ผ ํ๋ค.
๋์ ๋๋ฆฌ์์ ํต์ฌ์ ์ธ ๊ธฐ๋ฅ์ธ ์ฝ์ (put), ์กฐํ(get)์ ๊ตฌํํ๋ค.
์ฝ์
์ ๊ฒฝ์ฐ ํ์ด์ฌ์ด ์ ๊ณตํด์ฃผ๋ hash
ํจ์๋ฅผ ์ด์ฉํด์ key
๊ฐ์ ํด์ ๊ฐ์ ๊ตฌํ๊ณ ํด์ ํ
์ด๋ธ์ ํฌ๊ธฐ๋ก ๋๋จธ์ง ์ฐ์ฐ์ ํ๋ค. ์ด๋ ๊ฒ ๋๋ฉด key
๊ฐ์ด ์ด๋ค ๊ฐ์ด๋ ํด์ ํ
์ด๋ธ์ ํฌ๊ธฐ ์์ ๋ค์ด์ค๋ ์ธ๋ฑ์ค๋ก ๋ณํ๋ ๊ฒ์ด๋ฏ๋ก ํด๋น ์ธ๋ฑ์ค์ value
๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๋ค.
์กฐํ๋ ์ฝ์
๊ณผ ๊ฑฐ์ ๊ฐ๋ค. hash
ํจ์์ ํด์ ํ
์ด๋ธ์ ํฌ๊ธฐ๋ก ํด์ ํ
์ด๋ธ์ index
๋ฅผ ๊ณ์ฐํ๊ณ ํด๋น index
์ ๊ฐ์ ๋ฆฌํดํ๋ค.
ํ ์คํธ
dict = Dict()
dict.put('key1', 'value1')
dict.put('key2', 'value2')
print(dict.get('key1'))
ํ ๊ฐ๋ง ๋ ์ ๊ฒฝ์จ๋ณด์.
ํด์ฑ๋ ๊ฒฐ๊ณผ๋ฅผ ํด์ ํ
์ด๋ธ์ ํฌ๊ธฐ๋ก ๋๋จธ์ง ์ฐ์ฐํ ๊ฒฐ๊ณผ๋ฅผ ํด์ ํ
์ด๋ธ์ ์ธ๋ฑ์ค๋ก ์ด๋ค๊ณ ํ๋ค. ์ด ์ธ๋ฑ์ค๊ฐ ์ค๋ณต๋๋ ๊ฒฝ์ฐ๋ ์์๊น ??
์๋ค. ์๋ค. ์๋ค.
์ธ๋ฑ์ค ์ค๋ณต๋ณด๋ค๋ ์ถฉ๋์ด๋ผ๋ ๋จ์ด๋ฅผ ๋ ๋ง์ด ์ฐ๋ ๊ฒ ๊ฐ๋ค.
key
๊ฐ์ ํด์ฑํ ๊ฒฐ๊ณผ๋ ํด์ํจ์์ ์ํด ๋น์ฐํ ๋ค๋ฅด๊ฒ ์ง๋ง ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋๋จธ์ง ์ฐ์ฐ์ ํ์ ๋๋ ๊ฐ์ด ๊ฐ์์ง ์ ์๋ค. ํด์ ํ
์ด๋ธ์ ๋ฒ์๊ฐ ์๋ค๋ฉด ๋งค์ฐ ๋์ ํ๋ฅ ๋ก ์ถฉ๋์ด ๋ฐ์ํ ๊ฒ์ด๋ค.
์ถฉ๋์ ํด๊ฒฐํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์์๋ณด์.
๊ฐ๋ฐฉ์ฃผ์๋ฒ๊ณผ ์ฒด์ด๋์ด๋ค.
์ผ๋จ ๊ฐ๋ฐฉ์ฃผ์๋ฒ ๋จผ์ ๊ฐ๋ณ๊ฒ ๋ค๋ค๋ณด์.
์ถฉ๋์ ์ธ๋ฑ์ค๊ฐ ๊ฐ์์ง๋ ํ์์ ํด๊ฒฐํด์ผ ํ๋ค. ๊ฐ๋ฐฉ์ฃผ์๋ฒ์ ์ด ๋ฌธ์ ๋ฅผ ๊ต์ฅํ ๋จ์ํ๊ฒ ํด๊ฒฐํ๋ค. 3๋ฒ
์ธ๋ฑ์ค์์ ์ถฉ๋์ด ๋ฐ์ํ๋ค๋ฉด 4๋ฒ
์ ๋ณด๋ ๊ฒ์ด๋ค.
4๋ฒ
์ด ๊ฝ ์ฐพ๋ค๋ฉด? 5๋ฒ
์ ๋ณธ๋ค. ๋จ์ํ๋ค. ์ด๋ฐ ์์ผ๋ก ์ฒ๋ฆฌํ๋ค.
ํด์ฑ ์ฑ๋ฅ์ ์ํด ๋ค์ ์ธ๋ฑ์ค๋ฅผ ๊ฒฐ์ ํ๋ ๋ง์ ๋ฐฉ๋ฒ์ด ์ฐ๊ตฌ๋ ๊ฒ ๊ฐ๋ค. ํ์ํ ๋ ์ ๋ง ํ์ํด์ง ๋ ์์๋ณด์ ...
๋ค์์ผ๋ก ์ฒด์ด๋์ด๋ค.
์ฒด์ด๋์ ํด์ ํ
์ด๋ธ์ ๊ฐ ์ธ๋ฑ์ค๊ฐ LinkedList
๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ํ๋ ๊ฒ์ด๋ค.
์ผ๋จ ํํ๋ 2์ฐจ์ ๋ฐฐ์ด์ ์๊ฐํ๋ฉด ๋๋ค.
ํด์ ํ
์ด๋ธ์ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์๋ค๋ฉด ์ด์ key
๊ฐ์ผ๋ก ํด์ ํ
์ด๋ธ์ ์ธ๋ฑ์ค ๋ฒ ์งธ ๋ฐฉ์ ์์นํ LinkedList
๋ฅผ ์ํํ๋ฉด์ REAL ๊ฐ์ ์ฐพ๋ ๊ฒ์ด๋ค.
์ฒด์ด๋์ ์ฝ๋๋ก ์ฎ๊ฒจ์ ํ์ธํด๋ณด์.
ํด์ ํ
์ด๋ธ ๋ด๋ถ์ ์ผ๋ก LinkedList
๋ฅผ key-value
์์ผ๋ก ๊ฐ์ ธ์ผ ํ๋ ํด๋์ค๋ฅผ ํ๋ ์ ์ํ๋ค. ์ฌ๊ธฐ ํํ์ key-value
์์๋ ํด์ฑ๋ ๊ฐ์ด ์๋ ์๋์ ๊ฐ์ด ์ ์ฅ๋๋ค.
class LinkedTuple:
def __init__(self):
self.list = list()
def add(self, key, value):
self.list.append((key, value))
def get(self, key):
for k, v in self.list:
if key is k:
return v
๋ค์์ผ๋ก ๋์
๋๋ฆฌ๋ฅผ ์ํ ํด๋์ค๋ฅผ ์ ์ํ๋ค.
์ด์ ๊ณผ ๋์ผํ๊ฒ ๋ด๋ถ์ ์ผ๋ก ํด์ ํ
์ด๋ธ์ ์ํ ๋ฆฌ์คํธ๋ฅผ ๊ฐ๊ณ ํด๋น ๋ฆฌ์คํธ์ ํด์ ํ
์ด๋ธ์ ํฌ๊ธฐ๋งํผ ์์ ์ ์ํ ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ์ถ๊ฐํด์ค๋ค.
์๋์ key
๋ก LinkedTuple
์ ์กฐํํ๊ณ ์ฝ์
ํ๋ ๊ฒ ์ธ์๋ ๋์ผํ๋ค.
class Dict:
HASH_TABLE_SIZE = 8
def __init__(self):
self.hash_table = []
for _ in range(self.HASH_TABLE_SIZE):
self.hash_table.append(LinkedTuple())
def put(self, key, value):
index = hash(key) % self.HASH_TABLE_SIZE
self.hash_table[index].add(key, value)
def get(self, key):
index = hash(key) % self.HASH_TABLE_SIZE
return self.hash_table[index].get(key)
ํ ์คํธ
dict = Dict()
dict.put("key1", "value1")
dict.put("key2", "value2")
print(dict.get("key1"))
ํ๋ถ์ ๋ ํด์ ํ ์ด๋ธ์ ๋ํด์ ์์ฒญ ๊น๊ฒ ์ด๋ก ์ ์ผ๋ก ๋ฐฐ์ด ๊ธฐ์ต์ด ์๋๋ฐ ์ด๋ก ๋ง์ด ์๋๋ผ ์ง์ ๊ตฌํํด๋ณด๋ฉด์ ๋ฐฐ์ ๋ค๋ฉด ํจ์ฌ ์ข์ง ์์์๊น....
ํด์ ํ ์ด๋ธ ์ถฉ๋๊ฐ์๊ฑฐ ์์งํ ์ด๋ฆ์ ์ ์ธํ๊ณ ์๋ฌด๋ฐ ๊ธฐ์ต์ด ์์๋ค... ใ