class DoubleHashing extends SeparateChainingHash {
constructor(...args) {
super(...args);
}
resetHash() {
for (let i = 0; i < this.length; i++) { this[i] = undefined; }
}
find(key) {
let i = h(key.charCodeAt(), this.length);
while(this[i] !== undefined && this[i] !== key) {
i += g(key.charCodeAt(), this.length);
i = i % this.length;
}
return i;
}
insert(key, rehash) {
if (key !== "Deleted") {
let i = this.find(key);
if (this[i] === key) {
throw `This key already exists: ${key}`
};
this[i] = key;
if (!rehash) this.keys.push(key);
let lamb = this.keys.length / this.length;
if (lamb > this.lambMax) this.rehash();
}
}
remove(key) {
let i = this.find(key);
if (this[i] === undefined) {
throw `This key does not exist: ${key}`
};
this[i] = "Deleted";
this.keys = this.keys.filter(item => item !== key);
this.keys.push("Deleted");
let lamb = this.keys.length / this.length;
if (lamb < this.lambMin) this.rehash();
}
}