Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 探测哈希表_Algorithm_Hashmap_Hashcode_Hash Collision_Hash Function - Fatal编程技术网

Algorithm 探测哈希表

Algorithm 探测哈希表,algorithm,hashmap,hashcode,hash-collision,hash-function,Algorithm,Hashmap,Hashcode,Hash Collision,Hash Function,我正在为一个项目实现一个哈希表,使用3种不同的探测。现在我正在研究线性 对于线性探测,我理解探测是如何工作的,我的导师暗示他希望步长为1。问题是,不允许重复。所以我必须先“搜索”一个值,然后再插入它,对吗?但是,如果表格被使用到所有单元格都被“占用”或“删除”的地步,该怎么办?然后,为了搜索特定的键以确保它不在表中,我必须搜索整个表。这意味着搜索操作(扩展为插入操作)是O(n) 这似乎不对,我想我误解了什么 我知道我不必在二次探测中遇到同样的问题,因为表至少需要半空,并且它只探测确定数量的元素。

我正在为一个项目实现一个哈希表,使用3种不同的探测。现在我正在研究线性

对于线性探测,我理解探测是如何工作的,我的导师暗示他希望步长为1。问题是,不允许重复。所以我必须先“搜索”一个值,然后再插入它,对吗?但是,如果表格被使用到所有单元格都被“占用”或“删除”的地步,该怎么办?然后,为了搜索特定的键以确保它不在表中,我必须搜索整个表。这意味着搜索操作(扩展为插入操作)是O(n)

这似乎不对,我想我误解了什么

我知道我不必在二次探测中遇到同样的问题,因为表至少需要半空,并且它只探测确定数量的元素。对于双重散列,我不确定这将如何工作,因为我还需要搜索表以证明要插入的键不存在。但是如果没有一个单元格“从未被占用”,我怎么知道如何停止搜索呢


因此:在开放散列中,表中的每个条目过去都被占用,是否需要O(n)个探测来搜索元素(如果不允许重复,则插入)?

如果您误解了线性探测的这一方面,我也会这样做。我同意,如果散列表接近满,则每次插入的性能将下降到O(n)。有关所有详细信息,请参阅

顺便说一句,我惊讶地发现,对这个问题的第一次分析实际上是由数学家Ramanujan在1913年完成的,他的结果意味着“对于一个满的线性探测哈希表,元素的总位移,即构建成本,大约为N^(3/2)。”(见)

然而,在实践中,我并不认为插入速度慢是哈希表几乎满的重要问题。重要的问题是,您已经到了无法再进行另一次插入的地步

因此,哈希表的任何实际实现都必须有一种策略,用于在哈希表超出给定的负载因子时重新调整哈希表的大小,并根据理论或实验选择用于重新调整大小的最佳负载因子。在这种情况下,使用实验尤其有价值,因为线性散列的性能对散列函数以避免集群的方式在散列表中均匀分布项的能力非常敏感,这使得性能非常依赖于要插入到表中的项的特征