人们说“搜索哈希表”是啥意思? [复制]

Posted

技术标签:

【中文标题】人们说“搜索哈希表”是啥意思? [复制]【英文标题】:What does it mean when people say 'search a hash table'? [duplicate]人们说“搜索哈希表”是什么意思? [复制] 【发布时间】:2019-12-29 15:50:04 【问题描述】:

假设您有一个哈希表,其中包含员工姓名作为键,每个桶中包含员工工资。

当人们说要写一些东西来搜索这个哈希表时,他们指的是什么?搜索功能的输入是什么?

他们的意思是搜索特定员工的薪水是多少?在这种情况下如何处理碰撞?

我的问题有所不同,因为我要求澄清我经常听到的一个口语术语,特别是在示例问题的上下文中。

我并不是真的要求代码实现。关于碰撞的问题可能是与提供的可能重复答案中的实现最接近的问题,但即便如此,这个问题也可以在理论上得到回答。

【问题讨论】:

How does a hash table work? 的可能重复项另外,想想你问了什么。除了寻找特定的东西之外,搜索哈希表还有什么意思?如果员工姓名是哈希表的键,您认为搜索功能的输入除了员工姓名之外还会是什么? 不完全重复。我要求澄清我经常听到的一个口语术语,特别是在示例问题的上下文中。 我并不是真的要求代码实现。关于碰撞的问题可能是与您提供的答案中的实现最接近的问题,但即便如此,理论上也可以回答这个问题。 【参考方案1】:

您要求猜测人们所说的不准确的术语是什么意思。除了确定是否已经存储了关联值之外,哈希表并没有真正“搜索”任何实际意义。

在您的示例中,键是员工姓名。

作为输入的名称哈希计算出一个值,该值解析为 桶。 那个桶可以是空的。 如果存储桶不为空,则返回存储在存储桶中的值。

这有一个明显的问题,您可能会注意到作为许多流行语言的标准数据类型或类库的一部分的关联数组无法处理这个问题。

如果您有“John Smith”作为员工并雇佣了名为“John Smith”的第二名员工,则哈希表无法区分两个人。所以要明确一点,如果您尝试添加新的 John Smith,它将拒绝新的 John Smith 或覆盖第一次存储的工资值。这是一个可能属于您的问题范围的实现细节,并解释了为什么我们将 id# 与我们的身份或基本上任何数据库系统相关联。

哈希表必须处理的主要问题是哈希冲突。这是当有 2 个或更多输入散列到相同的值时。

通常发生的情况是,在哈希计算发生后,它会查看存储桶数据结构。有两种可能:

桶是空的 存储桶有一个或多个条目

那么解决多个条目需要什么?其他一些答案列举或详细介绍了用于处理冲突的方案。显而易见且简单的答案是,存储的数据结构通常包含键:值对。

假设“Bob Jones”和“Sam Smith”都散列到桶“Z”。在存储桶 Z 中,您可能会找到如下值的链接列表:

Bucket Z:  ["Sam Smith": 23000] -> ["Bob Jones": 48500]

-> 表示实现用于查找下一个条目的指针。

希望这说明了存储桶实际上可以为不同名称存储多个薪水值并仍然返回与原始键关联的正确薪水的方式。这可以被认为是实际的“搜索”,因为系统需要搜索与原始键关联的值,但散列本身只是一个计算。以众所周知的哈希算法为例,例如 MD5 或 SHA1。哈希是计算而不是搜索。哈希表是一种将哈希值组合为索引的数据结构,用于查找先前存储的值或存储新值。

【讨论】:

以上是关于人们说“搜索哈希表”是啥意思? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在哈希表中找到最大值,然后打印具有该值的所有变量(在C中)

哈希值是啥意思?

谁能告诉我哈希是啥?

在哈希表的上下文中,“桶条目”是啥意思?

稀疏哈希表背后的主要实现思想是啥?

||= 在 Ruby 语言中是啥意思? [复制]