一尘不染

哈希:它内部如何运作?

algorithm

这听起来像是一个非常模糊的问题,但事实并非如此。我已经看过
Wiki上的哈希函数描述,但是对理解它不是很有帮助。

我正在为哈希等相当复杂的主题寻找简单的答案。这是我的问题:

  1. 哈希是什么意思?它在内部如何运作?
  2. 它遵循什么算法?
  3. 之间有什么区别HashMapHashTableHashList
  4. 我们所说的“恒定时间复杂度”是什么意思,为什么不同的哈希实现方式会给出恒定的时间操作?
  5. 最后,为什么在大多数访谈问题HashLinkedList被问到的问题中,通过测试受访者的知识是否有特定的逻辑呢?

我知道我的问题清单很大,但是如果我真的想了解这个话题,能对这些问题得到一些明确的答案,我将不胜感激。


阅读 205

收藏
2020-07-28

共1个答案

一尘不染

  1. 是有关哈希的很好的解释。例如,您要存储字符串“ Rachel”,则将哈希函数应用于该字符串以获取内存位置。myHashFunction(key: "Rachel" value: "Rachel") --> 10。该函数可能会为输入“ Rachel”返回10,因此,假设您有一个大小为100的数组,则将“ Rachel”存储在索引10中。如果要检索该元素,则只需调用GetmyHashFunction("Rachel")它,它将返回10。请注意,对于此示例键是“ Rachel”,值是“ Rachel”,但是您可以为该键使用另一个值,例如出生日期或对象。您的哈希函数可能为两个不同的输入返回相同的内存位置,在这种情况下,如果实现自己的哈希表,您将遇到冲突,您可能必须使用链表或其他技术来解决此问题。

  2. 是一些常用的哈希函数。一个好的散列函数可以满足:每个密钥都可能散列到n个内存插槽中的任何一个,而与其他任何密钥散列到的位置无关。其中一种方法称为除法。通过将k的其余部分除以n,我们将密钥k映射到n个插槽之一。h(k) = k mod n。例如,如果您的数组大小为,n = 100并且键为整数,k = 15h(k) = 10

  3. Hashtable已同步,而Hashmap未同步。Hashmap允许将空值用作键,但Hashtable不允许。

  4. 哈希表的目的是在添加和获取元素时具有O(c)恒定的时间复杂度。在大小为N的链表中,如果要获取最后一个元素,则必须遍历所有列表,直到获得它为止,因此复杂度为O(N)。对于哈希表,如果要检索元素,则只需传递键,哈希函数将为您返回所需的元素。如果哈希函数实现良好,它将处于恒定时间O(c),这意味着您不必遍历哈希表中存储的所有元素。您将立即获得元素。

  5. 程序员/开发人员的计算机科学家需要了解数据结构和复杂性=)

2020-07-28