Anonymous
Пользовательская проблема HashMap с изменяемым размером в JavaScript,
Сообщение
Anonymous » 02 янв 2026, 23:19
Я работал над:
https://www.theodinproject.com/lessons/ ... pt-hashmap
Но в последнее время я изо всех сил пытаюсь реализовать задачу по реализации хэш-карты с изменяемым размером.
До изменения размера hashMap все работает как задумано, но после изменения размера (когда добавляются пары значений ключа 12-14) и повторного хэширования удаленный ключ2 снова оказывается в hashMap.
Код: Выделить всё
class ResizableHashMap {
constructor(initialCapacity = 16, loadFactor = 0.75) {
this.buckets = new Array(initialCapacity).fill(null).map(() => []);
this.size = 0;
this.loadFactor = loadFactor;
}
hash(key) {
let hashCode = 0;
for (let char of key.toString()) {
hashCode += char.charCodeAt(0);
}
return hashCode % this.buckets.length;
}
set(key, value) {
if ((this.size + 1) / this.buckets.length > this.loadFactor) {
this.resize();
}
const index = this.hash(key);
const bucket = this.buckets[index];
for (let pair of bucket) {
if (pair[0] === key) {
pair[1] = value;
return;
}
}
bucket.push([key, value]);
this.size++;
}
resize() {
const newCapacity = this.buckets.length * 2;
const newBuckets = new Array(newCapacity).fill(null).map(() => []);
for (let bucket of this.buckets) {
for (let [key, value] of bucket) {
const index = this.hash(key) % newCapacity;
newBuckets[index].push([key, value]);
}
}
this.buckets = newBuckets;
}
// Delete key-value pair
delete(key) {
const index = this.hash(key);
const bucket = this.buckets[index];
for (let i = 0; i < bucket.length; i++) {
if (bucket[i][0] === key) {
bucket.splice(i, 1);
this.size--;
return true;
}
}
return false;
}
}
// Usage Example
const resizableHashMap = new ResizableHashMap();
resizableHashMap.set("key1", "value1");
resizableHashMap.set("key2", "value2");
resizableHashMap.set("key3", "value3");
resizableHashMap.set("key4", "value4");
resizableHashMap.set("key5", "value5");
resizableHashMap.set("key6", "value6");
resizableHashMap.set("key7", "value7");
resizableHashMap.set("key8", "value8");
resizableHashMap.set("key9", "value9");
resizableHashMap.set("key10", "value10");
resizableHashMap.set("key11", "value11");
// if these lines are commented out, it works as intended
resizableHashMap.set("key12", "value12");
resizableHashMap.set("key13", "value13");
resizableHashMap.set("key14", "value14");
resizableHashMap.set("key1", "updatedValue1");
// console.log(resizableHashMap);
resizableHashMap.delete("key2");
// console.log(resizableHashMap);
console.log(resizableHashMap.size);
// Output: 15, but should be 13 (added 14 keys and deleted 1)
Подробнее здесь:
https://stackoverflow.com/questions/798 ... javascript
1767385162
Anonymous
Я работал над: https://www.theodinproject.com/lessons/javascript-hashmap Но в последнее время я изо всех сил пытаюсь реализовать задачу по реализации хэш-карты с изменяемым размером. До изменения размера hashMap все работает как задумано, но после изменения размера (когда добавляются пары значений ключа 12-14) и повторного хэширования удаленный ключ2 снова оказывается в hashMap. [code]class ResizableHashMap { constructor(initialCapacity = 16, loadFactor = 0.75) { this.buckets = new Array(initialCapacity).fill(null).map(() => []); this.size = 0; this.loadFactor = loadFactor; } hash(key) { let hashCode = 0; for (let char of key.toString()) { hashCode += char.charCodeAt(0); } return hashCode % this.buckets.length; } set(key, value) { if ((this.size + 1) / this.buckets.length > this.loadFactor) { this.resize(); } const index = this.hash(key); const bucket = this.buckets[index]; for (let pair of bucket) { if (pair[0] === key) { pair[1] = value; return; } } bucket.push([key, value]); this.size++; } resize() { const newCapacity = this.buckets.length * 2; const newBuckets = new Array(newCapacity).fill(null).map(() => []); for (let bucket of this.buckets) { for (let [key, value] of bucket) { const index = this.hash(key) % newCapacity; newBuckets[index].push([key, value]); } } this.buckets = newBuckets; } // Delete key-value pair delete(key) { const index = this.hash(key); const bucket = this.buckets[index]; for (let i = 0; i < bucket.length; i++) { if (bucket[i][0] === key) { bucket.splice(i, 1); this.size--; return true; } } return false; } } // Usage Example const resizableHashMap = new ResizableHashMap(); resizableHashMap.set("key1", "value1"); resizableHashMap.set("key2", "value2"); resizableHashMap.set("key3", "value3"); resizableHashMap.set("key4", "value4"); resizableHashMap.set("key5", "value5"); resizableHashMap.set("key6", "value6"); resizableHashMap.set("key7", "value7"); resizableHashMap.set("key8", "value8"); resizableHashMap.set("key9", "value9"); resizableHashMap.set("key10", "value10"); resizableHashMap.set("key11", "value11"); // if these lines are commented out, it works as intended resizableHashMap.set("key12", "value12"); resizableHashMap.set("key13", "value13"); resizableHashMap.set("key14", "value14"); resizableHashMap.set("key1", "updatedValue1"); // console.log(resizableHashMap); resizableHashMap.delete("key2"); // console.log(resizableHashMap); console.log(resizableHashMap.size); // Output: 15, but should be 13 (added 14 keys and deleted 1)[/code] Подробнее здесь: [url]https://stackoverflow.com/questions/79859400/custom-resizable-hashmap-problem-in-javascript[/url]