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



我有两个关于哈希表复杂性的家庭作业问题,但我很难理解它们之间的区别。

它们如下:

考虑一个散列函数,它取n个输入,并将它们映射到m大小的表中。

  1. 为哈希函数编写插入、搜索和删除的复杂性,该函数将所有n个输入均匀地分布在哈希表的桶中。

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

这两个问题对我来说似乎很相似,我真的不确定它们的区别。

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

那么第二个问题有什么不同呢?如果函数从未导致冲突,那么所有项目都将均匀分布,所以这不会导致每个操作的O(1)吗?

我的想法对这些问题正确吗?还是我遗漏了什么?

编辑:

我相信我已经发现了哪里出了问题。O(1)对于问题3中的每一个操作都是正确的,因为哈希函数是理想的并且不会导致冲突。

然而,对于问题2,项目分布均匀,但并不意味着每个bucket中只有1个项目,例如,每个bucket在链表中可能有20个项目。所以插入就是O(1)。

但搜索呢?这将是O(1)+搜索链表的成本。但我们不知道它的大小,只知道它分布均匀。我们能得到一个用n(输入数量)和m(表大小)表示长度的表达式吗?

您的编辑是正确的。

我们能得到一个用n(输入数量)和m(表大小)表示长度的表达式吗?

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

在第二种情况下,复杂度总是O(1)。

最新更新