Я полагаю, что вы выбрали неверную структуру данных для своих хеш-таблиц:
typedef struct hashTable
{
char key[MAX_NAME];
int index;
struct hashTable *next;
struct hashTable *prev;
};
Одним из основных преимуществ хеш-таблицы является возможность перехода непосредственно к корзине, содержащей элемент, который выищем.Это часть связанного списка блоков хеша - это означает, что вы должны выполнять итерацию в среднем 4098/2 блоков в при каждом поиске или вставке .Это не обеспечит вам необходимую производительность.
Вместо этого ваша хеш-таблица должна быть массивом structs
;каждый struct
должен иметь указатель на строку (или прямое хранилище для коротких строк ) и указатель на следующий struct
в сегменте.(Хотя эта struct hashTable
может также быть структурой in-bucket, это редкая хеш-таблица, которая нуждается в ссылках next
и prev
внутри сегментов. Именно поэтому я предположил, что эта структура данныхвместо этого предназначен для самой таблицы.)
Вам также нужно выбрать хорошую хеш-функцию .Существует множество исследований хороших хэш-функций, но вы действительно ищете что-то лучшее, чем ужасное, для домашнего задания.Входными данными для хэш-функции являются ваши строки, а выходные данные должны быть целыми числами.Вам понадобится %
вывод с размером вашего массива (выберите простое число около 5000), чтобы выяснить, какой сегмент использовать.
Вот хеш-функция из библиотеки stb.h
удобных функций :
unsigned int stb_hash(char *str)
{
unsigned int hash = 0;
while (*str)
hash = (hash << 7) + (hash >> 25) + *str++;
return hash + (hash >> 16);
}
Короткий намек на то, что, хотя код stb.h
находится в открытом доступе, было бы очень разумно сослаться на источник в программе - профессора, юристы,и в будущем ваши коллеги будут благодарить вас за то, что вы указали источник того, чего вы сами не делали.