【问题标题】:Use Hash Table to create a dictionary of words使用哈希表创建单词字典
【发布时间】:2015-06-14 19:22:02
【问题描述】:

我正在使用以下课程自学哈希表: http://algs4.cs.princeton.edu/34hash/

在练习部分,我发现了以下内容:

密码检查器。 编写一个程序,从命令行读取字符串和标准输入的单词字典,并检查它是否“好”密码。在这里,假设“好”意味着它 (i) 至少有 8 个字符长,(ii) 不是字典中的单词,(iii) 不是字典中的单词,后跟数字 0-9(例如, hello5), (iv) 不是由数字分隔的两个单词(例如,hello2world)

我想我对如何使用哈希表 (HashMap) 感到困惑。假设一个更简单的练习:我们只需要检查单词是否在字典中,我需要使用哈希表来执行此操作。我的猜测是我应该使用单词作为键添加字典中的所有单词,如果我想检查给定单词是否在字典中,我使用“get”方法。如果找到,这个词不是一个好的密码。但是:

1) 与给定键关联的值应该是什么?

2) 如果两个词散列到同一个地方怎么办?我知道碰撞部分是用Linear Probing或者Separate Chaining解决的,所以我用get的时候会在数据结构中处理?

我不想让你编写任何代码,我只是想了解它是如何工作的。

提前致谢!

@Edit: 我的另一个想法是只使用 hashCode。假设我有一个包含字典所有单词的字符串数组。然后,如果它们具有相同的哈希码,我必须进行比较(因为哈希必须与等于一致)。如果我理解得好,值无关紧要,在这种情况下,我只需要检查单词是否在字典中。所以我应该检查是否有东西还给我。

【问题讨论】:

  • 添加什么作为值是个好问题。如果您只需要检查单词是否存在,只需使用HashSet 即可。否则,您可能想要进行一些统计跟踪(用户尝试使用特定单词的次数),但出于安全原因,这可能不是一个好主意。

标签: java hash


【解决方案1】:

1) 我必须将与给定关联的值是多少 钥匙?

如果您查看 java HashSet 实现,您会发现它在内部使用了 HashMap,项目作为键添加到映射中,而 value 是一个虚拟对象,由所有条目共享。如果您没有特定的值(例如流行度)与某个键相关联,那么您的字典键结构更像是 HashSet 而不是 HashMap

2) 如果两个词哈希到同一个地方怎么办?我知道碰撞部分是 使用线性探测或分离链接解决,所以当我使用 get 时, 会在数据结构中处理吗?

JavaHashMap 实现使用单独的链接,所有具有相同哈希码的项目都放在一个链表结构中。当您使用 HashMap 时,您不必担心冲突解决(除非您的目标是防止哈希攻击)。

【讨论】:

  • 感谢您的回复。我不知道 HashSet,现在我知道它正是我需要的。
猜你喜欢
  • 1970-01-01
  • 2012-06-27
  • 1970-01-01
  • 2012-07-16
  • 2013-03-21
  • 2012-08-23
  • 2014-01-04
  • 1970-01-01
  • 2014-06-13
相关资源
最近更新 更多