HELP! Я пытаюсь создать хэш-таблицу с использованием раздельного связывания. По какой-то неизвестной причине я не могу пройтись и найти все оригиналы, которые я загрузил. Я подозреваю, что функция по модулю дает мне плохие адреса иногда в обеих функциях. Сначала при создании хеш-таблицы создаются неправильные адреса в различном int, а затем иногда производится поиск неправильных адресов во второй функции, когда я пытаюсь просмотреть и подтвердить мой список, снова используя modulo. Хеш-таблица заполняется базовым случайным массивом чисел, а затем я сравниваю созданную хеш-таблицу с исходным случайным массивом int. Вот что я считаю виновником всех моих проблем, но я не могу быть уверен на 100%:
address = randARRAY[key] % MAX_KEYS;
А вот и функция для создания хэш-таблицы с использованием раздельного связывания. У меня обычно MAX_KEYS = 5000, tbSIZE = 8989, что лучше, чем 75% Коэффициент загрузки где-то около 55%:
void separateCHAINING(int *randARRAY,int tbSIZE,TABLE *head[]){
int key = 0,
address = 0,
collisions = 0,
newONE = 0;
randARRAY[MAX_KEYS + 1] = 0;
TABLE *newADDRESS[tbSIZE];
newADDRESS[tbSIZE] = new TABLE();
for(int a = 0; a < tbSIZE; a++){
newADDRESS[a] = NULL;
head[a] = NULL;
}
while(randARRAY[key] != 0){
address = randARRAY[key] % MAX_KEYS;
newADDRESS[address] = new TABLE;
newADDRESS[address]->key = randARRAY[key];
if(head[address] != 0){
newADDRESS[address]->next = head[address]->next;
head[address]->next = newADDRESS[address];
collisions++;
}
else{
newADDRESS[address]->next = head[address];
head[address] = newADDRESS[address];
newONE++;
}
key++;
}
cout << "total collisions: " << collisions << endl;
cout << "new: " << newONE << endl;
cout << "added: " << collisions + newONE << endl;
cout << "key: " << key << endl;
}
Созданные данные, похоже, переданы без проблем. Я использовал gdb, чтобы создать смехотворно длинный список для одного индекса массива, и все это было во второй функции, не пропуская ни одного узла. Вот почему я думаю, что адреса могут быть испорчены по модулю как в функции выше, так и в этой ниже. Это, очевидно, создает поддельные адреса, а затем вызывает неправильные. В конце концов, я так и не смог найти все свои int для случайного массива, помещенного в хэш-таблицу. Вот функция, которая снова использует модуль по модулю, а затем пытается пройти и сопоставить случайный массив с новой хэш-таблицей:
void tableTWO_MATCH(int *randARRAY,TABLE *HT_TWO[]){
int key = 0,
address = 0,
match = 0,
nomatch = 0;
randARRAY[MAX_KEYS + 1] = 0;
while(randARRAY[key] != 0){
address = randARRAY[key] % MAX_KEYS;
while(HT_TWO[address]->next != NULL && HT_TWO[address]->key != randARRAY[key]){
HT_TWO[address] = HT_TWO[address]->next;
}//end second while
if(HT_TWO[address]->key == randARRAY[key]){
match++;
}//end if
if(HT_TWO[address]->key != randARRAY[key]){
nomatch++;
}//end if
key = key + 1;
address = 0;
}//end outer while
cout << "match: " << match << endl;
cout << "not match: " << nomatch << endl;
cout << "key: " << key << endl;
}
Как всегда, спасибо заранее за любую помощь! Буду благодарен, если вы увидите, где я все испортил!