insert — Реализация хеш-таблиц в C ++ (вставка и отложенное удаление)

Я реализую класс Hashtable в C ++.
Метод разрешения коллизий, который я использую, — это линейное зондирование с отложенным удалением.
Я видел реализации этого, но у меня был вопрос относительно метода вставки.
Каждая ячейка хеш-таблицы имеет состояние (активно, удалено, пусто). По какой-то причине в реализации, которую я видел при вставке нового элемента, они хешируют ключ и затем проверяют таблицу, пока не будет найдена пустая ячейка (или пока не будет найдена ячейка, уже содержащая тот же ключ).

Пример кода:

int findPos(const string &key){
int currentPos=hash(key);
while(data[currentPos].state!=EMPTY && data[currentPos].key!=key){
currentPos++;
if (currentPos>=data.size())
currentPos-=data.size()
}
return currentPos;
}

bool insert(const string &key){
int currentPos=findPos(key);
if (isActive(currentPos))
return false; //already exists
data[currentPos]=hashEntry(key,ACTIVE);
if (++currentSize>data.size()/2)
rehash();
return true;   //element inserted
}

Мой вопрос: есть ли причина не останавливаться и вставлять в ячейку, которая была помечена как удаленная? Другими словами, в findPos почему бы не изменить оператор while на while(data[currentPos].state==ACTIVE && data[currentPos].key!=key) так что цикл заканчивается либо когда мы находим ячейку с ключом, либо первую удаленную / пустую ячейку. Затем во вставке проверьте состояние ячейки. Если активная запись уже существует, верните false; еще вставьте элемент.

5

Решение

Ключ мог быть вставлен дальше, и позже одна из промежуточных ячеек могла быть помечена как удаленная. Затем вы вставите дубликат экземпляра того же ключа.

3

Другие решения

Возможно, у вашего ссылочного кода не было отложенного удаления, или состояние DELETED было добавлено к существующей реализации. Да, вы можете безопасно «восстановить» запись для вашего ключа. Но убедитесь, что этот алгоритм используется последовательно, чтобы избежать ситуации, описанной в ответе @Thomas.

0

По вопросам рекламы [email protected]