You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
328 lines
5.3 KiB
328 lines
5.3 KiB
/*
|
|
|
|
A hash table hashed by two/four integers.
|
|
|
|
Copyright (C) 2011 Tao Ju
|
|
|
|
This library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public License
|
|
(LGPL) as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with this library; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
|
|
#ifndef HASHMAP_H
|
|
#define HASHMAP_H
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#define HASH_LENGTH 20
|
|
#define MAX_HASH (1<<HASH_LENGTH)
|
|
#define HASH_BIT_2 10
|
|
#define HASH_BIT_4 5
|
|
|
|
struct ElementList
|
|
{
|
|
int n1;
|
|
int n2;
|
|
int index ;
|
|
int location ;
|
|
ElementList* next;
|
|
};
|
|
|
|
struct ElementList2
|
|
{
|
|
int n1;
|
|
int n2;
|
|
float v[3] ;
|
|
ElementList2* next;
|
|
};
|
|
|
|
struct ElementList4
|
|
{
|
|
int n1;
|
|
int n2;
|
|
int n3;
|
|
int n4;
|
|
int index ;
|
|
ElementList4* next;
|
|
};
|
|
|
|
class HashMap
|
|
{
|
|
/// Hash table
|
|
ElementList *table[MAX_HASH];
|
|
|
|
/// Create hash key
|
|
int CreateKey( int k1, int k2 )
|
|
{
|
|
int ind = ( (( k1 & ( (1<<HASH_BIT_2) - 1 )) << ( HASH_BIT_2 )) |
|
|
( k2 & ( (1<<HASH_BIT_2) - 1)) )
|
|
& ((1<<HASH_LENGTH) - 1);
|
|
|
|
return ind;
|
|
}
|
|
|
|
public:
|
|
|
|
/// Constructor
|
|
HashMap ( )
|
|
{
|
|
for ( int i = 0; i < MAX_HASH; i ++ )
|
|
{
|
|
table[i] = NULL;
|
|
}
|
|
};
|
|
|
|
/// Lookup Method
|
|
int FindKey( int k1, int k2, int& index, int& location )
|
|
{
|
|
/// Create hash key
|
|
int ind = CreateKey ( k1, k2 );
|
|
|
|
/// Find it in the table
|
|
ElementList *p = table[ind];
|
|
while (p)
|
|
{
|
|
if ((p->n1 == k1) && (p->n2 == k2))
|
|
{
|
|
index = p->index ;
|
|
location = p->location ;
|
|
return 1 ;
|
|
}
|
|
p = p->next;
|
|
}
|
|
|
|
return 0 ;
|
|
};
|
|
|
|
|
|
/// Insertion method
|
|
void InsertKey ( int k1, int k2, int index, int location )
|
|
{
|
|
/// Create hash key
|
|
int ind = CreateKey ( k1, k2 );
|
|
|
|
/// Create hash entry
|
|
ElementList *node = new ElementList;
|
|
|
|
node->index = index ;
|
|
node->location = location ;
|
|
node->n1 = k1 ;
|
|
node->n2 = k2 ;
|
|
node->next = table[ ind ] ;
|
|
table[ ind ] = node ;
|
|
};
|
|
|
|
// Destruction method
|
|
~HashMap()
|
|
{
|
|
ElementList *p, *pp;
|
|
|
|
for ( int i = 0; i < MAX_HASH; i ++)
|
|
{
|
|
p = table[i];
|
|
|
|
while (p)
|
|
{
|
|
pp = p->next;
|
|
delete p;
|
|
p = pp;
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
class HashMap2
|
|
{
|
|
/// Hash table
|
|
ElementList2 *table[MAX_HASH];
|
|
|
|
/// Create hash key
|
|
int CreateKey( int k1, int k2 )
|
|
{
|
|
int ind = ( (( k1 & ( (1<<HASH_BIT_2) - 1 )) << ( HASH_BIT_2 )) |
|
|
( k2 & ( (1<<HASH_BIT_2) - 1)) )
|
|
& ((1<<HASH_LENGTH) - 1);
|
|
|
|
return ind;
|
|
}
|
|
|
|
public:
|
|
|
|
/// Constructor
|
|
HashMap2 ( )
|
|
{
|
|
for ( int i = 0; i < MAX_HASH; i ++ )
|
|
{
|
|
table[i] = NULL;
|
|
}
|
|
};
|
|
|
|
/// Lookup Method
|
|
int FindKey( int k1, int k2, float coord[3] )
|
|
{
|
|
/// Create hash key
|
|
int ind = CreateKey ( k1, k2 );
|
|
|
|
/// Find it in the table
|
|
ElementList2 *p = table[ind];
|
|
while (p)
|
|
{
|
|
if ((p->n1 == k1) && (p->n2 == k2))
|
|
{
|
|
coord[0] = p->v[0] ;
|
|
coord[1] = p->v[1] ;
|
|
coord[2] = p->v[2] ;
|
|
return 1 ;
|
|
}
|
|
p = p->next;
|
|
}
|
|
|
|
return 0 ;
|
|
};
|
|
|
|
|
|
/// Insertion method
|
|
void InsertKey ( int k1, int k2, float coord[3] )
|
|
{
|
|
/// Create hash key
|
|
int ind = CreateKey ( k1, k2 );
|
|
|
|
/// Create hash entry
|
|
ElementList2 *node = new ElementList2;
|
|
|
|
node->v[0] = coord[0] ;
|
|
node->v[1] = coord[1] ;
|
|
node->v[2] = coord[2] ;
|
|
node->n1 = k1 ;
|
|
node->n2 = k2 ;
|
|
node->next = table[ ind ] ;
|
|
table[ ind ] = node ;
|
|
};
|
|
|
|
// Destruction method
|
|
~HashMap2()
|
|
{
|
|
ElementList2 *p, *pp;
|
|
|
|
for ( int i = 0; i < MAX_HASH; i ++)
|
|
{
|
|
p = table[i];
|
|
|
|
while (p)
|
|
{
|
|
pp = p->next;
|
|
delete p;
|
|
p = pp;
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
class HashMap4
|
|
{
|
|
/// Hash table
|
|
ElementList4 *table[MAX_HASH];
|
|
|
|
/// Create hash key
|
|
int CreateKey( int k1, int k2, int k3, int k4 )
|
|
{
|
|
int ind = ( (( k1 & ( (1<<HASH_BIT_4) - 1 )) << ( 3 * HASH_BIT_4 )) |
|
|
(( k2 & ( (1<<HASH_BIT_4) - 1 )) << ( 2 * HASH_BIT_4 )) |
|
|
(( k3 & ( (1<<HASH_BIT_4) - 1 )) << ( HASH_BIT_4 )) |
|
|
( k4 & ( (1<<HASH_BIT_4) - 1)) )
|
|
& ((1<<HASH_LENGTH) - 1);
|
|
|
|
return ind;
|
|
}
|
|
|
|
public:
|
|
|
|
/// Constructor
|
|
HashMap4 ( )
|
|
{
|
|
for ( int i = 0; i < MAX_HASH; i ++ )
|
|
{
|
|
table[i] = NULL;
|
|
}
|
|
};
|
|
|
|
/// Lookup Method
|
|
int FindKey( int k1, int k2, int k3, int k4 )
|
|
{
|
|
/// Create hash key
|
|
int ind = CreateKey ( k1, k2, k3, k4 );
|
|
|
|
/// Find it in the table
|
|
ElementList4 *p = table[ind];
|
|
while (p)
|
|
{
|
|
if ((p->n1 == k1) && (p->n2 == k2) && (p->n3 == k3) && (p->n4 == k4))
|
|
{
|
|
return p->index ;
|
|
}
|
|
p = p->next;
|
|
}
|
|
|
|
return -1 ;
|
|
};
|
|
|
|
|
|
/// Insertion method
|
|
void InsertKey ( int k1, int k2, int k3, int k4, int index )
|
|
{
|
|
/// Create hash key
|
|
int ind = CreateKey ( k1, k2, k3, k4 );
|
|
|
|
/// Create hash entry
|
|
ElementList4 *node = new ElementList4;
|
|
|
|
node->index = index ;
|
|
node->n1 = k1 ;
|
|
node->n2 = k2 ;
|
|
node->n3 = k3 ;
|
|
node->n4 = k4 ;
|
|
node->next = table[ ind ] ;
|
|
table[ ind ] = node ;
|
|
};
|
|
|
|
// Destruction method
|
|
~HashMap4()
|
|
{
|
|
ElementList4 *p, *pp;
|
|
|
|
for ( int i = 0; i < MAX_HASH; i ++)
|
|
{
|
|
p = table[i];
|
|
|
|
while (p)
|
|
{
|
|
pp = p->next;
|
|
delete p;
|
|
p = pp;
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
#endif
|