Вопрос проверяет понимание временной сложности операций в хеш-таблицах и факторов, влияющих на производительность.
Хеш-таблица — это структура данных, которая обеспечивает быстрый доступ к элементам по ключу. В идеальных условиях поиск, вставка и удаление выполняются за константное время O(1). Однако на практике это не всегда так.
Основная проблема — коллизии, когда два разных ключа дают одинаковый хеш. Для их разрешения используются методы, такие как цепочки (chaining) или открытая адресация (open addressing). При цепочках каждая корзина хранит связный список элементов. Если коллизий много, длина списка растет, и поиск в нем становится линейным O(n).
// Простая хеш-таблица с цепочками
class HashTable {
constructor(size) {
this.table = new Array(size);
}
hash(key) {
let hash = 0;
for (let i = 0; i < key.length; i++) {
hash += key.charCodeAt(i);
}
return hash % this.table.length;
}
set(key, value) {
const index = this.hash(key);
if (!this.table[index]) {
this.table[index] = [];
}
// Добавляем или обновляем элемент
for (let pair of this.table[index]) {
if (pair[0] === key) {
pair[1] = value;
return;
}
}
this.table[index].push([key, value]);
}
get(key) {
const index = this.hash(key);
const bucket = this.table[index];
if (bucket) {
for (let pair of bucket) {
if (pair[0] === key) {
return pair[1];
}
}
}
return undefined;
}
}В этом примере, если все ключи попадут в одну корзину, метод get будет проходить по всему списку, что даст O(n).
Хеш-таблицы дают O(1) в среднем, но не гарантируют этого в худшем случае. Для критичных к производительности приложений стоит учитывать возможность коллизий и выбирать подходящие структуры данных или настройки.