Расширение хэш-таблицы - это увеличение количества доступных слотов.Но хеш-функция использует размер таблицы для вычисления хеш-индекса.Если вы расширяете размер таблицы, это означает, что расчеты изменяются, а не только для будущих записей таблицы;для прошлых записей.
Таким образом, алгоритм для расширения должен
- Определить новый размер и создать эту таблицу (пустую)
- Перефразируйте все записи, используя новый размер, и переместите их из старой таблицы в новую таблицу.
- Удалите старую таблицу (которая теперь (концептуально) пуста.
- Новая таблица становится таблица .
Вот и все. Тем не менее, ваш алгоритм расширения разбит на все виды.
int old_table_size =table_size;
table_size*=2; // double the size of the hashtable
string* old_array = new string[table_size]; // ???? This isn't needed
old_array = T; // ???? the memory allocated above was just leaked.
Тогда позже ...
//create a new array with double size
string *new_array = new string[table_size];
//delete the old T
delete[] T; // ??? old table destroyed, now old_array is pointing to ether
T = new_array; // Finally some sanity returns, but old_array is still broken
И наконец ...
for(int i=0; i<table_size/2; i++)
{
insert(old_array[i]); // ???? old_array isn't valid anymore. BAD
}
Это чревато проблемами.
Правильное изменение размера
в соответствии с нашим списком задачИсходя из выше, давайте попробуем это:
void hashtable::resize_array()
{
// remember the old table
int old_table_size = table_size;
std::string *old_array = T;
// build the new table and reset counter
table_size *= 2;
T = new std::string[table_size];
elemts_in_array = 0;
// now bring the elements over
for (int i=0; i<old_table_size; ++i)
{
if (old_array[i].empty())
insert(old_array[i]);
}
// finally, throw out old array
delete[] old_array;
}
Вот и все. Вы могли бы сделать это значительно более эффективным, если бы метод insert
, который принимает ссылку на rvalue, и использование std::move
для пересылки строк без копированияпрямо из старого массива, но основы алгоритма были то, что мы снимали здесь, и я надеюсь, что мУч сделал это через.