哈希表 - 插入,搜索和删除的复杂性

时间:2016-05-04 10:07:52

标签: hash hashtable big-o

我在哈希表的复杂性上遇到了两个功课问题,但我很难理解它们之间的区别。

他们如下:

考虑一个哈希函数,它将获取n个输入并将它们映射到大小为m的表。

  1. 写出散列函数的插入,搜索和删除的复杂性,散列函数将所有n个输入均匀地分布在散列表的桶中。

  2. 写入插入,搜索和删除的复杂性(假设完美但不切实际)哈希函数,它永远不会有两个项目到同一个桶,即这个哈希函数永远不会导致冲突。

  3. 这两个问题与我非常相似,我不确定他们的不同之处。

    对于问题一,由于n个输入均匀分布,我们可以假设每个桶中将有零个或一个项目,因此所有插入,搜索和删除都将为O(1)。这是对的吗?

    问题二如何以任何方式有所不同?如果该函数永远不会导致碰撞,那么所有项目将均匀分布,这样每次操作都不会导致O(1)?

    我的想法是否适合这些问题,还是我错过了什么?

    编辑:

    我相信我已经确定了我出错的地方。 O(1)对于问题3中的每个操作都是正确的,因为散列函数是理想的并且永远不会导致冲突。

    但是对于问题2,项目是均匀分布的但是并不意味着每个桶中只有1个项目,例如,每个桶在链表中可以有20个项目。因此插入将是O(1)。

    但是搜索怎么样?搜索链表是O(1)+成本。但是我们不知道它的大小,只知道它的均匀分布。我们可以用n(输入数)和m(表的大小)来得到长度的表达式吗?

1 个答案:

答案 0 :(得分:0)

您的编辑在正确的轨道上。

  

我们可以用n(输入数)和m(表的大小)得到长度的表达式吗?

对于1,如果以某种方式禁止哈希表大小调整意味着负载因子(即每个桶的项目数)n / m大于1而不是常数也不在常量范围内,那么您可以假设一个关系m = f(n),则负载因子为n / f(n),因此复杂度也为O(n / f(n))。

在第二种情况下,复杂性始终为O(1)。