์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- REACT
- CSS
- float
- ๋ฐ๋ธ์ฝ์ค3๊ธฐ
- ๋ธ๋ก๊ทธ
- Props
- ํ๋ก ํธ์๋
- ๋ฐ๋ธ์ฝ์ค
- position
- ํ๋ก๊ทธ๋๋จธ์ค
- ์ฝ๋ฉํ ์คํธ
- history api
- useRef
- Gatsby
- ์๊ณ ๋ฆฌ์ฆ
- fetch API
- useEffect
- Flex
- ์๋ฐ์คํฌ๋ฆฝํธ
- Today
- Total
Daehyunii's Dev-blog
19 ํด์ ํ ์ด๋ธ ๋ณธ๋ฌธ
19 ํด์ ํ ์ด๋ธ
Daehyunii 2022. 8. 16. 20:1719.1 ํด์ ํ ์ด๋ธ(ํด์ ๋งต)
ํด์ ํ ์ด๋ธ์ด๋ ํค์ ๊ฐ์ ์์ผ๋ก ์ ์ฅํ๋ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค. ๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ด์ฅ๋์ด ์๋ ์๋ฃ ๊ตฌ์กฐ์ด๋ค. python์dictionaries, Java Script๋ Object์ Maps, Java๋ Go, Scala ๊ทธ๋ฆฌ๊ณ Maps, Juby๋ Hashes๋ก ์๋ ค์ ธ ์๋ค. ์ด ์ฒ๋ผ ์ธ์ด๋ง๋ค ํด์ ํ ์ด๋ธ์ด ๋ด์ฅ๋์ด ์๊ณ ํด์ ํ ์ด๋ธ์ ์ถ์์ ์ธ ๊ฐ๋ ์ด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ์ฝ๋ฉํ ์๋ ์๋ค. ํด์ ํ ์ด๋ธ์ ์ผ๋ฐ์ ์ธ ๋ฐฐ์ด๊ณผ๋ ๋ค๋ฅด๋ค. ๋ฐฐ์ด์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ง์ง๋ง ํด์ ํ ์ด๋ธ์ ์์๋ฅผ ๊ฐ์ง์ง ์๋๋ค. ํด์ ํ ์ด๋ธ์ด ์ข์ ์ด์ ๋ ์๋ก์ด ๊ฐ์ ์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ๋๋ฐ ์์ฃผ ๋น ๋ฅด๊ณ ๋ฐ์ดํฐ ๊ทธ ์์ฒด๊ฐ ํด์ ํ ์ด๋ธ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ์ ์ฅ๋๋ ๊ฒ์ด ํธํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
19.2 ํด์ ํจ์
ํด์ ํจ์๋ ์์์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๋ฉด ์ ํด์ง ํฌ๊ธฐ์ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํด์ฃผ๋ ํจ์์ด๋ค. ์ฆ, ์ ๋ ฅ๊ฐ์ ์ธก์ ํด์ ์ ํด์ง ํฌ๊ธฐ์ ์ถ๋ ฅ๊ฐ์ ๋ฐํํ๋ค. ๊ทธ๋์ ์ผ์ ํ ๊ธฐ์ค์ ์ ํด์ ๋ง๋ค์ด์ผ ํ๋๋ฐ, ๊ทธ๊ฒ ๋งค์ฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์ ํด์ ํจ์๋ฅผ ์ฐ๊ตฌํ๋ ๋ง์ ์ฐ๊ตฌ์ง๋ค์ด ์๋ค. ๋ด๊ฐ ๊ณต๋ถํ ํด์ ํจ์๋ ํน์ ๋ฐ์ดํฐ๋ฅผ ํด์ ํจ์์ ๋ฃ์ผ๋ฉด ์ผ์ ํ๊ฒ ๋ฐฐ์ด์ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ๋ฐํํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์ [ํค,๊ฐ] ๋ฐฐ์ด์ ๋ง๋ค์ด์ ์ ์ฅํ๋ค. ๋ฐ๋๋ก ์ ๋ณด๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ ํด์ ํจ์์ ํ์ํ ์ ๋ณด์ ํค๋ฅผ ๋ฃ์ผ๋ฉด ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ์๋ ค์ฃผ๊ณ ๊ทธ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐฐ์ด์์ ์ ๋ณด๋ฅผ ์ฐพ์๋ด๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ํด์ ํจ์์ ์ญํ ์ด๋ค.
โปํด์ ํจ์์ ํน์ง
1) ๋์์ด ๋งค์ฐ ๋น ๋ฅด๋ค.(ํด์ ํจ์๋ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋์์ด ๋นจ๋ผ์ผํ๋ค.)
2) ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ๋ถ๋ฐฐ ํด์ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ค๊ณผ ๊ฒน์น์ง ์๊ฒ ํด์ผ ํ๋ค.(๊ทธ๋ฌ๋ฏ๋ก ๊ธฐ์ค ์ค์ ์ด ๋งค์ฐ ์ด๋ ต๋ค.)
3) ๊ฒฐ์ ๋ก ์ ์ด๋ค.(ํน์ ์ ๋ ฅ๊ฐ์ ์ ๋ ฅํ ๋๋ง๋ค ๋ฌด์กฐ๊ฑด ๊ฐ์ ์ถ๋ ฅ๊ฐ์ด ๋ฐํ๋์ด์ผ ํ๋ค.)
19.3 ํด์ ํจ์
//์ด๋ค ๊ธฐ์ค์ผ๋ก ๋ง๋ค๋ ์๊ด ์์ง๋ง, ์ค์ํ๊ฒ์ ๋น ๋ฅด๊ณ , ํญ์ ๋์ผํ ์
๋ ฅ์ ๋์ผํ ์ถ๋ ฅ์ด ๋์์ผํ๋ค๋ ์ ์ด๋ค!
function hash(key, arrayLen) { // arrayLen์ ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ์๋ฏธํจ!
//๋ช๊ฐ์ ์์๋ฅผ ๊ฐ์ง๋ ๋ฐฐ์ด์์ ์ด๋์ ์ ์ฅํ ์ง๋ฅผ ์ฐพ๊ธฐ์ํด ๋ฐฐ์ด์ ๊ธธ์ด๋ ์ธ์๋ก ๋ฐ๋๊ฒ์!
let total = 0;
for (let char of key) {
let value = char.charCodeAt(0) - 96 // 96์ ๋นผ๋ฉด ์ํ๋ฒณ ์์๊ฐ ๋์จ๋ค!!
//charCodeAt() ๋ฉ์๋๋ ์ฃผ์ด์ง ์ธ๋ฑ์ค์ ๋ํ UTF-16 ์ฝ๋๋ฅผ ๋ํ๋ด๋ 0๋ถํฐ 65535 ์ฌ์ด์ ์ ์๋ฅผ ๋ฐํํ๋ค
total = (total + value) % arrayLen;
}
return total;
}
โป ์ ํด์ฌ ํจ์์ ๋ฌธ์ ์
1) ๋ฌธ์์ด์ ๋ํด์๋ง ํด์ ์ฒ๋ฆฌ๋ฅผ ํ๋ค. ์ซ์๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ด๋ ๋ฐฐ์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๋ฉด ์ ๋๋ก ์๋ํ์ง ์์ ๊ฒ์ด๋ค.
2) O(N)์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ๋๋ค. ์ฆ, ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ๊ธธ์ด์ง๋ฉด ๊ณ์ฐํ๋ ์๊ฐ์ด ๊ธธ์ด์ง๋ค.
3) ๋ฌด์์์ฑ์ด ๋จ์ด์ง๋ค.(ํด์ ํจ์์ ๋ฐํ ๊ฐ์ด ๋์ผํ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.)
์ด๋ฌํ ๋ฌธ์ ์ ๋ค์ ๊ฐ์ ํด์ ๋ค์ ์์ ํด์ ํจ์๋ฅผ ๋ง๋ค์ด ๋ณด์.
// ์ ๋ฌธ์ ์ ๋ค์ ํ ๋๋ก ์ฑ๋ฅ ํฅ์์์ผ๋ณด๊ธฐ
function hash(key, arrayLen) {
let total = 0;
let WEIRD_PRIME = 31; // ์์๋ฅผ ํ๋ ์ฌ์ฉํ๋ค!(์ด๋ค ์ซ์๋ก๋ ๋๋ ์ ์๋ ์)
//ํด์ ํจ์๋ ๊ฑฐ์ ๋๋ถ๋ถ ์์๋ฅผ ์ฌ์ฉํจ
//์ด๋ ๊ฒ ํ๋ฉด ์ถฉ๋์ด ์ค์ด๋ ๋ค. ๋ฐ์ดํฐ๋ค์ด ์ต๋ํ ๊ฐ์ ๋ฐ๊ตฌ๋์ ๋ค์ด๊ฐ์ง ์๊ฒํ๊ธฐ ์ํด
//์ํ์ ์๋ฆฌ๋ ์ ์ณ์ฃผ๋ ํด์ฌ ํจ์์ ๋ณดํต ์์๋ฅผ ์ฌ์ฉํ๋ค๋๊ฒ์ ๊ธฐ์ต!
//์ฌ์ง์ด ๋ฐฐ์ด๋ ์์๋ผ๋ฉด ์ถฉ๋ ๊ฐ๋ฅ์ฑ๋ ์์ฒญ๋๊ฒ ๋จ์ด์ง!(์์ ๊ฐ์ ํ
์ด๋ธ๊ณผ ์ง์ ๊ฐ์ ํ
์ด๋ธ ์ถฉ๋ ํ์์ฐจ์ด๊ฐ ์์ญ๋ฐฐ์์ ์์ฒ๋ฐฐ๊น์ง๋ ๋จ!)
for (let i = 0; i < Math.min(key.length, 100); i++) {
// ์ฆ ๋ฐ๋ณต์ 100์ดํ๋ก๋ง ํ๊ฒ ๋จ!(์๋ฌด๋ฆฌ ๋ฐ์ดํฐ๊ฐ ๊ธธ์ด๋ 100๋ฒ๊น์ง๋ง ๋๊ฒ๋จ 0~99) ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด
let char = key[i];
let value = char.charCodeAt(0) - 96
total = (total * WEIRD_PRIME + value) % arrayLen;
}
return total;
}
19.4 ํด์ ํจ์ ์ถฉ๋ ์ฒ๋ฆฌ
์์์ ๋ฐ์ดํฐ๋ฅผ ํด์ ์ฒ๋ฆฌ ํ๋๋ฐ ๊ฐ์ ๊ฐ์ด ๋ฐํ๋๋ ๊ฒฝ์ฐ์ ํด๊ฒฐ๋ฐฉ๋ฒ์๋ ๋ํ์ ์ผ๋ก 2๊ฐ์ง๊ฐ ์๋ค. ์ฒซ ๋ฒ์งธ๋ ๊ฐ๋ณ ์ฒด์ด๋(Separate Chaining) ๋ฐฉ๋ฒ๊ณผ ์ง์ ํ์๋ฒ(Linear Probing)์ด ์๋ค.
1) ๊ฐ๋ณ ์ฒด์ด๋(Separate Chaining)
๊ฐ๋ณ ์ฒด์ด๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ ์ฅ์์ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ๋ฐฐ์ด์ด๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋ฑ์ ํ์ฉํ์ฌ ์ด์ค ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฐ๋ ๊ฒ์ด๋ค.
( [ [ ],[ ] ] )์ฆ, ๊ฐ์ ๊ณต๊ฐ์ ๊ฐ์ด ์ ์ฅํ๋๊ฒ์ด๋ค. ์ด๋ฌํ ๋ฐฉ์์ ์ฅ์ ์ ๋ฐฐ์ด์ ๊ธธ์ด ๋ณด๋ค ๋ ๊ธด ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ์ ์๋ค.
2) ์ง์ ํ์๋ฒ(Linear Probing)
๊ฐ ์์น์ ํ๋์ ๋ฐ์ดํฐ๋ง ์ ์ฅํ๋ค๋ ๊ท์น์ ๊ทธ๋๋ก ์งํค๋ ค๊ณ ํ๋ ๊ฒ์ด๋ค. ์ถฉ๋์ด ๋ฐ์ํ๋ฉด ํด๋น ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค์ ๋น์ด์๋ ๊ณต๊ฐ์ด ์ด๋์ธ์ง ํ์ธํ๊ณ ์ ์ฅํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๊ฐ ๊ฐ์ ์ธ๋ฑ์ค์ ์ ์ฅ๋๋ ๊ฒ์ ๋ง์ ์ ์๋ค. ๋ฑ ๋ฐฐ์ด์ ๊ธธ์ด์ ๋ง๋ ๋ฐ์ดํฐ ๊ฐ์๋ง ์ ์ฅ์ด ๊ฐ๋ฅํ๋ค.
19.5 ํด์ ํ ์ด๋ธ๊ณผ set & get ๋ฉ์๋
set๋ฉ์๋๋ ์์์ ๋ฐ์ดํฐ๋ฅผ ํด์ ์ฒ๋ฆฌ ํ ํด์ ํ ์ด๋ธ์ ์ ์ฅํ๋ ๊ธฐ๋ฅ์ ํ๊ณ , get ๋ฉ์๋๋ ์ด๋ฏธ ํด์ ํ ์ด๋ธ์ ์ ์ฅ๋์ด ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํด ํค๋ฅผ ์ธ์๋ก ๋ฐ์ ํด๋น ๋ฐ์ดํฐ๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ ๊ธฐ๋ฅ์ ํ๋ค.
class HashTable {
constructor(size=53){
this.keyMap = new Array(size);
}
_hash(key) { //ํค๋ฅผ ๋ฐ์ ํด์ ํจ์๋ก ์ ์ฅ์์น์ธ ํด์ํ
์ด๋ธ์ ์ธ๋ฑ์ค ๋ฒํธ ๋ฐ๊ธฐ
let total = 0;
let WEIRD_PRIME = 31;
for (let i = 0; i < Math.min(key.length, 100); i++) {
let char = key[i];
let value = char.charCodeAt(0) - 96
total = (total * WEIRD_PRIME + value) % this.keyMap.length;
}
return total;
}
set(key,value){ //ํค์ ๊ฐ์ ๋ฐ์ ํด์ํ
์ด๋ธ์ ์ ์ฅ
let index = this._hash(key);
if(!this.keyMap[index]){ // ๋ฐฐ์ด์์ ํด๋น ์ธ๋ฑ์ค๊ฐ ์์ผ๋ฉด undefined๊ฐ ๋ฐํ๋จ
//์ฐธ๊ณ ๋ก ๋น ๋ฐฐ์ด ์์ฒด๋ truthy์!!!
this.keyMap[index] = [];
}
this.keyMap[index].push([key, value]); //ํด๋น ์ธ๋ฑ์ค๋ก ์ ๊ทผํ๋ฉด ๋ ๋ค๋ฅธ ๋ฐฐ์ด์ด ๋์ค
//๊ทธ ๋ฐฐ์ด์ push๋ฉ์๋ ํ์ฉ
}
get(key){ //ํค๋ฅผ ๋ฐ์ ํด๋นํ๋ ๊ฐ์ ์ฐพ๊ธฐ
let index = this._hash(key);
if(this.keyMap[index]){
for(let i = 0; i < this.keyMap[index].length; i++){
if(this.keyMap[index][i][0] === key) {
return this.keyMap[index][i][1] //๋ฐฐ์ด ์์ ๋ฐฐ์ด ์์ ๋ฐฐ์ด ์์ 1๋ฒ ์ธ๋ฑ์ค์
}
}
}
return undefined;
}
}
'๐ Language & CS knowledge > Algorithm & Data structure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
21 ๊ทธ๋ํ ์ํ (0) | 2022.08.19 |
---|---|
20 ๊ทธ๋ํ (0) | 2022.08.17 |
18 ์ด์ง ํ (0) | 2022.08.16 |
17 ํธ๋ฆฌ ์ํ (0) | 2022.08.16 |
16 ์ด์ง ๊ฒ์ ํธ๋ฆฌ (0) | 2022.08.14 |