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
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;
}
내가 뭘 몰랐나 확인할 수 있다.