Data structures 在哈希数据结构中执行查找操作时,为什么是快速操作?

Data structures 在哈希数据结构中执行查找操作时,为什么是快速操作?,data-structures,Data Structures,在哈希表中执行查找时,键将转换为哈希。现在使用散列值,它是直接映射到内存位置,还是还有更多步骤 只是想在幕后多了解一些事情 还有什么其他基于键的查找数据结构,为什么它们比散列慢?“基于键”意味着某种映射。您可以在链表或数组中实现一个,查找或删除可能会非常慢(O(n)) 散列需要固定的时间。在更复杂的实现中,它通常会映射到一个内存地址,该地址除了映射的对象或值之外,还存储了一个返回关键对象的指针列表,用于冲突检测和解决 昂贵的操作是按照“哈希到此位置”对象的列表来确定您真正要查找的对象。理论上,每

在哈希表中执行查找时,键将转换为哈希。现在使用散列值,它是直接映射到内存位置,还是还有更多步骤

只是想在幕后多了解一些事情

还有什么其他基于键的查找数据结构,为什么它们比散列慢?

“基于键”意味着某种映射。您可以在链表或数组中实现一个,查找或删除可能会非常慢(O(n))

散列需要固定的时间。在更复杂的实现中,它通常会映射到一个内存地址,该地址除了映射的对象或值之外,还存储了一个返回关键对象的指针列表,用于冲突检测和解决

昂贵的操作是按照“哈希到此位置”对象的列表来确定您真正要查找的对象。理论上,每次查找都可能是O(n)!然而,如果我们使用更大的空间,发生这种情况的概率会大大降低(尽管每个生日问题都不可避免地会发生一些碰撞)

如果您开始超过某个冲突阈值,大多数实现将扩展哈希表的大小,这也需要另一个O(n)时间。但是,平均每插入1/n次,这种情况发生的频率不会超过1/n次。所以我们摊销了常数时间。

“基于键”意味着某种映射。您可以在链表或数组中实现一个,查找或删除可能会非常慢(O(n))

散列需要固定的时间。在更复杂的实现中,它通常会映射到一个内存地址,该地址除了映射的对象或值之外,还存储了一个返回关键对象的指针列表,用于冲突检测和解决

昂贵的操作是按照“哈希到此位置”对象的列表来确定您真正要查找的对象。理论上,每次查找都可能是O(n)!然而,如果我们使用更大的空间,发生这种情况的概率会大大降低(尽管每个生日问题都不可避免地会发生一些碰撞)

如果您开始超过某个冲突阈值,大多数实现将扩展哈希表的大小,这也需要另一个O(n)时间。但是,平均每插入1/n次,这种情况发生的频率不会超过1/n次。所以我们已经摊销了固定时间。

A意味着比A更多

特别是,a是一个:

…关联数组(也称为映射或字典)是由(键、值)对集合组成的抽象数据类型,因此每个可能的键在集合中最多出现一次

虽然a是Map的一个实现(尽管它也可以被视为包含“成本”的ADT):

…哈希表或哈希映射是一种数据结构,使用哈希函数将标识值(称为键[…])映射到其关联值。因此,哈希表实现了关联数组[或,映射]

因此,这是一个泄漏出来的实现细节:a是一个使用a的,因此提供了这种算法的预期性能特征的a。在这种情况下,实现细节的“泄漏”是好的,因为它提供了一些基本的[预期的]绑定保证,例如[预期的]
O(1)
--或恒定时间--
get

提示:a是哈希表算法的重要组成部分,它将
HashMap
与其他
Map
实现(如a(使用a)或a(使用a)区分开来

映射的另一种形式是(或“alist”,这在LISP编程中很常见)。虽然关联列表对于
get
来说是
O(n)
,但是对于较小的
n
,它们的开销可能要小得多,这引出了另一点:描述了限制行为(如
n->无穷大
),并且没有针对特定的[smallish]
n

用大O表示法描述函数通常只提供函数增长率的上限。

请参考上面的链接(包括javadoc)了解基本特征和不同的实现策略——我在这里说的任何其他内容都已经在那里说过了(或者在其他答案中)。如果有具体问题,请在必要时打开一个新的SO帖子:-)

快乐编码


对于OpenJDK 7中的
HashMap
实现。查看
put
方法可以看出,它是一种简单的链接,作为冲突解决方法,并且基础“bucket array”将在每次调整大小时增加2倍(达到负载系数时触发)。类文档中介绍了负载因子和摊销性能期望(包括所使用的哈希函数的期望值)。

A不仅仅意味着A

特别是,a是一个:

…关联数组(也称为映射或字典)是由(键、值)对集合组成的抽象数据类型,因此每个可能的键在集合中最多出现一次

虽然a是Map的一个实现(尽管它也可以被视为包含“成本”的ADT):

…哈希表或哈希映射是一种数据结构,使用哈希函数将标识值(称为键[…])映射到其关联值。因此,哈希表实现了关联数组[或,映射]

因此,这是一个泄漏出来的实现细节:a是一个使用a的,因此提供了这种算法的预期性能特征的a。在这种情况下,实现细节的“泄漏”是好的,因为它提供了一些基本的[预期的]绑定保证