如何创建哈希表

时间:2011-11-20 23:39:04

标签: c++ hash hashtable

我想在继续之前提及我已经查看了在本网站以及其他网站上提出同样问题的其他问题。我希望我能得到一个好的答案,因为我的目标是双重的:

  1. 最重要的是,我想学习如何创建哈希表。
  2. 其次,我发现Stack Overflow上的很多答案倾向于假设某个主题的知识水平通常不存在,特别是对于较新的类型。话虽这么说,我希望编辑我的主要信息,以便在我自己弄清楚之后对这个过程进行更深入的解释。

  3. 在主菜上:

    据我所知,到目前为止,哈希表是一个列表数组(或类似的数据结构),它希望最佳地具有尽可能少的冲突,以保持其受到称赞的O(1)复杂性。以下是我目前的流程:

    所以我的第一步是创建一个指针数组:

    Elem ** table;
    table = new Elem*[size];//size is the desired size of the array
    

    我的第二步是创建散列函数(非常简单)。

    int hashed = 0;
    hashed = ( atoi( name.c_str() ) + id ) % size;
    //name is a std string, and id is a large integer. Size is the size of the array.
    

    我的第三步是创建一些东西来检测碰撞,这是我目前所处的部分。

    这是一些伪代码:

    while( table[hashedValue] != empty )
        hashedValue++
    
    else
        put in the list at that index.
    

    它相对不优雅,但我仍处于“这是什么”阶段。忍受我。

    还有别的吗?我错过了什么或做错了什么吗?

    由于

3 个答案:

答案 0 :(得分:4)

处理找不到空位并调整表格大小。

答案 1 :(得分:1)

您错过了Elem的定义。这不是微不足道的,因为它取决于您是否需要chaining或探测哈希表。

答案 2 :(得分:0)

哈希函数为相同的数据生成相同的值。但是,您的冲突检查会修改该值,这意味着哈希值不仅取决于输入,还取决于哈希映射中其他元素的存在。这很糟糕,因为您几乎永远无法通过其名称实际访问您之前放入的元素,只能通过迭代地图。

其次,您的碰撞检查很容易受到溢出/范围错误的影响,因为您只需增加哈希值而不检查地图的大小(但是,正如我之前所说,您甚至不应该这样做)。 / p>