我有一个关于哈希表大小相对于您正在使用的数据量的简单问题。
我正在开展一个项目,需要处理整本书的战争与和平,存储每个独特的单词并使用" count"字段以跟踪重复项。这本书从古腾堡项目以纯文本格式下载时的大小为3152KB(这是一篇巨大的纯文本文档)。
我在尝试散列各种测试文件时遇到了奇怪的seg-fault错误,并且似乎找不到任何常见的线程,除了具有大量独特单词的大文件似乎都会导致程序抛出赛格故障。这表明碰撞错误是问题所在。
我使用链接列表"存储桶"照顾碰撞,以及以下哈希算法:
unsigned int Hash(const std::string& str)
{
unsigned int hash = 5381;
for(std::size_t i = 0; i < str.length(); i++)
{
hash = (((hash << 5) + hash) + str[i]) % HashT::tableSize;
}
return hash;
}
我设法通过增加tableSize
(hashTableArray
初始化的元素数量)来解决seg-faults,之后一切正常。让我感到担忧的是,我必须先做tableSize = 10000000
(一千万)才能发挥作用。
我的问题是,如果这是更多的内存,我应该需要哈希函数和冲突解决技术吗?事实是我需要在链条的某个地方做出一个大的迹象吗?我没有足够的哈希表经验,无法判断这是否合理。
如果有帮助,请点击我的addItem函数:
void Hash::addItem(string key)
{
int index = hash(key);
if (HashTable[index] == nullptr) {
HashTable[index] = new item;
HashTable[index]->key = key;
HashTable[index]->count = 1;
}
else {
item *temp = HashTable[index];
item *newP = new item;
while (temp->next != nullptr && temp->key != key)
temp = temp->next;
if (temp->key == key) {
temp->count++;
}
else {
temp->next = newP;
newP->key = key;
newP->count = 1;
}
}
}
如果需要,我可以发布标题和实现文件。