我正在研究使用以下课程的Hash Tables: http://algs4.cs.princeton.edu/34hash/
在练习部分,我找到了以下内容:
密码检查程序。 编写一个程序,从命令行读取一个字符串,并从标准输入中读取单词字典,并检查它是否是"良好"密码。在这里,假设"好"意味着它(i)至少8个字符长,(ii)不是字典中的单词,(iii)不是字典中的单词后跟数字0-9(例如,hello5),(iv)不是用数字分隔的两个单词(例如,hello2world)
我认为我对如何使用哈希表(HashMap)感到困惑。假设一个更简单的练习:我们只需要检查单词是否在字典中,我需要使用哈希表来执行此操作。我的猜测是我应该使用单词as key添加字典中的所有单词,如果我想检查给定单词是否在字典中,我使用" get"方法。如果找到,这个词不是一个好密码。但是:
1)我必须将与给定密钥相关联的值放在什么位置?
2)如果两个单词哈希到同一个地方怎么办?我知道碰撞部分是使用Linear Probing或Separate Chaining解决的,所以当我使用get时,它将在数据结构中处理?
我不想让你写任何代码,我只是想了解它是如何工作的。
提前致谢!
@Edit:我的另一个想法是只使用hashCode。假设我有一个包含字典所有单词的字符串数组。然后,如果它们具有相同的哈希码,那么我必须进行比较(因为哈希必须与equals一致)。如果我理解得很好,价值并不重要,在这种情况下,我应该检查这个词是否在字典中。所以我应该检查是否给了我一些东西。
答案 0 :(得分:1)
1)我必须与给定的相关联的价值是什么 键?
如果你看一下java HashSet
实现,你会看到它在内部使用HashMap
,项目被添加到map作为键,value是一个虚拟对象,由所有条目共享。如果您没有特定值(例如流行度)与关键字相关联,则您的词典键结构更像是HashSet
而不是HashMap
。
2)如果两个单词哈希到同一个地方怎么办?我知道碰撞部分是 使用Linear Probing或Separate Chaining解决,所以当我使用get时, 它将在数据结构中处理吗?
Java HashMap
实现使用单独的链接,所有具有相同哈希码的项目都放在链表结构中。当您使用HashMap时,您不必担心冲突解决(除非您的目标是防止哈希攻击)。