【问题标题】:Need help starting to build my own hash table需要帮助开始构建我自己的哈希表
【发布时间】:2012-02-29 09:18:58
【问题描述】:

我正在学习哈希表,试图了解它们是如何工作的。我想用单独的链接(使用数组中的列表)制作一个相当简单的哈希表。我有几个问题:

  1. 假设键可以是任何类型,我会要求用户实现散列函数,对吗?可以避免吗?

  2. 用户还需要在初始化时提供包含列表(用于冲突)的数组的长度,对吗?可以避免吗?

如果您有任何其他提示,或者可能有一些清晰的哈希表 C++ 代码示例,我将不胜感激。

感谢您的帮助。

【问题讨论】:

    标签: c++ data-structures hashtable


    【解决方案1】:

    通常,是的,您需要客户端指定哈希函数,因为如果您正在编写通用哈希表并在任意类型 T 上进行操作,您将无法知道如何以以下方式对其进行哈希处理语义上有意义。您可以通过在所存储元素的类型和散列函数上参数化类来做到这一点。例如:

    template <typename T, typename Hash = std::hash<T>>
        class MyHashTable {
        /* ... */
    }
    

    在这里,您可以使用模板的默认参数来选择默认哈希函数,除非用户另有指定。

    虽然客户端通常可以指定表格的初始大小,但这不是必需的。您可以对存储桶的数量进行有根据的猜测(例如,最初使用 17 个存储桶),随着负载因子的增加而增加表。例如,这类似于std::vector 的工作方式:实现可以选择默认大小,但如果客户端明确要求预先设置大小的向量或调用reserve,则实现会从用户那里获取提示。例如,您可以有一个表单的构造函数

    template <typename T, typename Hash = std::hash<T>>
        class MyHashTable {
    public:
        MyHashTable(unsigned numBuckets = 17);
    }
    

    这样,客户端可以只用默认的桶数构建一个哈希表,或者如果他们知道他们想要的桶数,他们可以将其指定为参数。但是,您可能还希望将存储桶作为详细信息隐藏,并让客户指定他们希望将多少元素放入表中,然后让您的班级为此在幕后进行计算。这使得在幕后切换实现变得更容易,因此,如果您想使用动态完美哈希表而不是链式哈希,则该类可以处理计算初始大小的复杂性。

    至于代码示例,我不确定如何提供任何代码示例而不放弃构建哈希表所涉及的大量复杂性。 :-) 如果您对某段特定代码感兴趣并且在自己编写时遇到困难,请随时将其作为单独的问题发布,以便您获得更有针对性的反馈。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      查看散列算法的各种实现。有很多可用的。如果需要,您可以使哈希存储可变。由你决定。对于大多数散列算法,冲突是可能的。请记住这一点。

      【讨论】:

      • 我不确定这如何解决这个问题。如果您正在构建自己的哈希表,那么您可能希望客户端提供哈希算法,因为您可能不会事先知道存储的类型是什么。此外,由于这是 C++,您可以使用 std::hash 进行散列。
      【解决方案3】:

      如果您想了解哈希表,我建议您从最简单的开始,即线性链接哈希表

      在这里,您考虑一个固定大小的指针数组(指向您定义的类型项目的指针),您的项目将存储在其中,考虑还有一些计数器,一个用于跟踪数组的长度,另一个用于跟踪直到某个时刻添加到表中的项目数

      你可以使用宏来定义像这样向哈希表添加项目的功能

       h(k) = k % M  
      

      其中 k 是要添加的项目的索引(键),M 是表示指针数组大小的质数(例如 13、29、41、543),h(k) 将为您提供项目要插入的位置。

      你应该考虑使用固定大小的指针数组的原因是因为这样你就有了

       O(n) 
      

      成本。

      因此,您可以从这个简单的函数开始,然后对其进行修改并考虑实现一些更复杂的函数,例如开放寻址、线性探测、二次探测和双哈希

      关于用户要求输入的项目数量,我完全同意 templatetypedef 之前所说的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-09-20
        • 2013-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 1970-01-01
        • 2015-04-30
        相关资源
        最近更新 更多