【发布时间】:2016-08-29 16:58:59
【问题描述】:
我收到了两个关于哈希表复杂性的作业问题,但我很难理解它们之间的区别。
它们如下:
考虑一个哈希函数,它接受 n 个输入并将它们映射到一个大小为 m 的表。
写出散列函数的插入、搜索和删除的复杂性,该函数将所有 n 个输入均匀分布在散列表的桶中。
写出插入、查找和删除的复杂度,写出(据说完美但不现实)哈希函数永远不会有两个项目到同一个桶,即这个哈希函数永远不会导致冲突。
这两个问题对我来说似乎很相似,我不太确定它们的区别。
对于问题一,由于 n 个输入是均匀分布的,我们可以假设每个桶中将有 0 个或 1 个项目,因此插入、搜索和删除的所有操作都是 O(1)。这是正确的吗?
那么问题二有什么不同呢?如果函数永远不会导致冲突,那么所有项目将均匀分布,那么这不会导致每个操作的 O(1) 吗?
我对这些问题的想法是正确的还是我遗漏了什么?
编辑:
我相信我已经确定了哪里出错了。 O(1) 对于问题 3 中的每个操作都是正确的,因为散列函数是理想的并且不会导致冲突。
但是对于问题 2,项目是均匀分布的,但并不意味着每个存储桶中只有 1 个项目,例如,每个存储桶在链表中可以有 20 个项目。所以插入将是 O(1)。
但是搜索呢?这将是 O(1) + 搜索链表的成本。但我们不知道大小,只知道分布均匀。我们能用 n(输入的数量)和 m(表的大小)得到长度的表达式吗?
【问题讨论】: