哈希表大小

时间:2014-11-25 01:15:25

标签: c++ hash segmentation-fault

我有一个关于哈希表大小相对于您正在使用的数据量的简单问题。

我正在开展一个项目,需要处理整本书的战争与和平,存储每个独特的单词并使用" 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;
}

我设法通过增加tableSizehashTableArray初始化的元素数量)来解决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;
        }
    }
}

如果需要,我可以发布标题和实现文件。

0 个答案:

没有答案
相关问题