Javascript를 배우고 있습니다. 매일 배운 것을 이해한만큼 정리해봅니다.
Binary Search Tree는 Binary Tree 중 하나이고, Binary Tree는 Tree 구조 중 하나이다.
Tree 구조 보다 모양이 더 깔끔해서 맘에 든다.🙆♀️
[출처: https://medium.com/swlh/how-to-solve-a-js-binary-search-tree-problem-585673fc3287 ]
const BinarySearchTree = function(value) {
this.value = value;
this.left = null;
this.right = null;
}
BinarySearchTree.prototype.insert = function(val) {
if(val < this.value) {
if(this.left === null) {
this.left = BinarySearchTree(val);
} else {
this.left.insert(val);
}
} else if(this.value < val) {
if(this.right === null) {
this.right = BinarySearchTree(val);
} else {
this.right.insert(val);
}
}
};
BinarySearchTree.prototype.contains = function(val) {
if(val === this.value) {
return true;
}
if(val < this.value) {
return !!(this.left && this.left.contains(val));
}
if(this.value < val) {
return !!(this.right && this.right.contains(val));
}
};
BinarySearchTree.prototype.depthFirstLog = function(callBack) {
callBack(this.value);
if(this.left) {
this.left.depthFirstLog(callBack);
}
if(this.right) {
this.right.depthFirstLog(callBack);
}
};
정제된 그림으로 보기
[출처: https://bcho.tistory.com/1072]
//Helper Function
const LimitedArray = function(limit) {
const storage = [];
const limitedArray = {};
limitedArray.get = function(index) {
checkLimit(index);
return storage[index]; //[0]
};
limitedArray.set = function(index, value) {
checkLimit(index);
storage[index] = value; //[100] <<[0] = [100]
};
limitedArray.each = function(callback) {
for (let i = 0; i < storage.length; i++) {
callback(storage[i], i, storage);
}
};
// LimitedArray 함수는 제한된 사이즈를 가진 배열에 접근할 수 있게 해준다.
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;
};
// checkLimit 함수는 배열에서 사용할 인덱스가 전체 한계치를 넘지 않고, 숫자 형식으로 나오게끔 알림을 준다.
// "hashing function"
const getIndexBelowMaxForKey = function(str, max) {
let hash = 0;
for (let i = 0; i < str.length; i++) {
hash = (hash << 5) + hash + str.charCodeAt(i); //str[3]
hash &= hash; // Convert to 32bit integer
hash = Math.abs(hash);
}
return hash % max;
}
// 해시테이블에서 사용할 키로 변경해주는 함수이다.: Hash Function이라 부름
이제 Hash Table 구현
const HashTable = function() {
this._size = 0;
this._limit = 8;
this._storage = LimitedArray(this._limit);
}
Hashtable.prototype.insert = function(key, val) {
const index = getIndexBelowMaxForKey(key, this._limit);
const bucket = this._storage.get(index) || [];
for(let i = 0; i < bucket.length; i++) {
const tuple = bucket[i];
if(tuple[0] === key) {
const oldValue = tuple[1];
tuple[1] = value;
return oldValue;
}
}
bucket.push([key, value]);
this._storage.set(index, bucket);
this._size++;
if(this._size > this._limit * 0*75) {
this._resize(this.limit * 2);
}
return;
};
HashTable.prototype.retrieve = function(key) {
const index = getIndexBelowMaxForKey(key, this._limit);
const bucket = this._storage.get(index) || [];
for(let i = 0; i < bucket.length; i++) {
const tuple = bucket[i];
if(tuple[0] === key) {
return tuple[1];
}
}
return ;
};
HashTable.prototype.remove = function(key) {
const index = getIndexBelowMaxForKey(key, this._limit);
const bucket = this._storage.get(index) || [];
for(let i = 0; i < bucket.length; i++) {
const tuple = bucket[i];
if(tuple[0] === key) {
bucket.splice(i, 1);
this._size--;
if(this._size < this._limit * 0.25) {
this._resize(Math.floor(this._limit / 2));
}
return tuple[1];
}
}
return;
}
HashTable.prototype._resize = function(newLimit) {
const oldStroage = this._storage;
newLimit = Math.max(newLimit, 8);
if(newLimit === this._limit) {
return;
}
this._limit = newLimit;
this._storage = LimitedArray(this._limit);
this._size = 0;
oldStorage.each(function(bucket) {
if(!bucket) {
return;
}
for(let i = 0; i < bucket.length; i++) {
const tuple = bucket[i];
this.insert(tuple[0], tuple[1]);
}
});
});