【问题标题】:Reasons as to use Quadratic Probing for Hash table implementation使用二次探测进行哈希表实现的原因
【发布时间】:2013-04-06 05:39:30
【问题描述】:

我最近一直在学习哈希表。有几个碰撞解决方案的例子,其中之一是二次探测。为什么有人会使用二次探测?他知道哈希表总是不到一半吗?如果是这样,他为什么要开始使用这么大的桌子?

【问题讨论】:

  • 您似乎在问两个完全不同的正交问题。
  • 我明白你的意思,我重新表述了这个问题以使其更清楚。

标签: data-structures hashtable quadratic-probing


【解决方案1】:

二次 rehash 是一种非常简单快速的避免线性哈希聚类问题的方法。它通常仅在表大小为素数时使用(由于其他原因也可能很好)。

为避免担心“桌子半满”,最简单的方法是在某个时候切换到线性探头。 (您可以将这种切换的阈值测试放在通常的 if (index >= size) {index -= size;} 块中,以避免任何性能损失。

【讨论】:

    【解决方案2】:

    为什么有人会使用二次探测?

    假设我们需要一些冲突解决算法,

    二次探测可以是封闭哈希表中更有效的算法,因为它更好地避免了线性探测可能发生的聚类问题,尽管它不是免疫的。

    (From Wikipedia)

    二次探测并不完美,但it does offer some advantages over alternatives:

    二次(或其他形式)链接的优点是

    • 更简单的存储管理逻辑(无动态分配)
    • 更快的插入(因为存储更简单)
    • 总体上降低了存储要求

    (from mjv's answer)

    他知道哈希表总是不到半满吗?

    不一定;这取决于使用的调整大小策略(如果有)。

    认为您在 QP 上的学习主要是教育性的。根据我的经验,实用的哈希表实现不经常使用open addressing,

    【讨论】:

    • 哦,好吧,所以你可以从你想要的任何大小开始,只要它超过一半,就可以调整表格的大小。那岂不是很浪费空间?改散列函数不是更好吗?
    • @user2278279- 这不会浪费太多空间。通常,您的空间不超过您需要的 4 倍,因为任何时候您有 2 倍的空间,您的表大小都会翻倍。这是一个相当标准的实现。
    • 现在我明白了。这取决于您如何实现哈希表,如果您使用指针数组,那么与哈希函数的简单程度相比,两倍的指针并不是那么糟糕,但是如果您使用大对象数组,那么您将是浪费空间。
    • 当然取决于:)二次探测是一个实现细节。
    猜你喜欢
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 2013-04-17
    • 2016-03-09
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多