import LinkedList from '../linked-list/LinkedList';
const defaultHashTableSize = 32;
export default class HashTable {
constructor(hashTableSize = defaultHashTableSize) {
// 해시 테이블을 만들고 각 버킷을 빈 연결 리스트로 채움
this.buckets = Array(hashTableSize).fill(null).map(() => new LinkedList());
this.keys = {};
}
// 해시 함수: key 문자열을 해시 번호로 변환
hash(key) {
// 단순화 하기 위해 키의 모든 문자의 문자 코드 합계를 사용하여 해시를 계산합니다.
// 그러나 충돌 횟수를 줄이기 위해 다항식 문자열 해시와 같은 보다 정교한 방식을 사용할 수도 있습니다.
// hash = charCodeAt(0) * PRIME^(n-1) + charCodeAt(1) * PRIME^(n-2) + ... +
// charCodeAt(n-1) 여기서 charCodeAt(i)는 키의 i번째 문자 코드이고
// n은 키의 길이이며 PRIME은 31과 같은 임의의 소수입니다.
const hash = Array.from(key).reduce((hashAccumulator, keySymbol) => {
hashAccumulator + keySymbol.charCodeAt(0)
}, 0);
// 해시 테이블 크기에 맞도록 해시 수를 줄입니다.
return hash % this.buckets.length;
}
set(key, value) {
const keyHash = this.hash(key); // 해시 코드
this.keys[key] = keyHash; // 해시코드를 keys 객체에 저장
// 버킷에서 해시코드에 해당하는 연결 리스트를 가져옴
const bucketLinkedList = this.buckets[keyHash];
// 버킷연결리스트에서 동일한 키를 가진 노드가 있는지 탐색
const node =
bucketLinkedList.find(
{ callback: (nodeValue) => nodeValue.key === key }
);
if (!node) {
// 동일한 키를 가진 노드가 없다면 새 노드를 삽입
bucketLinkedList.append({ key, value });
} else {
// 동일한 키를 가진 노드가 있다면 값 업데이트
node.value.value = value;
}
}
delete(key) {
const keyHash = this.hash(key); // 해시 코드
delete this.keys[key]; //
const bucketLinkedList = this.buckets[keyHash];
const node = bucketLinkedList.find(
{ callback: (nodeValue) => nodeValue.key === key }
);
if (node) {
return bucketLinkedList.delete(node.value);
}
return null;
}
get(key) {
const bucketLinkedList = this.buckets[this.hash(key)];
const node = bucketLinkedList.find(
{ callback: (nodeValue) => nodeValue.key === key }
);
return node ? node.value.value : undefined;
}
has(key) {
return Object.hasOwnProperty.call(this.keys, key);
}
getKeys() {
return Object.keys(this.keys);
}
getValues() {
return this.buckets.reduce((values, bucket) => {
const bucketValues = bucket.toArray()
.map((linkedListNode) => linkedListNode.value.value);
return values.concat(bucketValues);
}, []);
}
}
Github | tech-interview-for-developer
Github | Interview_Question_for_Beginner
Github | javascript-algorithms | trekhleb
Photo by Alain Pham on Unsplash