из структур данных Марка Вайса и анализа алгоритма в C++:Каков самый быстрый способ перефразировать?
/**
* Rehashing for quadratic probing hash table.
*/
void rehash()
{
vector<HashEntry> oldArray = array;
// Create new double-sized, empty table
array.resize(nextPrime(2 * oldArray.size()));
for(auto & entry : array)
entry.info = EMPTY;
// Copy table over
currentSize = 0;
for(auto & entry : oldArray)
if(entry.info == ACTIVE)
insert(std::move(entry.element));
}
Похоже, действительно болезненная операция, чтобы пройти через каждый элемент в таблице, и проверять, если элемент активен или не. В частности, существует ли реализация, которая подразумевает только количество вставленных элементов (в отличие от всей таблицы)?
Связанная структура хэша (где записи также связаны как дважды связанный список) позволит вам непосредственно перемещаться по элементам, а не всей таблице (и позволяет вам итерировать таблицу в порядке вставки вместо произвольного порядка). Будет ли это работать? – ShadowRanger
Будет ли это работать в закрытом хэшировании (моя цель)? Для справки: Open Hashing (отдельное цепочка): при открытом хэшировании ключи хранятся в связанных списках, прикрепленных к ячейкам хеш-таблицы. Закрытое Хеширование (Открытое Адресация): при закрытом хэшировании все ключи хранятся в самой хэш-таблице без использования связанных списков. – blueman
Вам нужно только перефразировать, когда количество вставленных элементов составляет, по меньшей мере, половину размера таблицы, поэтому никоим образом не стоит проверять все ячейки таблицы. –