хэш-таблица с двумя зондами

Я пытаюсь отредактировать свою хеш-таблицу, чтобы сформировать класс двойного хеширования, но, похоже, не могу понять, что это правильно.

Мне было интересно, есть ли у кого-нибудь понимание. Мне сказали, что все, что мне нужно было сделать, это отредактировать findPos (), где я теперь должен предоставить новые зонды, используя новую стратегию.

** Я провел некоторое исследование, и оно говорит, что при двойном зондировании вы будете использовать R- (x mod R), где R> размер и простое число меньше размера таблицы. Так я делаю новую функцию перефразирования?

вот мой код:

template <typename HashedObj>
class HashTable
{
public:
explicit HashTable( int size = 101 ) : array( nextPrime( size ) )
{ makeEmpty( ); }

bool contains( const HashedObj & x ) const
{
return isActive( findPos( x ) );
}

void makeEmpty( )
{
currentSize = 0;
for( auto & entry : array )
entry.info = EMPTY;
}

bool insert( const HashedObj & x )
{
// Insert x as active
int currentPos = findPos( x );
if( isActive( currentPos ) )
return false;

if( array[ currentPos ].info != DELETED )
++currentSize;

array[ currentPos ].element = x;
array[ currentPos ].info = ACTIVE;
// Rehash;
if( currentSize > array.size( ) / 2 )
rehash( );
return true;
}

bool insert( HashedObj && x )
{
// Insert x as active
int currentPos = findPos( x );
if( isActive( currentPos ) )
return false;

if( array[ currentPos ].info != DELETED )
++currentSize;

array[ currentPos ] = std::move( x );
array[ currentPos ].info = ACTIVE;

// Rehash; see Section 5.5
if( currentSize > array.size( ) / 2 )
rehash( );

return true;
}

bool remove( const HashedObj & x )
{
int currentPos = findPos( x );
if( !isActive( currentPos ) )
return false;

array[ currentPos ].info = DELETED;
return true;
}

enum EntryType { ACTIVE, EMPTY, DELETED };

private:
struct HashEntry
{
HashedObj element;
EntryType info;

HashEntry( const HashedObj & e = HashedObj{ }, EntryType i = EMPTY )
: element{ e }, info{ i } { }

HashEntry( HashedObj && e, EntryType i = EMPTY )
: element{ std::move( e ) }, info{ i } { }
};

vector<HashEntry> array;
int currentSize;

bool isActive( int currentPos ) const
{ return array[ currentPos ].info == ACTIVE; }

int findPos( const HashedObj & x ) const
{
int offset = 1;
int currentPos = myhash( x );

while( array[ currentPos ].info != EMPTY &&
array[ currentPos ].element != x )
{
currentPos += offset;  // Compute ith probe
offset += 2;
if( currentPos >= array.size( ) )
currentPos -= array.size( );
}

return currentPos;
}

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 ) );
}

size_t myhash( const HashedObj & x ) const
{
static hash<HashedObj> hf;
return hf( x ) % array.size( );
}
};

1

Решение

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

  1. Если вы используете квадратичное зондирование, то я думаю, что в методе findPos() ты должен продвинуться currentPos в некоторых как currentPos*currentPos % array.size(), В настоящее время, как я вижу, вы увеличиваете currentPos в одном единстве (offset изначально 1), после 2 единств, после 4 и тд
  2. Вероятно, вы пытаетесь быстрый способ для вычисления квадратичного зонда. Если это так, то offset не должно быть увеличено на два, но умножено на два. Это было бы как offset *= 2, но так как вы должны считать количество столкновений, вы должны увеличить offset,
  3. Может быть, более простой способ будет:

    currentPos += 2*offset++ - 1; // fast way of doing quadratic resolution

Ваше изменение размера в порядке, учитывая, что оно гарантирует, что таблица будет по крайней мере наполовину пустой, и, следовательно, поиск доступных записей при выполнении вставки гарантирован.

Удачи

0

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

Других решений пока нет …

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