Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 탈중앙화
- kubernetes
- Three
- game
- Docker
- 게임
- 젤다 왕눈
- 시장
- strongloop
- 리뷰
- threejs
- 비트코인
- 보안
- 스마트 컨트랙트
- 블록체인
- Linux
- Games
- 부동산
- 거래
- review
- ps4
- angular
- loopback
- 스마트 계약
- 이더리움
- 암호화폐
- 쿠버네티스
- 투자
- 주식
- PC
Archives
- Today
- Total
BaeBox
HashSet(해시셋) with JavaScript 본문
반응형
* node 에서는 기본적으로 class를 사용하지 못하므로 babel을 사용해야 한다. 적용법은 최하단 링크에 있다. 귀찮으면 아래 링크의 git을 clone을 하시면 된다.
HashSet : Hash를 이용한 Set 기능. 집합이므로 동일한 값들은 무시된다.
그냥 Set 기능 쓰면 되는데... 왜 하느냐!! 그냥...
class CustomHashSet {
data = {};
length = 0;
// _default = new Date();
contains = (val) => {
val = val.toString();
return (!!this.data[val] && this.data.hasOwnProperty(val));
};
add = (val) => {
if (!this.contains(val.toString())) {
this.length++;
}
this.data[val.toString()] = val;
};
remove = (val) => {
val = val.toString();
if (!this.contains(val)) {
return false;
} else {
delete this.data[val.toString()];
this.length--;
return true;
}
};
clear = () => {
for (var val in this.data) {
if (this.data.hasOwnProperty(val)) {
delete this.data[val];
}
}
this.length = 0;
}
isEmpty = () => (this.length === 0);
getSize = () => this.length;
toArray = () => {
const arr = [];
for (let [key, value] of Object.entries(this.data)) {
arr.push(value);
}
return arr;
}
}
const cHashSet = new CustomHashSet();
for (let i = 0; i< 10; i++){
cHashSet.add(`value ${i}`);
}
console.log(cHashSet.toArray());
구글 보니까 이렇게 작성된 코드가 있더라. 내가 살짝 손봤다.
아쉬운 점이 있는데 정작 제일 중요한 hash 부분을 그냥 JSON을 가져다 썼다는 점이다.
그래서 새로 만들었다.
const hash = (string, storageSize) => {
let hash = 0;
for (let i = 0; i < string.length; i++) hash += string.charCodeAt(i);
return hash % storageSize;
};
class HashSet {
storage;
size;
constructor(size) {
this.storage = [];
this.size = size;
}
add(value) {
const index = hash(value, this.size);
if (!this.storage[index]) {
this.storage[index] = [value];
} else {
const res = this.storage[index].find(each => each === value);
res ? null : this.storage[index].push(value);
}
}
}
const hSet = new HashSet(23);
for (let i = 0; i < 17; i++){
hSet.add(`Node ${Math.round(Math.random() * 10)}`);
}
console.log(hSet.storage);
Separate Chaining 방식을 이용하였지만, Object를 사용하지 않고, 배열을 사용하였다. 귀찮았어요
https://github.com/iamdap91/basic-data-structure
http://jeonghwan-kim.github.io/2016/07/19/babel.html
반응형
'개발 관련' 카테고리의 다른 글
QuickSort(퀵정렬) with JavaScript (0) | 2020.04.21 |
---|---|
Trie(트리, 트라이) with JavaScript (0) | 2020.04.20 |
HashTable(해시테이블) with JavaScript (0) | 2020.04.20 |
Tree(트리) with JavaScript (0) | 2020.04.19 |
LinkedList(연결 리스트) with JavaScript (0) | 2020.04.19 |
Comments