main

해쉬테이블, 해쉬맵

Log
5

알고리즘 스터디에서 해쉬에 대해서 공부하면서 이번에 스터디하고 싶었던 주제는 해쉬였습니다.
최근에 쇼핑관련 회사에서 코테를 봤었는데, 해쉬맵 관련 문제를 많이 내주시더라고요.
저는 주로 객체를 사용해서 문제를 풀었었는데, 해쉬로는 어떻게 풀 수 있고, 장점이 무엇인지 알아보고자 합니다!


해쉬란?

해쉬함수는 key를 고정된 길이의 해시로 변경해주는 역할을 합니다. 이때 해쉬 함수를 통해 키 값을 해시로 변경하는 작업을 해싱이라고 합니다.

즉, 해시 테이블은 (Key, Value)로 데이터를 저장하는 자료구조 중 하나로 빠르게 데이터를 검색할 수 있는 자료구조입니다.

  • 해쉬
    해시는 해시함수의 결과물로, 해시 테이블의 저장소(bucket)을 가리키는 주소(인덱스)로 사용됩니다.
    즉, 해시 값이 값과 매칭되어 저장소에 저장됩니다.

즉 정리해보자면,
해시 함수: key -> hash로 변환해주는 함수
해시: 키 값이 해시 함수로 변환된 것, 저장소의 주소(인덱스)로 사용됨
해시 테이블: hash를 주소 삼아 value를 저장하는 자료구조



해쉬 테이블의 시간복잡도

연산Big-O
삽입평균 O(1), 최악 O(N)
검색평균 O(1), 최악 O(N)
삭제평균 O(1), 최악 O(N)

해시테이블은 Insertion, Search, Deletion에서 평균적으로 O(1)의 시간복잡도를 갖는다. 따라서 매우 빠르게 데이터를 저장하고 탐색, 삭제할 수 있는 효율성이 좋은 자료구조입니다.



해쉬 테이블의 시간복잡도

그럼 해쉬 테이블은 언제 쓰는게 좋을까요?

  • 큰 데이터에서 빠르게 값을 찾아야할 때,
  • 리스트 대신 사용할 수 있을 때, (리스트를 사용한다면 검색할 때, 시간복잡도는 O(n))


자바스크립트의 Map

JS에서 해시테이블은 대표적으로 Object, Map, Set이 있습니다. JS에서 해쉬를 구현할 때에는 Map을 많이 사용하게 됩니다.

Map 객체란?

  • 주로 Object와 비교됨
  • key-value로 이루어진 해시 테이블
  • 탐색은 get(), 삽입은 set()으로 한다.
  • key는 고유값으로써, 단 한개만 존재한다.
  • key 가능 자료형 : number, string, function, object, NaN
  • 이터러블이기때문에 for of문과 스프레드 문법으로 디스트럭처링 할당의 대상이 될 수 있습니다.

Map 객체 생성

const map = new Map();
console.log(map) // Map(0){}
```Map객체는 Map 생성자 함수로 생성합니다.
 
### Map 객체 크기 확인
또한 Map 객체의 요소 개수를 확인할 때는 `Map.prototype.size`프로퍼티를 사용하면 됩니다.
```js
const map = new Map([['key1', 'value1'], ['key2', 'value2']]);
console.log(map.size) // 2

Map 객체 설정 및 삭제

const map = new Map();
map.set('x', 100);
map.set('y', 200);
 
map.delete('x');
map.delete('y');

Map 객체 요소 취득

const map = new Map();
map.set('x', 100);
map.set('y', 200);
 
map.get('x') // 100;

Map 객체 일괄 삭제

const map = new Map();
map.set('x', 100);
map.set('y', 200);
 
map.clear();
console.log(map); // Map(0) {}

Map 객체 순회

Map객체는 배열의 forEach 메서드로 순회할 수도 있고, for문으로도 순회할 수 있습니다. forEach메서드는 기존 배열과 같은 방식으로 돌아주면되고, for문은 아래와 같이 순회할 수 있습니다.

const map = new Map();
map.set('x', 100);
map.set('y', 200);
for(let [key, value] of map){
  console.log(key, value);
}

이외에도 Map.prototype.keys, Map.prototype.values, Map.prototype.entries를 사용할 수 있습니다.


김다은 이모지
Daeun Kim
Junior Frontend Engineer