【问题标题】:Hash set function for hashing散列的散列集函数
【发布时间】:2013-05-18 15:14:47
【问题描述】:

我正在尝试实现散列集,但散列函数遇到了一些问题。我想在集合中添加有姓名和电话号码的人:

class Person{
    string name;
    long long int phoneNumber;
}

我在集合中的索引是通过将 phoneNumber 的数字相加来计算的。问题是我不希望我的函数是这样的:

int add(long long int nr, Element e) - the function that adds an Element to the set
{
     int hashCode = hash(nr);;
     ...
}

long long int nr 应该是 phoneNumber,Element e 应该是 Person。我的意思是,这很愚蠢。如果我已经有这个人作为参数,为什么还有它的 phoneNumber 呢?如您所见,我正在使用模板,我的老师建议我为 hashFunction 做一个虚拟类,以强制它成为相应的类型(类似于 Java 中的 HashSet)。问题是我不知道该怎么做。你有什么想法可以帮助我吗?

【问题讨论】:

  • 电话号码不是整数,而是一串数字。
  • @sftrabbit 随便!这不是重点。
  • 用电话号码作为索引有点奇怪。电话号码通常不能识别一个人。一个电话号码可以有多种写法,因此电话号码需要被规范化才能用作索引。最后,如果您想根据电话号码进行查找,最好使用(散列)map 而不是 set

标签: c++ hash set


【解决方案1】:

如果你这样做:

 int add(Person p, Element e)

您将限制您的 hastset 类完全依赖于Person 类。以这种方式将整数或字符串值带入哈希方法更合理。您可以在散列方法之外确定要散列的参数并将其作为输入。

此外,当您在 Person 类中添加另一个成员(例如 age 并在哈希中使用 in)时,您还需要修改 hash 方法以使用该特定成员。

【讨论】:

  • @faith_k 我想做void add(Person* p) 并且添加函数知道如何计算索引:int hash = int hashCode(p->phoneNumber)
  • @MonsterMonster 我不明白,是什么阻止你这样做?
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 2016-02-14
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 1970-01-01
  • 2012-06-12
  • 2017-02-08
相关资源
最近更新 更多