<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
function hashTable() {
this.storage = [];
this.count = 0;
this.limit = 7;
hashTable.prototype.hashFunc = function(str, size) {
var hashCode = 0;
for (var i = 0; i < str.length; i++) {
hashCode = hashCode * 37 + str.charCodeAt(i);
}
hashCode = hashCode % size;
return hashCode;
}
hashTable.prototype.put = function(key, value) {
var index = this.hashFunc(key, this.limit);
var bucket = this.storage[index];
if (bucket == null) {
bucket = [];
this.storage[index] = bucket;
}
for (var i = 0; i < bucket.length; i++) {
var tuple = bucket[i];
if (key == tuple[0]) {
tuple[1] = value;
return;
}
}
bucket.push([key, value]);
this.count += 1;
if (this.count > this.limit * 0.75) {
this.reLimit(this.limit * 2);
}
return;
}
hashTable.prototype.get = function(key) {
var index = this.hashFunc(key, this.limit);
var bucket = this.storage[index];
if (bucket == null) {
console.log('找不到');
return;
}
for (var i = 0; i < bucket.length; i++) {
var tuple = bucket[i];
if (tuple[0] == key) {
return tuple[1];
}
}
}
hashTable.prototype.remove = function(key) {
var index = this.hashFunc(key, this.limit);
var bucket = this.storage[index];
if (bucket == null) {
console.log('没有你要删除的元素');
return;
}
for (var i = 0; i < bucket.length; i++) {
var tuple = bucket[i];
if (tuple[0] == key) {
bucket.splice(i, 1);
break;
}
}
this.count -= 1;
if (this.limit > 7 && this.count < this.limit * 0.25)
this.reLimit(this.limit / 2);
return tuple[1];
}
hashTable.prototype.reLimit = function(newLimit) {
while (!this.isPrime(newLimit)) {
newLimit += 1;
}
this.oldStorage = this.storage;
this.storage = [];
this.count = 0;
this.limit = newLimit;
for (var i = 0; i < this.oldStorage.length; i++) {
var bucket = this.oldStorage[i];
if (bucket == null) {
continue;
}
for (var j = 0; j < bucket.length; j++) {
var tuple = bucket[j];
this.put(tuple[0], tuple[1]);
}
}
}
hashTable.prototype.isPrime = function(num) {
var temp = parseInt(Math.sqrt(num));
for (var i = 2; i <= temp; i++) {
if (num % i == 0) {
return false;
}
}
return true;
}
}
var hash = new hashTable();
hash.put('abc', 555);
hash.put('cba', 666);
hash.put('nba', 777);
hash.put('grx', 222);
hash.put('frd', 333);
hash.put('lov', 999);
console.log(hash.get('abc'));
console.log(hash.get('cba'));
console.log(hash.get('nba'));
console.log(hash.remove('abc'));
console.log(hash);
</script>
</body>
</html>
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交