【发布时间】:2013-08-02 23:12:14
【问题描述】:
我正在寻找对两个不同但相关的论点的验证——那些高于 (A) 和低于 (B) 的第一行 line-comment 在 Q .
(A) HashMap 的结构方式是:
HashMap 是一个普通的表。那就是直接内存访问(DMA)。
HashMap(或一般的散列)背后的整个想法首先 就是把这个恒定时间的内存访问用于
a.) 通过自己的数据内容访问记录(
b.) 管理可变数量的记录—— 没有给定大小的记录,并且可能/不会保持不变 在整个使用这种结构的大小。
所以,Java Hash 中的整体结构是:
a table: table // 我正在使用 HashMap
中使用的标识符此表的每个单元格都是一个桶。
每个bucket都是一个Entry类型的链表——
即这个链表的每个节点(不是Java/API的链表,而是数据结构)的类型是Entry,它又是一个
当一个新的对被添加到哈希中时,
为这个 对计算一个唯一的 hashCode。
这个 hashCode 是 table 中这个
当bucket确定后,
//=============================================== ===================
(B) 从我在 HashMap 中看到的情况来看,table 的大小调整 - 哈希仅在基于以下决定的情况下完成 哈希大小和容量,它们是当前的和最大的。 # 整个哈希中的条目。
没有对单个存储桶大小进行重组或调整大小 - 例如“当存储桶中的 max.#entries 超过此类时的 resize()”。
这不太可能,但是有可能大量条目可能会堆积在一个桶中,而其余的哈希几乎是空的。
如果是这种情况,即每个桶的大小没有上限,哈希不是恒定的而是线性访问——理论上是为了一件事。获取哈希中的条目需要 $O(n)$ 时间,其中 $n$ 是条目的总数。但那不应该。
//=============================================== ===================
我认为我没有遗漏上述 (A) 部分中的任何内容。
我不完全确定 (B) 部分。这是一个重要的问题,我正在寻找这个论点的准确性。
我正在寻找对这两个部分的验证。
提前致谢。
//=============================================== ===================
编辑:
最大存储桶大小是固定的,即,无论何时,哈希都会被重组 存储桶中的#entries 达到最大值将解决它——访问时间很简单 在理论上和使用中是恒定的。
这不是一个结构良好但快速的解决方案,并且可以正常访问以进行持续访问。
hashCodes 很可能均匀分布在整个存储桶中,而且不太可能 在达到哈希整体大小的阈值之前,任何一个桶都将达到桶最大值。 这也是当前 HashMap 设置使用的假设。
也基于下面 Peter Lawrey 的讨论。
【问题讨论】:
标签: java hash time-complexity