## Hash Table : 키, 값 쌍을 저장하고 있는 자료구조
hash function
을 거쳐 storage
에 있는 bucket
에 객체와 비슷한 형태로 key 와 value
(tuples) 로 저장이 된다. 그래서 key 를 입력 하게 되면 value 가 출력 되는 형태이다.insert(key, value) - 주어진 키와 값을 저장합니다. 이미 해당 키가 저장되어 있다면 값을 덮어씌웁니다.
retrieve(key) - 주어진 키에 해당하는 값을 반환합니다. 없다면 undefined를 반환합니다.
remove(key) - 주어진 키에 해당하는 값을 삭제하고 값을 반환합니다. 없다면 undefined를 반환합니다.
_resize(newLimit) - 해시 테이블의 스토리지 배열을 newLimit으로 리사이징하는 함수입니다. 리사이징 후 저장되어 있던 값을 전부 다시 해싱을 해주어야 합니다. 구현 후 HashTable 내부에서 사용하시면 됩니다.
insert(key, value) { const index = hashFunction(key, this._limit); let buket = this._storage.get(index) if(buket === undefined){ buket = {} } buket[key]=value this._storage.set(index, buket) this._size++ if(this._size > this._limit*0.75){ this._resize(this._limit*2) } }
retrieve(key) { const index = hashFunction(key, this._limit); let buket = this._storage.get(index) if(buket===undefined){ return undefined } return buket[key] }
remove(key) { const index = hashFunction(key, this._limit); let buket = this._storage.get(index) let result = buket[key] delete buket[key] this._size-- if(this._size < this._limit*0.25){ this._resize(this._limit/2) } return result; }
_resize(newLimit) { let old = this._storage this._size = 0 this._limit = newLimit this._storage = LimitedArray(newLimit) old.each((buket)=>{ for(let key in buket){ this.insert(key , buket[key]) } }) return this._storage }