티스토리 뷰
linkedlist, hashtable에 거의 3일을 쏟아부었다.
개념으로는 이해가 다 되는데 그걸 코드로 구현하는게 굉장히 어려웠고, 날이 넘어가기 바로 전에야 코드를 다 찍을 수 있었다.
내가 멍청해서 우겨댔다고 생각했던 부분을 코드로 구현했고, 다른 어떤것보다 이 부분이 만족스럽다.
class의 기본 개념이 아직 부족해서 this.--를 찍으면 뭐가 어떻게 나오는지 일일이 return 쳐가면서 했어야 했지만
결과는 나름대로 만족스럽다.
하지만 아직 hashtable의 risize는 구현하지 못했다.
페어 분과 접속해 있던 몇몇 페어분들께 여쭤봤지만 아직 공부가 부족해서 완전히 이해를 할 수 없었다.
이해를 할 수 없었기 때문에 로직이고 뭐고 resize함수는 아직도 백지 그대로이다.
자료 좀 더 찾아보고, 코드 구현이 가능할 정도로 이해하고 싶다.
#### 오늘 한 일
* 데이터 스트럭쳐 - linkedlist
ㄴ 혼자서 구현해봤다.
ㄴ 테스트 케이스는 다 통과했지만, 이 과정중에 내 코드랑 상관 없이 통과한 부분도 있었기 때문에
테스트를 통과했다고 완벽하게 구현했다고 보기는 좀 힘들것 같다.
ㄴ 그래도 혼자 해 볼 정도로 개념이해는 된 것 같다.
remove(value) {
this._size -= 1;
//1.해당노드가 헤드일경우
//1-1. 헤드 노드 삭제
//1-2. 헤드.넥스트 노드를 헤드로 지정
//2.해당노드가 중간일경우 [a,b,c,d,e]
//2-1. 중간노드 탐색 c
//2-2. 해당 노드(c) 전의 노드(b).next가 해당노드(c)일 경우 해당 노드 전(b).next = 해당노드(c) .next(d)
//if(this.next === value){
//3.해당노드가 테일일 경우
//3-1. 해당 노드 삭제
if(value === this.head.value){//헤드일 경우
let deleted = this.head
this.head = this.head[this.next]
deleted = null
}
else if(value === this.tail.value){//테일일 경우
let deleted = this.tail
deleted = null;
}
else{//중간일 경우
let prenode = this.head
let deleted = this.head[this.next]
for(let i = 0; i<this._size; i += 1){
if(value === deleted.value){
prenode.next = deleted.next
return deleted = null
}
else{
prenode = prenode[this.next]
deleted = deleted[this.next]
}
}
}
}
ㄴ 내가 구현할 수 없어서 틀렸다고 생각했던 부분. 근데, 그 때의 내 로직으로는 구현할 수 없었던 것이 맞았다.
ㄴ 변수를 두개를 만들어야지만 가능했다.
ㄴ 값이 객체라고 생각해서 delete로 한참을 끙끙댔는데, 결국 답은 다른 곳에 있었다.
ㄴ 아직 class로 찍은 결과값이 제대로 이해가 되지 않았으니 더 공부할 것.
* 데이터 스트럭쳐 - hash table
ㄴ 이해했다고 생각했지만, 그 과정에서 페어분의 버스를 탄 거 같아서 혼자서 구현해 보려고 했다.
ㄴ 인덱스가 같은 값을 넣는 방법이 두 가지가 있었지만 인덱스 값을 바꿔서 넣는것은 로직이 이해가 가질 않아 chaining으로 구현했다.
ㄴ linked list와 마찬가지로 테스트는 통과했지만(resize 제외) 저 테스트 케이스가 모든 경우를 커버하는 것이 아닌 걸 알고 나니
정말로 구현을 한 것인지 의심이 된다.
insert(key, value) {
const index = hashFunction(key, this._limit/*key = 1, this_limit = 8*/);
let bucket = [];
let tuple = [key, value]
bucket.push(tuple)
if(!(this._storage.get(index))){//index값이 storage에 없을 경우
this._storage.set(index,bucket)//{0:[key,value], 1:[[key2,val2],[key3,val3]]}
}
else{//index값이 storage에 있을 경우
for (let i = 0; i<this._storage.get(index).length; i+= 1){
if(this._storage.get(index)[0][0] === key){//key값이 같을 때
return this._storage.set(index,bucket)
}
else if(this._storage.get(index)[0][0] !== key){//key값이 다르지만 index값은 같을 때
this._storage.get(index).push(tuple)
return this._storage.set(index,this._storage.get(index))
}
}
}
//bucket.push(tuple)//bucket = [[v2,v2]]
}
ㄴ 값이 어떻게 들어가는지 하나하나 return을 찍으면서 코딩을 했기 때문에.. 가독성이 굉장히 좋지 않다.
ㄴ 아직까지는 그냥 작동만 하면 되지 정도의 느낌이긴 한데.. 가독성 또한 신경을 써야 할 부분이 맞는 것 같다.
#### 오늘 하려고 한 일
- til 쓰기(빼먹지 않기) o
- 일정끝나고 복습하기 o
- hash table 혼자서 풀어보기 o
- 된다면 linked list도 o
#### 내일 할 일
- resize 자료 찾아보고 이해하기
- 내일 배울 자료구조 이해하기
'TIL' 카테고리의 다른 글
## 2020 0617 스물네번째 TIL (0) | 2020.06.17 |
---|---|
## 2020 0615, 0616 스물세번째 TIL (0) | 2020.06.16 |
## 2020 0612 스물한번째 TIL (0) | 2020.06.13 |
## 2020 0611 스무번째 TIL (0) | 2020.06.11 |
## 2020 0610 열아홉번째 TIL (0) | 2020.06.10 |