关于哈希表的困惑

时间:2015-11-06 06:34:37

标签: data-structures hashtable

我目前正在学习一些访谈,我听说在某些访谈中,人们有时会被要求从头开始构建数据结构,包括哈希表。但是,我遇到了一些麻烦..从编程角度理解哈希表。

我一直在使用C ++从头开始构建这些数据结构,我知道使用模板我可以创建链接列表,动态数组,二进制搜索树等,它们基本上可以存储任何类型的对象(只要该对象是唯一可以存储在哈希表的实例中的类型。所以我认为我可以创建一个模板或者#34; generic"取决于散列表实例的散列表​​可以存储特定对象。但我有两件事让我感到困惑:

  1. 我知道通过哈希函数,不同的键被映射到构成哈希表的数组中的不同索引。但是,假设您正在使用您创建的哈希表来存储Book类型的对象,然后让我们创建另一个哈希表来存储People类型的对象。显然,不同类型的对象将具有不同的成员属性,其中一个属性必须是关键。这是否意味着您基本上想要存储在您创建的哈希表中的每个对象都必须至少有一个具有相同名称的属性?因为你的哈希函数必须有一些哈希的键值,所以它必须知道它所使用的对象的哪个属性作为哈希的键?因此,例如,您希望存储在此哈希表中的每个对象都必须具有名为" key"的属性。你可以使用哈希函数映射到数组的索引,不是吗?否则,它怎么会知道" key"哈希?

  2. 这也会导致哈希函数的问题......我已经读过,根据你给出的数据集,一些哈希函数比其他函数更好。因此,如果散列函数依赖于数据集,您怎么可能创建一个可以存储任何类型对象的散列表数据结构?

  3. 所以我只是过度思考这个?我是否应该学习创建一个简单的哈希表,在练习面试时哈希整数?现实生活中的哈希表是否一般地创建,或者人们通常会根据他们拥有的数据类型提出不同的哈希表?

    如果这个问题更适合计算机科学理论堆栈交换,请告诉我。我只是发现这些小细节让我无法真正理解这种数据结构。

1 个答案:

答案 0 :(得分:0)

您需要从哈希函数中分离哈希表,这些是不同的功能。
有两种常见的做法可以保持哈希表的通用性,并且仍然能够正确地散列对象。

  1. 首先假设您的模板类型(让它为T)实现 哈希方法,并使用它。你不关心它是怎么回事 只要你有,就实施。
  2. 另一个选项是除了模板类型之外还有一个 模板函数hash(T),需要在何时提供 声明哈希表。
  3. 这基本上解决了这两个问题:比图书馆读者更了解数据分布的用户正在提供散列函数,并且提供的散列函数适用于提供的类型,无论" key&#是什么34;是

    如果选择第二个选项,您可以为已知和原始类型实现一些默认哈希函数,因此当使用标准类型时,用户不需要为库的每次使用重新发明轮子。