Hash Tables
Oct 10, 2015 at 5:06pm UTC
I having trouble with some hashing.
We are given the hash class and within the class we need to figure out total number of elements in the table , the size of table the total number of collisions.
We were given a file which contains thousands of words and with those words we need to figure out everything above.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
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; see Section 5.5
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( );
}
};
from cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
bool isPrime( int n )
{
if ( n == 2 || n == 3 )
return true ;
if ( n == 1 || n % 2 == 0 )
return false ;
for ( int i = 3; i * i <= n; i += 2 )
if ( n % i == 0 )
return false ;
return true ;
}
/**
* Internal method to return a prime number at least as large as n.
* Assumes n > 0.
*/
int nextPrime( int n )
{
if ( n % 2 == 0 )
++n;
for ( ; !isPrime( n ); n += 2 )
;
return n;
}
Last edited on Oct 17, 2015 at 5:20pm UTC
Topic archived. No new replies allowed.