【发布时间】:2018-07-14 04:02:32
【问题描述】:
从技术上讲,根据我在这里阅读的帖子,哈希表在最坏的情况下确实是 O(n) 时间查找。但我不明白内部机制如何保证平均为 O(1) 时间。
我的理解是,给定一些 n 个元素,理想情况是有 n 个桶,这会导致 O(1) 空间。这就是我卡住的地方。假设我想查找一个键是否在字典中,这肯定需要 O(n) 时间。那么,当我想通过使用其键的哈希值来搜索元素是否在哈希表中时,为什么会有所不同呢?简而言之,使用原始键值进行搜索需要 O(n) 时间,但使用哈希值是 O(1) 时间。这是为什么?
难道我还需要一一查找哈希值以查看哪个匹配吗?为什么散列会立即让我知道要检索哪个元素或这样的元素是否存在?
【问题讨论】:
-
您的第二段没有多大意义。哈希表的工作方式是每个元素根据其哈希值分配给一个桶。理想情况下,每个元素都分配有一个唯一的桶,但这在实践中是无法实现的。人们希望有足够的桶,恒定个元素被分配给每个桶,这样一个桶内的蛮力搜索仍然是 O(1)。但在最坏的情况下,元素的非常数部分(例如,n/10)被分配到一个桶中;任何涉及该哈希的查找都不再是常量。
-
“内部机制”不保证平均 O(1) 时间。没有保证。
-
假设即使每个元素都分配了一个唯一的桶,查找如何知道使用哈希函数在哪里找到该桶?我知道存储桶内的搜索可以是 O(n),但我不知道存储桶的本地化是 O(1)。
-
关于最后一条评论:计算哈希仅取决于键的大小(而不取决于键/值的数量)。哈希确定内存地址。由于 O(n) 基于元素的数量(不是键大小),因此它在 O(1) 中。想象一个数组,它可以随机访问它的元素。如果您的密钥在 0-n 中,这是一个身份哈希函数 (x -> x) 的示例。
-
您缺少哈希表最重要的“功能”,即键的哈希码用于将键映射到存储桶数组中的某个位置。因此,给定一个键,在桶数组中查找索引需要一个恒定的时间(假设哈希码计算仅基于键的值)。