본문 바로가기
2. 우당탕탕 개발자/2-1. 공부기록

15Dec2019 TIL

by Little Monkey 2019. 12. 15.
반응형

Today I learned : 

  • Hash Table Implementation

 


 

더보기

오늘의 생각 : 

오늘 꽃꽃이는 향나무를 가지고 크리스마스 트리를 만들었다! 너무 귀엽다 ㅠㅠ
조만간 블로그에 취미 생활에 대한 포스팅을 해야지! (도대체 언제 할건지..ㅎㅎ;;)

구글링과 학습 자료를 통해서 해쉬 테이블 리사이징 하는 부분 구현을 해냈다.

코드가 보기 좋게 작성된 건 아니지만, 일단 기능이 내가 의도한 대로 작동하는 것에 만족.

 

화상 영어 30분 하고, 저녁 간단하게 삶은 계란으로 해결하고,

집 앞 공원 산책 30분 하고, 집안일 하고, 사피엔스 2챕터 읽고 자면 주말 끝! 

 

다음 주 일요일은 달랏에 여행갈 거니 이번주는 빡세게 열공+운동+열일 해야지!

 

Hash Table - Pseudoclassical Style 로 구현하기 

(나는 왕초보니까..  하단의 코드는 좋은 답이 절대절대 아님을 참고해주시길^^;;)

일단, 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;
};

 

내가 구현한 Hash Table Code 는 다음과 같다. (정답 아님 주의! 코드 더러움 주의!)

const HashTable = function() {
  this._limit = 8;
  this._storage = LimitedArray(this._limit);
  this._length = 0;
  this._cashe = {};
};

HashTable.prototype.checkSize = function() {
  if (this._length >= this._limit * 0.75) this.resizeUp();
  else if (this._length < this._limit * 0.25) this.resizeDown();
  else this.sizeSame();
};

HashTable.prototype.resizeUp = function() {
  this._limit = this._limit * 2;
  let newStorage = LimitedArray(this._limit);
  for (let key in this._cashe) {
    const index = getIndexBelowMaxForKey(this._cashe[key], this._limit);
    newStorage[index] = key;
  }
  this._storage = newStorage;
};

HashTable.prototype.resizeDown = function() {
  this._limit = (this._limit * 1) / 2;
  let newStorage = LimitedArray(this._limit);
  for (let key in this._cashe) {
    const index = getIndexBelowMaxForKey(this._cashe[key], this._limit);
    newStorage[index] = key;
  }
  this._storage = newStorage;
};

HashTable.prototype.sizeSame = function() {
  this._limit;
};

HashTable.prototype.insert = function(k, v) {
  if (!(v in this._cashe)) {
    this._length++;
    this.checkSize();
    const index = getIndexBelowMaxForKey(k, this._limit);
    if (index in this._storage) {
      this.resizeUp();
      const index = getIndexBelowMaxForKey(k, this._limit);
      this._storage[index] = v;
      this._cashe[v] = k;
    }
    this._storage[index] = v;
    this._cashe[v] = k;
  }
};

HashTable.prototype.retrieve = function(k) {
  const index = getIndexBelowMaxForKey(k, this._limit);
  return this._storage[index];
};

HashTable.prototype.remove = function(k) {
  const index = getIndexBelowMaxForKey(k, this._limit);
  if (index in this._storage) {
    delete this._cashe[this._storage[index]];
    delete this._storage[index];
    this._length = Object.keys(this._cashe).length;
    this.checkSize();
  }
};
반응형

'2. 우당탕탕 개발자 > 2-1. 공부기록' 카테고리의 다른 글

17Dec2019 TIL  (0) 2019.12.18
16Dec2019 TIL  (0) 2019.12.17
14Dec2019 TIL  (0) 2019.12.14
13Dec2019 TIL  (0) 2019.12.14
11Dec2019 TIL  (0) 2019.12.14

댓글