working on Hashtable2

This commit is contained in:
Timerix22 2022-06-10 18:47:36 +03:00
parent 7ea373b6e4
commit 2e3f16905b
3 changed files with 108 additions and 31 deletions

View File

@ -3,35 +3,113 @@
#include "../Hashtable/hash.h" #include "../Hashtable/hash.h"
#include "../Autoarr2/Autoarr2.hpp" #include "../Autoarr2/Autoarr2.hpp"
// amount of rows
typedef uint32 HT_HEIGHT_T;
typedef uint32 HT_HASH_T;
#define HT_HASH(K) hashb_sdbm32(K, sizeof(K))
static const HT_HEIGHT_T HT_HEIGHTS[]={17,61,257,1021,4099,16381,65521};
#define _HT_HEIN_MIN 0
#define _HT_HEIN_MAX 6
#define _HT_ARR_BC 2
#define _HT_ARR_BL 8
template <typename TKey, typename TVal> template <typename TKey, typename TVal>
class Hashtable2{ class Hashtable2{
uint8 hein; Autoarr2<HT_HASH_T>* hashes;
public:
Autoarr2<TKey>* keys; Autoarr2<TKey>* keys;
Autoarr2<TVal>* values; Autoarr2<TVal>* values;
uint8 hein;
void expand();
public:
Hashtable2(); Hashtable2();
virtual ~Hashtable2();
HT_HEIGHT_T height(){ return HT_HEIGHTS[hein]; }
TVal* getptr(TKey key);
TVal get(TKey key); TVal get(TKey key);
TVal getptr(TKey key);
bool addOrSet(TKey key, TVal); bool addOrSet(TKey key, TVal);
bool remove(TKey); bool remove(TKey);
virtual ~Hashtable2();
}; };
// amount of rows
static const uint16 HT_HEIGHTS[]={17,61,257,1021,4099,16381,65521};
#define HT_HEIN_MIN 0
#define HT_HEIN_MAX 6
#define ARR_BC 2
#define ARR_BL 8
template<typename TKey, typename TVal> template<typename TKey, typename TVal>
Hashtable2<TKey, TVal>::Hashtable2(){ Hashtable2<TKey, TVal>::Hashtable2(){
hein=HT_HEIN_MIN; hein=_HT_HEIN_MIN;
keys=new Autoarr2<TKey>; HT_HEIGHT_T h=height();
values=new Autoarr2<TVal>; hashes=new Autoarr2<HT_HASH_T>[h];
keys=new Autoarr2<TKey>[h];
values=new Autoarr2<TVal>[h];
for(HT_HEIGHT_T i=0; i<h; i++){
hashes[i]=Autoarr2<HT_HASH_T>(_HT_ARR_BL);
keys[i]=Autoarr2<TKey>(_HT_ARR_BL);
values[i]=Autoarr2<TVal>(_HT_ARR_BL);
}
}
template<typename TKey, typename TVal>
void Hashtable2<TKey, TVal>::expand(){
if(hein>=_HT_HEIN_MAX)
throw_id(ERR_MAXLENGTH);
if(hashes->length!=keys->length || hashes->length!=values->length)
throw_id(ERR_DESYNC);
uint32 oldHeight=height();
hein++;
uint32 newHeight=height();
Autoarr2<HT_HASH_T>* newHashes=new Autoarr2<HT_HASH_T>[newHeight];
Autoarr2<TKey>* newKeys=new Autoarr2<TKey>[newHeight];
Autoarr2<TVal>* newValues=new Autoarr2<TVal>[newHeight];
for(HT_HEIGHT_T i=0; i<newHeight; i++){
newHashes[i]=Autoarr2<HT_HASH_T>(_HT_ARR_BL);
newKeys[i]=Autoarr2<TKey>(_HT_ARR_BL);
newValues[i]=Autoarr2<TVal>(_HT_ARR_BL);
}
for(HT_HEIGHT_T rowN=0; rowN<newHeight; rowN++){
Autoarr2<HT_HASH_T>* oldHashesRow= hashes+rowN;
Autoarr2<TKey>* oldKeysRow = keys +rowN;
Autoarr2<TVal>* oldValuesRow= values+rowN;
for(uint32 k=0; k < oldHashesRow->length; k++){
HT_HASH_T currentHash=oldHashesRow->get(k);
HT_HEIGHT_T newRowN=currentHash%oldHeight;
Autoarr2<HT_HASH_T>* newHashesRow= newHashes+newRowN;
Autoarr2<TKey>* newKeysRow = newKeys +newRowN;
Autoarr2<TVal>* newValuesRow= newValues+newRowN;
newHashesRow->add(currentHash);
newKeysRow->add(oldKeysRow->get(k));
newValuesRow->add(oldValuesRow->get(k));
}
//delete oldHashesRow;
//delete oldKeysRow;
//delete oldValuesRow;
}
delete[] hashes;
delete[] keys;
delete[] values;
hashes=newHashes;
keys=newKeys;
values=newValues;
}
template<typename TKey, typename TVal>
TVal* Hashtable2<TKey, TVal>::getptr(TKey key){
HT_HASH_T keyHash=HT_HASH(key);
HT_HEIGHT_T rowHeight=keyHash%height();
Autoarr2<HT_HASH_T>* hashesRow=hashes+rowHeight;
uint32 index=hashesRow->search(keyHash);
if(index==Autoarr2_NO_REZULT)
return NULL;
Autoarr2<TVal>* valuesRow=values+rowHeight;
return valuesRow->getptr(index);
} }
template<typename TKey, typename TVal> template<typename TKey, typename TVal>
@ -39,14 +117,9 @@ TVal Hashtable2<TKey, TVal>::get(TKey key) {
} }
template<typename TKey, typename TVal>
TVal Hashtable2<TKey, TVal>::getptr(TKey key) {
}
template<typename TKey, typename TVal> template<typename TKey, typename TVal>
bool Hashtable2<TKey, TVal>::addOrSet(TKey key, TVal){ bool Hashtable2<TKey, TVal>::addOrSet(TKey key, TVal){
//expand
} }
template<typename TKey, typename TVal> template<typename TKey, typename TVal>
@ -56,5 +129,6 @@ bool Hashtable2<TKey, TVal>::remove(TKey) {
template<typename TKey, typename TVal> template<typename TKey, typename TVal>
Hashtable2<TKey, TVal>::~Hashtable2(){ Hashtable2<TKey, TVal>::~Hashtable2(){
delete[] keys;
delete[] values;
} }

View File

@ -11,6 +11,7 @@ char* errname(ErrorId err){
case ERR_NOTIMPLEMENTED: return "ERR_NOTIMPLEMENTED"; case ERR_NOTIMPLEMENTED: return "ERR_NOTIMPLEMENTED";
case ERR_NULLPTR: return "ERR_NULLPTR"; case ERR_NULLPTR: return "ERR_NULLPTR";
case ERR_ENDOFSTR: return "ERR_ENDOFSTR"; case ERR_ENDOFSTR: return "ERR_ENDOFSTR";
case ERR_DESYNC: return "ERR_DESYNC";
default: return "UNKNOWN_ERROR"; default: return "UNKNOWN_ERROR";
} }
} }

View File

@ -9,7 +9,9 @@ extern "C" {
typedef enum ErrorId { typedef enum ErrorId {
SUCCESS, // not an error SUCCESS, // not an error
ERR_MAXLENGTH, ERR_WRONGTYPE, ERR_WRONGINDEX, ERR_NOTIMPLEMENTED, ERR_NULLPTR, ERR_ENDOFSTR ERR_MAXLENGTH, ERR_WRONGTYPE, ERR_WRONGINDEX,
ERR_NOTIMPLEMENTED, ERR_NULLPTR, ERR_ENDOFSTR,
ERR_DESYNC
} ErrorId; } ErrorId;
char* errname(ErrorId err); char* errname(ErrorId err);