【问题标题】:Separate chaining in JavaJava中的单独链接
【发布时间】:2012-10-06 02:48:14
【问题描述】:
我们的班级正在学习哈希表,我的一个学习问题涉及我使用具有单独链接的哈希表创建字典。但是,问题是我们不允许使用 Java 提供的方法来创建哈希表。相反,我们的讲义提到,单独的链接涉及数组中的每个单元格都指向一个链接的条目列表。
因此,我的理解是我应该创建一个大小为 n 的数组(其中 n 是素数),并在数组中的每个位置插入一个空链表。然后,我使用我的哈希函数对字符串进行哈希处理,并将它们插入到相应的链表中的正确数组位置。我创建了我的散列函数,到目前为止,我的 Dictionary 构造函数接受了一个大小并创建了一个该大小的数组(实际上,大小为 4999,如课堂上讨论的素数和大数)。我在正确的轨道上吗?我现在应该在每个位置插入一个新的链表,然后处理插入/删除方法吗?
【问题讨论】:
标签:
java
arrays
list
hash
【解决方案1】:
到目前为止,您所拥有的一切听起来不错。
请记住,对象引用数组的每个单元格默认为null,您可以编写插入和删除函数来处理它。如果您选择创建一个不包含任何数据的链表对象(有时称为 sentinel 节点),那么创建一个不可变(只读)实例以放入每个空槽可能是有利的,而不是而不是使用 new 创建 4,999 个单独的实例(其中大多数不保存任何数据)。
【解决方案2】:
听起来你是在正确的轨道上。
一些额外的指针:
- 在实际使用之前,不值得在每个存储桶中创建 LinkedList。因此,您可以将存储桶保留为空,直到它们被添加到。请记住编写访问器函数来考虑这一点。
- 立即创建大型数组并不总是有效的。最好从一个小数组开始,跟踪使用的容量,并在必要时扩大数组(这涉及将值重新存储到新数组中)
- 最好让您的类实现整个
Map<K,V> 接口 - 只是为了练习实现其他标准 Java 集合方法。