Hash<TK>::Hash( int capacity /*= 64 */ ) { pool.Init( sizeof( Node ), 4096, capacity ); int prime = GetPrime( capacity ); nodes.Reserve( prime ); buckets.Resize( prime ); }
void Hash<TK>::Resize() { int prime = GetPrime( nodes.Size() * 3 ); nodes.Reserve( prime ); buckets.Resize( prime, false ); memset( buckets.Data(), 0, buckets.ByteSize() ); // clean up for( int i = 0; i < nodes.Size(); ++i ) { auto& o = nodes[ i ]; auto mod = o->hash % prime; o->next = buckets[ mod ]; buckets[ mod ] = o; } }
void Hash<TK>::Reserve( int capacity ) { if( capacity <= buckets.Size() ) return; int prime = GetPrime( (int)Round2n( capacity ) ); nodes.Reserve( prime ); buckets.Resize( prime, false ); memset( buckets.Data(), 0, buckets.ByteSize() ); // clean up for( int i = 0; i < nodes.Size(); ++i ) { auto& o = nodes[ i ]; auto mod = o->hash % prime; o->next = buckets[ mod ]; buckets[ mod ] = o; } }
void solve(void) { Input(); GetPrime(); Work(); Pow2(); }
int main(int argc, char **argv) { printf("The 10th prime is: %" PRIu64 "\n", GetPrime(10)); printf("The 168th prime is: %" PRIu64 "\n", GetPrime(168)); printf("The 1000th prime is: %" PRIu64 "\n", GetPrime(1000)); return EXIT_SUCCESS; }