Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

자바스크립트로 해시 테이블 구현하기

이제 해시 테이블의 각 메서드를 정의하는 데 사용할 간단한 클래스를 만들어 보겠습니다. 해시 테이블 데이터를 담을 컨테이너 객체를 생성하고, 테이블의 내용을 출력하는 display 함수도 함께 작성합니다. 충돌(collision) 해결 방식으로는 체이닝(chaining) 기법을 사용합니다.

display 함수는 테이블의 각 엔트리(해시된 값)를 순회하며, 해당 위치에 연결된 모든 키-값 쌍을 출력하는 역할을 합니다.

예제

키-값 쌍을 저장하기 위해 프로토타입에 새로운 클래스(KVPair)도 추가합니다.

class HashTable {
    constructor() {
        this.container = [];
        // 충돌 발생 시 더 많은 요소를 추가할 수 있도록
        // 빈 배열로 컨테이너를 초기화합니다
        for(let i=0; i < 11; i ++ ) {
            this.container.push([]);
        }
        display() {
            this.container.forEach((value, index) => {
                let chain = value
                .map(({ key, value }) => `{ ${key}: ${value} }`)
                .join(" --> ");
                console.log(`${index}: ${chain}`);
            });
        }
        hash(key) {
            return key % 11;
        }
    }
    HashTable.prototype.KVPair = class {
        constructor(key, value) {
            this.key = key;
            this.value = value;
        }
    }
}

핵심 개념 정리

  • 해시 함수(hash): 키를 배열의 인덱스로 변환하는 역할을 합니다. 위 예제에서는 key % 11을 사용하여 0부터 10 사이의 인덱스 값을 얻습니다.
  • 체이닝(chaining): 서로 다른 키가 같은 인덱스로 해시되는 충돌이 발생했을 때, 해당 인덱스의 배열에 여러 개의 키-값 쌍을 연결 형태로 저장하는 방식입니다. 덕분에 하나의 버킷에 여러 데이터를 안전하게 보관할 수 있습니다.

display 메서드에서는 구조 분해 할당(destructuring)과 같은 자바스크립트의 고급 문법을 활용했습니다. 이를 통해 객체에서 keyvalue를 꺼내는 반복적인 코드(boilerplate)를 줄이고, 훨씬 간결하고 가독성 높은 코드를 작성할 수 있습니다.