72 lines
1.6 KiB
C++
72 lines
1.6 KiB
C++
|
#include <cstdio>
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
template<
|
||
|
typename TElem,
|
||
|
std::size_t NSize>
|
||
|
class HashList {
|
||
|
private:
|
||
|
typedef struct {
|
||
|
std::size_t index;
|
||
|
TElem elem;
|
||
|
} entry;
|
||
|
|
||
|
entry* entries[NSize];
|
||
|
|
||
|
std::size_t create_hash(std::size_t const index, std::size_t const e) {
|
||
|
return (index + e) % NSize;
|
||
|
}
|
||
|
|
||
|
public:
|
||
|
HashList() {
|
||
|
for(std::size_t i = 0; i < NSize; i++) entries[i] = NULL;
|
||
|
}
|
||
|
bool insert(std::size_t index, TElem elem) {
|
||
|
std::size_t hash = 0;
|
||
|
std::size_t e = 0;
|
||
|
|
||
|
for(; e < NSize; e++) {
|
||
|
hash = this->create_hash(index, e);
|
||
|
if(entries[hash] == NULL) break;
|
||
|
}
|
||
|
|
||
|
printf("Inserting %d had %d collisions\n", index, e);
|
||
|
|
||
|
if(entries[hash] != NULL) return false;
|
||
|
|
||
|
entries[hash] = new entry{index,elem};
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
entry* find(std::size_t index) {
|
||
|
std::size_t hash = 0;
|
||
|
std::size_t e = 0;
|
||
|
for(; e < NSize; e++) {
|
||
|
hash = this->create_hash(index, e);
|
||
|
if(entries[hash] == NULL || entries[hash]->index == index) break;
|
||
|
}
|
||
|
printf("Finding %d had %d collisions\n", index, e);
|
||
|
|
||
|
if(entries[hash] != NULL && entries[hash]->index != index) return NULL;
|
||
|
|
||
|
return entries[hash];
|
||
|
}
|
||
|
|
||
|
};
|
||
|
|
||
|
int main( int argc, char *argv[] ) {
|
||
|
|
||
|
HashList<float, 13> l;
|
||
|
|
||
|
l.insert(1024, 2.5f);
|
||
|
l.insert(204, 1.5f);
|
||
|
l.insert(217, 1.0f);
|
||
|
|
||
|
printf("1024: %.1f\n", l.find(1024)->elem);
|
||
|
printf("204: %.1f\n", l.find(204)->elem);
|
||
|
printf("217: %.1f\n", l.find(217)->elem);
|
||
|
|
||
|
return 0;
|
||
|
}
|