๐Ÿ”ฅ TIL - Day 35

Kim Dae Hyunยท2021๋…„ 10์›” 22์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
41/93

์ด๋ฒˆ์—” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด๋ฅผ ํ•  ๋•Œ ๊ต‰์žฅํžˆ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์“ฐ์ด๋Š” ๋”•์…”๋„ˆ๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค๋‹ค.

๋”•์…”๋„ˆ๋ฆฌ๋Š” 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"))


ํ•™๋ถ€์ƒ ๋•Œ ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด์„œ ์—„์ฒญ ๊นŠ๊ฒŒ ์ด๋ก ์ ์œผ๋กœ ๋ฐฐ์šด ๊ธฐ์–ต์ด ์žˆ๋Š”๋ฐ ์ด๋ก ๋งŒ์ด ์•„๋‹ˆ๋ผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด๋ฉด์„œ ๋ฐฐ์› ๋‹ค๋ฉด ํ›จ์”ฌ ์ข‹์ง€ ์•Š์•˜์„๊นŒ....

ํ•ด์‹œ ํ…Œ์ด๋ธ” ์ถฉ๋Œ๊ฐ™์€๊ฑฐ ์†”์งํžˆ ์ด๋ฆ„์„ ์ œ์™ธํ•˜๊ณ  ์•„๋ฌด๋Ÿฐ ๊ธฐ์–ต์ด ์—†์—ˆ๋‹ค... ใ…Ž

profile
์ข€ ๋” ์ฒœ์ฒœํžˆ ๊นŒ๋จน๊ธฐ ์œ„ํ•ด ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๐Ÿง

0๊ฐœ์˜ ๋Œ“๊ธ€