Table ์ด๋ชจ์ง๋ฅผ ๊ฒ์ํ๋ Table Tennis๊ฐ ๋์ค๋ค์.๐คฃ
๋จผ์ , ์ํคํผ๋์์ ๊ทธ๋ฆผ์ ๊ฐ์ด ๋ด ์๋ค.
์ ํ๋ฒํธ๋ถ์ ์๋ ์ฌ๋์ Hash Table์ ์ ์ฅํ ๋์ ๊ทธ๋ฆผ์ธ๋ฐ์.
keys(์ด๋ฆ)์ hash function์ผ๋ก indexingํ์ฌ bucket์ ๊ฐ index์ value๋ฅผ ๋ฃ์ด์ค๋๋ค.
๊ทธ๋ฐ๋ฐ ๊ณต๊ฐ์ ๋ฌดํ์ ์ผ๋ก ์์ฑํ ์ ์์ผ๋ ์์ ์ ํ์ด ์์ต๋๋ค.
๋ง์ฝ 80%๋งํผ ์ฑ์์ง๋ค๋ฉด 2๋ฐฐ๋ก ๋๋ฆฌ๊ณ , 25%๋งํผ ์ค์๋ค๋ฉด ์ ๋ฐ์ผ๋ก ์ค์ด๋ ๊ฒ์ด์ฃ .
๋, ํด์ฑ์ ํ๋ฉด ๋์ผํ index๋ฅผ ๋ฐ์ ์๋ ์๊ณ , ์ด๋ ์ถฉ๋์ด ๋ฐ์ํ์ฌ ์ค๋ณต์ด ์๊น๋๋ค.
์๋ฅผ ํ๋ฒ ๋ค์ด๋ณผ๊น์?
์ต๋ ๊ณต๊ฐ์ 10์ผ๋ก ์ ์ฝํฉ๋๋ค. (๋ฌดํ์ ์ผ๋ก ์์ฑํด๋์ผ๋ฉด ๋น์ฐํ ๋นํจ์จ์ ์ด๋๊น์.)
๊ทธ๋ผ ํด์ํจ์๋ก ์ธ๋ฑ์ฑ์ ํ ์ ์๋ ๊ฐ์ง์์ ๋ฒ์๋ 10๊ฐ์ง ์ด๋ด๊ฐ ๋ฉ๋๋ค.
์๋ฌด๋ฆฌ ๋ค์ํ ์ซ์๋ฅผ ๋ฃ์ด๋ ์ต๋ 10๊ฐ๋ง ๋ค์ด๊ฐ๋๊น์.
๊ทธ๋ ๋ค๋ฉด ํด์ํจ์๋ ์ต๋ ๊ณต๊ฐ์ ์ ์ฝ์๋งํผ 1~10๊น์ง๋ง ์์ฑ์ ํด๋ด ์๋ค.(๊ฐ๋ตํ๊ฒ)
๊ทธ๋ผ ํ๋ฅ ์ ์ผ๋ก '์ ์งฑ๊ตฌ'์ 'ํ๊ธธ๋'์ ์ธ๋ฑ์ค๊ฐ ๊ฐ์ ํ๋ฅ ๋ ์๊ฒ ์ฃ ?
๊ทธ๋ผ ๊ฐ์ ์ธ๋ฑ์ค๊ฐ ์ค๋ณต๋์ด ์ถฉ๋ ๋ฌธ์ ๊ฐ ๋ฐ์๋๋ ๊ฒ์ ๋๋ค.
์ ์กฐ๊ฑด์ ์ด๋ ๊ฒ ๋ง์ด ์ถ๊ฐํ๋๋ฉด, ์๋๋ ํด์ ํจ์์ ๋ชจ์์ ๋ฐ๋ผ ํ๋ฅ ์ด ์์ฃผ ์ ์ด์ง ์ ์์ผ๋๊น์!
์ด๋ฅผ ํด๊ฒฐ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด 2๊ฐ์ง๊ฐ ์์ต๋๋ค.
entries ๋ถ๋ถ์ด ์ถ๊ฐ๋์์ฃ ? ์ด๋ ๊ฒ ๋์ผํ index๋ฅผ ๋ฐ์ ์ถฉ๋์ด ๋ฐ์ํ๋ฉด
ํด๋น index๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ Linked List์ ๋ ธ๋๋ฅผ ์ถ๊ฐํ์ฌ ๊ฐ์ ์ถ๊ฐํฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ ๋, ์ถฉ๋์ด ๋ฐ์ํด๋ ๋ฐ์ดํฐ ์ฝ์ ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ฐ์ดํฐ ์ถ์ถ ์์๋ key์ ๋ํ index๋ก Linked List๋ฅผ ๊ฒ์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํฉ๋๋ค.
index์ ๋ํ ์ถฉ๋์ ๋ํด Linked List๋ฅผ ์ฌ์ฉํ์ฌ ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฌ์ฉํ์ง ์๊ณ ,
hash table array์ ๋น ๊ณต๊ฐ์ ์ฌ์ฉํฉ๋๋ค.
Separate chaining ๋ฐฉ์์ ๋นํด์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฌ์ฉํฉ๋๋ค.
Open Addressing์ ๊ตฌํํ๋ ๋ฐฉ์์ธ Linear Probing์ ๊ฐ๋จํ ์์๋ด ์๋ค.
[ํ์ค์์ฝ] : ๋ฃ๊ณ ์ถ์๋ฐ ์๋ฆฌ๊ฐ ์์ผ๋ฉด ๋ค์ ์นธ์ ๋ฃ๋ ๋ฐฉ๋ฒ.
index์ ๋ํด ์ถฉ๋์ด ๋ฐ์ํ์ ๋, index ๋ค์ ๋ฒํท ์ค์ ๋น ๋ฒํท์ ์ฐพ์ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๋ ๋ฐฉ์์ ๋๋ค.
key % 10 ํด์ฌ ํจ์๋ฅผ ์ฌ์ฉํ๋ Hashtable์ด ์์๋, ์๋ ๊ทธ๋ฆผ์์๋ ์ถฉ๋์ด ๋ฐ์ํ์ง ์์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ, ์ฌ๊ธฐ์ 11์ key๋ก ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ผ๋ฉด key๊ฐ 1์ธ data์ ์ถฉ๋์ด ๋ฐ์ํฉ๋๋ค!
Linear Probing์ ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ์ถฉ๋์ด ๋ฐ์ํ index[1] ๋ค์ ๋ฒํท์ ๋น ๋ฒํท์ด ์๋์ง ๊ฒ์ํฉ๋๋ค.
2๋ฒ ๋ฒํท์ ์ด๋ฏธ index[2]๊ฐ ๋ค์ด์๊ธฐ ๋๋ฌธ์ 3๋ฒ ๋ฒํท์ ์ ์ฅ์ ํฉ๋๋ค.
pseudo Code๋ฅผ ์์ฑํด๋ด ์๋ค!
/* pseudo Code */
ํด์ํ
์ด๋ธ {
limit, bucket
method: insert {
ํด์ํจ์๋ก ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ ธ์จ๋ค.
์ธ๋ฑ์ค์ ๋ง์ถฐ ๋ฒํท์ ์ ์ฅํ๋ค.
๋ง์ฝ limit์ 80%๊ฐ ์ฐจ๋ฉด ๋ฆฌ๋ฐ์ ํ์ฅํ๋ค.
}
method: retrive {
ํด์ํจ์๋ก ๊ตฌํ ์ธ๋ฑ์ค์ ๋ง์ถฐ ๊ฐ์ ์ฐพ๋๋ค.
}
method: remove {
ํด์ํจ์๋ก ๊ตฌํ ์ธ๋ฑ์ค์ ๋ง์ถฐ ๋ฒํท์ ๋๋ฉด์ ๋์ผํ๋ฉด ์ ๊ฑฐํ๋ค.
}
}
ํด์ํจ์ { }
์ฝ๋๋ ๋ ๊ฐ์ง๋ก ๋๋ฉ๋๋ค.
- Hash Table Helper
- Hash Table
ํด์ ํ ์ด๋ธ ํฌํผ ์ฝ๋๊ฐ ์ฃผ์ด์ง๋๋ค. (์ด๋ ๊ฒ ์น์ ํ ์๊ฐ...)
์์ ์ ํด์ผํ ์ ์๊ฒ ์ง๋ง ์ผ๋จ ๊ทธ๋๋ก ์ฌ์ฉํด๋ด ๋๋ค.
๊ฐ๋จํ๊ฒ ์ฝ์ด๋ณด๋ฉด ์ ํ๋ ๊ณต๊ฐ์ ์์ฑํ๋ ํด๋์ค, ํด์ํจ์๊ฐ ์๋ค์!
const LimitedArray = function(limit) {
const storage = [];
const limitedArray = {};
limitedArray.get = function(index) {
checkLimit(index);
return storage[index];
};
limitedArray.set = function(index, value) {
checkLimit(index);
storage[index] = value;
};
limitedArray.each = function(callback) {
for (let i = 0; i < storage.length; i++) {
callback(storage[i], i, storage);
}
};
var checkLimit = function(index) {
if (typeof index !== "number") {
throw new Error("setter requires a numeric index for its first argument");
}
if (limit <= index) {
throw new Error("Error trying to access an over-the-limit index");
}
};
return limitedArray;
};
const getIndexBelowMaxForKey = function(str, max) {
let hash = 0;
for (let i = 0; i < str.length; i++) {
hash = (hash << 5) + hash + str.charCodeAt(i);
hash &= hash; // Convert to 32bit integer
hash = Math.abs(hash);
}
return hash % max;
};
hashTableHelper๋ฅผ ๋ถ๋ฌ์์ ์ฌ์ฉํฉ๋๋ค.
ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ง์ ํ๊ณ , ๊ฐ ๋ฉ์๋๋ฅผ prototype์ ๊ตฌํํฉ๋๋ค.
๊ฐ ๊ตฌ์ฑ์ ๋ถ์ํด๋ด ์๋ค.
_limit : ํฌ๊ธฐ ์ ํ
_storage : bucket(๋ฒํท)
insert : ํด์ํจ์๋ก ์ธ๋ฑ์ค๋ฅผ ๊ตฌํ์ฌ ๋ฒํท์ ์ ์ฅํฉ๋๋ค.
retrive : ํด์ํจ์๋ก ์ธ๋ฑ์ค๋ฅผ ๊ตฌํ์ฌ ๋ฒํท์์ ๊ฐ์ ธ์ต๋๋ค.
remove : ํด์ํจ์๋ก ์ธ๋ฑ์ค๋ฅผ ๊ตฌํ์ฌ ๋ฒํท์ ๋๋ฉด์ ์ฐพ์ ์ญ์ ํฉ๋๋ค.
์์ง ์ถฉ๋๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ์์ต๋๋ค.
์ถํ ์๊ฐ์ ๋ ๋, ์ฐ๊ตฌํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค :)
const { LimitedArray, getIndexBelowMaxForKey } = require("./hashTableHelpers");
const HashTable = function() {
this._limit = 8;
this._storage = LimitedArray(this._limit);
};
HashTable.prototype.insert = function(k, v) {
const index = getIndexBelowMaxForKey(k, this._limit);
this._storage.set(index, v);
};
HashTable.prototype.retrieve = function(k) {
const index = getIndexBelowMaxForKey(k, this._limit);
return this._storage.get(index);
};
HashTable.prototype.remove = function(k) {
const index = getIndexBelowMaxForKey(k, this._limit);
this._storage.each((_, i, storage) => {
if (index === i) {
storage.splice(i, 1)
}
})
};
์ถ์ฒ: https://bcho.tistory.com/1072 [์กฐ๋ํ๋ ๋ธ๋ก๊ทธ]