【发布时间】:2017-09-03 10:56:16
【问题描述】:
在昨晚的 COMP 课程中,我们了解了哈希以及在尝试在哈希表中查找元素 x 时它通常如何工作。
我们的场景是我们的表中有一个包含 1000 个元素的数据集,我们想知道 x 是否包含在该表中。
我们的教授绘制了一个包含 100 个元素的 Java 数组,并说要存储这 1000 个元素,数组的每个位置都将包含一个指向链接列表的指针,我们将在其中保存我们的元素。
假设散列函数将 1000 个元素中的每一个元素完美地映射到 0 到 99 之间的值,并将元素存储在数组中的位置,那么每个链表中将包含 1000/100 = 10 个元素。
现在要知道 x 是否在表中,我们只需对 x 进行哈希处理,找到它的哈希值,在该槽处查找数组并遍历我们的链表检查 x 是否在表中。
我的教授最后说,查找 x 是否在表中的预期复杂性是 O(10),实际上只是 O(1)。我无法理解这是怎么回事。在我看来,如果数据集是 N 并且数组大小是 n,那么平均需要 N/n 步才能在表中找到 x。从定义上看,这不是恒定时间吗,因为如果我们扩大数据集,时间仍然会增加?
我查看了 Stack Overflow 和在线,每个人都说散列是 O(1) 的预期时间复杂度,但有一些警告。我读过人们讨论链接以减少这些警告。也许我错过了一些关于确定时间复杂度的基本知识。
TLDR:为什么在哈希表中查找一个值需要 O(1) 时间,而它似乎仍然取决于数据集的大小(因此是 N 的函数,因此不是常数)。
【问题讨论】:
标签: java hash time-complexity hashtable