Хеш-таблицы: почему этот код не разрешает коллизии?

Эта функция вставки, кажется, вставляет неправильно и перезаписывает предыдущие записи. Кроме того, проверка дубликатов не работает должным образом и работает только половину времени.

HT::HT(const unsigned& tblSize) {

//Hash table size equal to size passed or default size TBL_SIZE
hsize = tblSize;
//Pointer table defualt 0
psize = 0;

//reisze tables
hTable.resize(hsize);
pTable.resize(hsize);

//set unused values to empty($$$)
for(unsigned i = 0; i < hsize; i++)
hTable[i].key = FREE;
}//implementation of insert function
void HT::insert(const Entry& record) {

//assign integer value to index via hash function
int index = (hash(record.key) % 31);

//logic to insert into hash table
for(unsigned i = 0; i < hsize; i++) {
//inserting into table with linear probing collision resolution

//inserting into hash table with linear probing as collision resolution
if (hTable[(index+i)%hsize].key == FREE) {

hTable[index] = record;
pTable[psize] = &hTable[(index+i)%hsize];
psize++;
cout << " Entry = " << ((index+i)%hsize) << endl;

return;
}

//Duplicate key check
else if (hTable[(index+i)%hsize].key == record.key) {
cout << " Entry = Not Inserted - Duplicate key!! " << endl; return;
}

//Capacity of table check
else if (i == hsize - 1) {
cout << " Not Inserted -  Table full!! " << endl; return;
}

} //end for loop
}

Кажется, что вставка отлично, и проверка дублированного ключа работает на одном наборе данных, но не на другом с большим количеством значений данных, которые заполняют таблицу до TBL_SIZE = 31. Также константа FREE устанавливает все векторные значения в $$$, чтобы обозначить свободное место.

0

Решение

//inserting into hash table with linear probing as collision resolution
if (hTable[(index+i)%hsize].key == FREE) {

hTable[index] = record;

Вы не хотите вставлять в [index], когда [(index + i)% hsize] является свободным местоположением.

0

Другие решения


По вопросам рекламы [email protected]