我在哈希表的复杂性上遇到了两个功课问题,但我很难理解它们之间的区别。
他们如下:
考虑一个哈希函数,它将获取n个输入并将它们映射到大小为m的表。
写出散列函数的插入,搜索和删除的复杂性,散列函数将所有n个输入均匀地分布在散列表的桶中。
写入插入,搜索和删除的复杂性(假设完美但不切实际)哈希函数,它永远不会有两个项目到同一个桶,即这个哈希函数永远不会导致冲突。
这两个问题与我非常相似,我不确定他们的不同之处。
对于问题一,由于n个输入均匀分布,我们可以假设每个桶中将有零个或一个项目,因此所有插入,搜索和删除都将为O(1)。这是对的吗?
问题二如何以任何方式有所不同?如果该函数永远不会导致碰撞,那么所有项目将均匀分布,这样每次操作都不会导致O(1)?
我的想法是否适合这些问题,还是我错过了什么?
编辑:
我相信我已经确定了我出错的地方。 O(1)对于问题3中的每个操作都是正确的,因为散列函数是理想的并且永远不会导致冲突。
但是对于问题2,项目是均匀分布的但是并不意味着每个桶中只有1个项目,例如,每个桶在链表中可以有20个项目。因此插入将是O(1)。
但是搜索怎么样?搜索链表是O(1)+成本。但是我们不知道它的大小,只知道它的均匀分布。我们可以用n(输入数)和m(表的大小)来得到长度的表达式吗?
答案 0 :(得分:0)
您的编辑在正确的轨道上。
我们可以用n(输入数)和m(表的大小)得到长度的表达式吗?
对于1,如果以某种方式禁止哈希表大小调整意味着负载因子(即每个桶的项目数)n / m大于1而不是常数也不在常量范围内,那么您可以假设一个关系m = f(n),则负载因子为n / f(n),因此复杂度也为O(n / f(n))。
在第二种情况下,复杂性始终为O(1)。