๊ด€๋ฆฌ ๋ฉ”๋‰ด

DOing

[์ž๋ฃŒ๊ตฌ์กฐ] ํ•ด์‰ฌ ํ…Œ์ด๋ธ” with Python ๋ณธ๋ฌธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

[์ž๋ฃŒ๊ตฌ์กฐ] ํ•ด์‰ฌ ํ…Œ์ด๋ธ” with Python

mangdo 2021. 5. 18. 17:24

๐Ÿ’ก ํ•ด์‰ฌ ํ…Œ์ด๋ธ”?

: ํ•ด์‹œํ…Œ์ด๋ธ”์€ ํ‚ค์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ตฌ์กฐ์ด๋‹ค.

: ํ‚ค๋ฅผ ํ•ด์‹œํ•จ์ˆ˜๋กœ ์—ฐ์‚ฐํ•˜์—ฌ ํ•ด์‹œ ๊ฐ’์„ ์•Œ์•„๋‚ด๊ณ , ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ‚ค์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ’์„ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

: ์ฆ‰, ํ‚ค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์–ด ์†๋„๊ฐ€ ํš๊ธฐ์ ์œผ๋กœ ๋นจ๋ผ์ง„๋‹ค.

: ํŒŒ์ด์ฌ์˜ ๋”•์…”๋„ˆ๋ฆฌ ํƒ€์ž…์ด ๋ฐ”๋กœ ํ•ด์‹œํ…Œ์ด๋ธ”๊ตฌ์กฐ๋กœ ๊ตฌํ˜„ ๋˜์–ด์žˆ๋‹ค.

 

๐Ÿ’ก ํ•ด์‰ฌ ํ…Œ์ด๋ธ” ๊ตฌํ˜„ํ•˜๊ธฐ

class Dict:
    def __init__(self):
        self.items = [None] * 8

    def put(self, key, value):
        index = hash(key) % len(self.items)
        self.items[index] = value

    def get(self, key):
        index = hash(key) % len(self.items)
        return self.items[index]

my_dict = Dict()
my_dict.put("test", 3)
print(my_dict.get("test"))  # 3์ด ๋ฐ˜ํ™˜

 

๐Ÿ’ก ํ•ด์‰ฌ ํ…Œ์ด๋ธ”์˜ ํŠน์ง•

[ ์žฅ์  ]

1) ํ‚ค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๋กœ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์–ด ์ €์žฅ/์ฝ๊ธฐ ์†๋„๊ฐ€ ๊ต‰์žฅํžˆ ๋นจ๋ผ์ง„๋‹ค.

   -> ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ์—๋Š” ๋ชจ๋“  ์š”์†Œ๋“ค์„ ํ•˜๋‚˜์”ฉ ํƒ์ƒ‰ํ•ด์•ผํ•œ๋‹ค.

2) ํ•ด์‹œ๋Š” ํ‚ค์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ์ด ์‰ฌ์›€(์ค‘๋ณต ์ฒดํฌ)

 

[ ๋‹จ์  ]

1) ์ €์žฅ ๊ณต๊ฐ„์ด ๋งŽ์ด ํ•„์š”ํ•˜๋‹ค.

    -> ๊ณต๊ฐ„๊ณผ ํƒ์ƒ‰์‹œ๊ฐ„์„ ๋งž๋ฐ”๊พธ๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.

2) ๋ฐ์ดํ„ฐ ๊ณต๊ฐ„์„ ์ž‘๊ฒŒ ์žก์œผ๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

   -> ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ์ฃผ์†Œ๊ฐ€ ๋™์ผํ•  ๊ฒฝ์šฐ, ์ถฉ๋Œ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ณ„๋„์˜ ์ž๋ฃŒ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

   -> ํ•˜๋‹จ์˜ ํ•ด์‹œํ…Œ์ด๋ธ”์˜ ์ถฉ๋Œ ํ•ด๊ฒฐ ์ฐธ๊ณ 

 

[ ์ฃผ์š” ์šฉ๋„ ]

1) ๊ฒ€์ƒ‰์ด ๋งŽ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ

2) ์ €์žฅ/์‚ญ์ œ/์ฝ๊ธฐ๊ฐ€ ๋นˆ๋ฒˆํ•œ ๊ฒฝ์šฐ

3) ์บ์‰ฌ ๊ตฌํ˜„์‹œ(์ค‘๋ณต ์ฒดํฌ๊ฐ€ ๋น ๋ฅด๊ฒŒ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ)

 

๐Ÿ’ก ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์ถฉ๋Œ ํ•ด๊ฒฐ

1) Open hashing(๊ฐœ๋ฐฉ ํ•ด์‹œ)

: ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” ํ•ด์‹œํ…Œ์ด๋ธ” ๋ฐ–์— ์ถ”๊ฐ€์ ์ธ ๋ฐ์ดํ„ฐ๊ณต๊ฐ„์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

open hashing์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋Š” channing๊ธฐ๋ฒ•์ด ์žˆ๋‹ค.

channing ๊ธฐ๋ฒ•์—์„œ๋Š” ์ถฉ๋Œ์ด ์ผ์–ด๋‚˜๋ฉด linked list๋ฅผ ์ด์šฉํ•ด์„œ ๋’ค์— ์—ฐ๊ฒฐ์‹œ์ผœ ์ €์žฅํ•œ๋‹ค.

์ด๋•Œ ์–ผ๋งŒํผ ์ถฉ๋Œ์ด ์ผ์–ด๋‚ ์ง€๋ฅผ ๋ชฐ๋ผ์„œ ๋ฐฐ์—ด์ด ์•„๋‹Œ linked list๋ฅผ ์“ด๋‹ค.

2) Linear Probing(ํ์‡„ ํ•ด์‹œ)

: ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๋นˆ ๊ณต๊ฐ„์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

: hash address์˜ ๋‹ค์Œ๋ถ€ํ„ฐ ๋งจ ์ฒ˜์Œ ๋‚˜์˜ค๋Š” ๋นˆ๊ณต๊ฐ„์— ์ €์žฅํ•œ๋‹ค.

: ์ €์žฅ๊ณต๊ฐ„ ํ™œ์šฉ๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

 

๐Ÿ’ก ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ์‹œ๊ฐ„๋ณต์žก๋„

1) ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ O(1)

2) ์ตœ์•…์˜ ๊ฒฝ์šฐ(์ถฉ๋Œ์ด ๋ชจ๋‘ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ) O(n)

 

ํ•˜์ง€๋งŒ ํ•ด์‹œ ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๊ณ  ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(1)์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.