填充哈希表的时间复杂度?

时间:2012-06-30 21:10:48

标签: hashtable time-complexity quadratic-probing

这是一个家庭作业问题,但我认为它缺少一些东西。它问道:

  

提供一系列 m 键来填充使用线性探测实现的哈希表,以便填充它的时间最短。

然后

  

提供另一个 m 键序列,但填充它的时间最长。如果哈希表实现二次探测,则重复这两个问题

我只能假设哈希表的大小为 m ,因为它是唯一给出的数字,因为我们在描述加载因子之前一直使用该字母来处理哈希表大小。但是,如果不知道将序列散列到表中的哈希函数,我就无法想到任何序列。

如果它是一个错误的哈希函数,例如,它会将每个条目哈希到同一个索引,那么填充它的最小和最大时间都将花费O(n)时间,无论序列看起来如何喜欢。在一般情况下,我假设哈希函数是正常的,我怎么知道哈希函数填充表需要多长时间?

这些与散列函数相关的问题是否与散列的序列相比更强?

至于第二个问题,我可以假设,无论散列函数如何,一个大小 m 的序列与相同的密钥重复 m -times将提供最大时间,因为它会导致第二个条目的线性探测。我认为这需要花费O(n)时间。这是对的吗?

2 个答案:

答案 0 :(得分:1)

这个问题并不是非常关注哈希函数,但它会很好。不过,你似乎非常喜欢它。听起来我觉得这个问题更关心"你知道最坏情况下的密钥列表是什么吗?"比你更了解如何利用糟糕的哈希函数?"

显然,如果你想出一个序列,其中所有条目都散列到不同的位置,那么你总共有O(1)次插入O(m)时间。

对于你所说的关于将所有密钥哈希到同一位置的说法,每个插入应该采用O(n),如果这是你的建议。但是,这不是插入所有元素的总时间。此外,您可能想要考虑不是一遍又一遍地使用相同的密钥,而是使用会在表中生成相同位置的密钥。我认为,按照惯例,插入相同的密钥应该会导致替换,但我并非100%确定。

如果我提供太多信息或遗漏任何不清楚的地方,我会提前道歉。这个问题看起来非常简洁,除非实际上不知道哈希函数,如果不回答整个问题就很难说真的很多。

答案 1 :(得分:1)

嗯,这些问题背后的想法是测试你对探测风格的理解。对于线性探测,如果发生碰撞,您只需测试下一个单元格。它会继续这样,直到找到可用的单元来存储您的数据。 您的哈希表不需要是大小为m,但它必须是at least size m

第一个问题是,如果你有一个完美的哈希函数,那么填充表的复杂性是多少。完美的散列函数可以在不发生冲突的情因此对于m中的每个元素,您需要O(1)时间。总复杂度为O(m)。

第二个问题是要求hash(X)= cell(0)的情况,所有元素将搜索到第一个空单元格(当前填充的表格的后面)。

对于第一个元素,您只需探测一次 - > O(1)

对于第二个元素,您进行两次探测 - > O(2)

对于第n个元素,你探测n次 - >为O(n)

总的来说,你有m个元素,所以 - > O(n*(n+1)/2)

对于二次探测,您有相同的策略。最小的情况是相同的,但最大的情况将有O(nlogn)。 (我没有解决它,只是这是我受过教育的猜测。)