2021년 1월 20일 복기 (TIL Linked List & Hash Table)

Ji Taek Lim·2021년 1월 20일
0

https://codeburst.io/linked-lists-in-javascript-es6-code-part-1-6dd349c3dcc3

https://www.freecodecamp.org/news/implementing-a-linked-list-in-javascript/

강사님의 블로그
https://velog.io/@riceintheramen/Linked-list

https://boycoding.tistory.com/33

HASH TABLE


getHashCode(key)

K E Y

ASCI(K) + ASCI(E) + ASCI(Y) = HASH CODE

getter 랑 setter가 엄청 헷갈린다. 모시 할때 렉쳐에 나왔는데

모시님의 강의

https://www.youtube.com/watch?v=bl98dm7vJt0

const person = {
  firstName: 'Mosh',
  lastName: 'Hamedani',
  get fullName() {
    return `${person.firstName} ${person.lastName}`
  },
  set fullName(value) {
    const parts =value.split(' ');
    this.firstName = parts[0];
    this.lastName = parts[1];
  }
};

person.fullName ='John Smith' -> overwrite한다.


getters => access properties
setters => change (mutate) them

console.log(person.fullName)
getter
return type은 참조할 맴버변수의 자료형과 일치해야 한다.
이름 앞에 get 을 붙이고 뒤에는 리턴할 맴버변수의 이름 혹은 해당 변수를 직관적으로 표현하는 단어가 와야한다.
ex) int getLength();

setter
return type은 void 혹은 값의 설정 결과를 알려줄 수 있는 type이어야 한다.
argument는 수정할 맴버변수와 같은 type이어야 한다.
이름 앞에 set을 붙이고 뒤에는 수정할 맴버변수의 이름 혹은 해당 변수를 직관적으로 표현하는 단어이어야 한다.
ex) void setLength(int length);

https://ko.javascript.info/property-accessors

그러니까 내가 이해한거는

Hash Table에 '고양이' '야옹야옹'을 집어넣는거야

일단 이 코드가 이해하기가 훨씬 편하다

  insert(key, value) {
    
    const index = hashFunction(key, this._bucketNum); /// aski 생성
    let storage = this._storage;
    if (storage[index] === undefined) {
      storage[index] = [
        [key, value]
      ];
    } else {
      let inserted = false;
      for (let i = 0; i < storage[index].length; i++) {
        if (storage[index][i][0] === key) {
          storage[index][i][1] === value;
          inserted = true;
        }
      }
      if (inserted === false) {
        storage[index].push([key, value]);
      }
    }
  }
this.remove = function(key) {
  let index = hash(key,storageLimit);
  if(storage[index].length ===1 && storage[index][0][0]=== key) {
    delete storage[index];
  }else {
    for(let i=0; i<storage[index]; i++) {
      if(storage[index][i][0] === key) {
        delete storage[index][i]
      }
    }
  }
}


this.lookup = function(key) {
  let index = hash(key, storageLimit);
  if(storage[index] === undefined) {
    return isUndefined;
  }else {
    for(let i=0; i<storage[index].length; i++) {
      if(storage[index][i][0] === key) {
        return storage[index][i][1];
      }
    }
  }
}

그리고 이걸 적용해보면

 '고양이' '야옹야옹'
   -> 고양이나 멍멍이나 아마 아스키 코드가 똑같을 것이다.
   '멍멍이' '왈왈'
   
  insert(key, value) { 
   
    const index = hashFunction(key, this._bucketNum); 
    
    -> aski 생성 index가 아스키 고양이가 숫자가 됨

    let storage = this._storage;
    let storeIdx = storage.get(index); 
-> get이라는 함수를 이용하여서 value로 만들어준다.
->-> strorage[index] -> storage['486'] 
    let bucket = {};
    if (storeIdx) {
     ->저장소에 해당 인덱스에 대한 정보가 있다
      storeIdx = bucket; 
      ->임의의 버켓에 할당한다. storage['486'] ={}
      bucket[key] = value;
      -> {고양이:야옹야옹}
      storage.set(index, bucket);
      ->storage['486']=[{고양이:야옹야옹}]
    } else {
      ->저장소에 해당 인덱스에 대한 정보가 없다.
      -> 첫번째 경우기 위 참조.
      bucket[key] = value;
      storage.set(index, bucekt); 
    }
    
    -> setter 가 값을 변경한다.
    아마 저 위에 아니고 ['486': {고양이:야옹야옹}]이 되는건지. 헷갈린다.
    
    '멍멍이:왈왈" 이 들어가면 tuple이 된다.
	overwrite 된다 -> X
	덮어씌워지는 건 아니고 충돌이 일어난다.
    -> tuple이 된다.
    [{486: {'고양이':'야옹야옹'}}]
             
storage = [{index : {bucket}}]
    

renewal version

  insert(key, value) {
    // 고양이 야옹야옹 -> 고양이를 아스키 코드로 바꾼다. 그리고 아스키 코드를
    const index = hashFunction(key, this._bucketNum); /// aski 생성

    let storage = this._storage;
    let capacity = this._bucketNum;
    let bucket = {};
    let storedIdx = storage.get(index); /// get이라는 함수를 이용하여서 value로 만들어준다. [{index : {key : value}}]
    if (storedIdx) {
      /// [{index : {key : value}}]
      /// 저장소에 해당 인덱스에 대한 정보가 있다
      bucket = storedIdx; /// 임의의 버켓에 할당한다.  // {index : {key1 : value1}}
      bucket[key] = value; /// {key2: value2}
      storage.set(index, bucket); ///[{index : {key2 : value2}}]
    } else {
      /// 저장소에 해당 인덱스에 대한 정보가 없다. [] -> {key: value} -> [{index: {key: value}}]
      bucket[key] = value;
      storage.set(index, bucket); // 새로 덮어준다.
    }
    storage++;
    if ((storage / capacity) * 100 > 75) {
      // 데이터의 저장 공간이 75%이상 찼다면
      this._resize(capacity * 2); // 제한된 저장 공간을 확장
    }
    return storage;
  }

내가 뭘 몰랐나 확인할 수 있다.

Tuple

https://blog.naver.com/PostView.nhn?blogId=soj12345&logNo=221373403400&parentCategoryNo=&categoryNo=14&viewDate=&isShowPopularPosts=false&from=postView

profile
임지택입니다.

0개의 댓글

관련 채용 정보