Java 中的散列——结构和访问时间

2023-12-10

我正在寻找两个不同但相关的论点的验证——上述论点(A)及以下(B)Q 中的第一行行注释。

(A)道路HashMap的结构是:

a HashMap是一张普通的桌子。这就是直接内存访问(DMA)。

背后的整个想法HashMap(或一般的散列)首先 是将这种恒定时间内存访问用于

a.) 通过记录自己的数据内容 () 访问记录, 不是通过它们在 DMA 中的位置(表索引)

b.) 管理可变数量的记录——一些 记录不是给定大小,并且可能/不保持不变 在整个使用该结构的过程中尺寸。

因此,Java Hash 的整体结构是:

一张桌子:table// 我正在使用中使用的标识符HashMap

该表的每个单元格都是bucket.

Each bucket是一个类型的链表Entry-- 即这个链表(不是Java/API的链表,而是数据结构)的每个节点都是类型Entry这又是一个 对。

当新的对添加到哈希中时, 一个特别的hashCode是针对该 对进行计算的。 这hashCode是这个的索引的关键table- 它说 这个 将进入哈希中的哪个桶。 笔记:hashCode通过函数“标准化”hash() (in HashMap为一) 以更好地适应当前的长度table. 索引()也在使用中 确定 将进入哪个存储桶,即表的单元格。

当桶确定后,将添加到该桶中链表的开头——结果,它是该桶中的第一个条目,也是该链表的第一个条目。 -list-that-already-existed 现在是 这个新添加的条目所指向的“下一个”条目。

//================================================== ===============

(B)从我所看到的HashMap,调整大小table-- 哈希仅根据基于以下的决策来完成 哈希大小和容量,分别是当前的和最大的。整个哈希中的 # 个条目。

不会根据各个存储桶大小进行重新构造或调整大小 - 就像“当存储桶中的 max.#entries 超过此类时调整大小()”。

这不太可能,但有可能大量条目可能会堆积在一个存储桶中,而散列的其余部分几乎是空的。

如果是这种情况,即每个桶的大小没有上限,那么哈希就不是恒定的而是线性访问——理论上是这样。获取哈希中的条目需要 $O(n)$ 时间,其中 $n$ 是条目总数。但那不应该是这样。

//================================================== ===============

我不认为我遗漏了上面(A)部分中的任何内容。

我对 (B) 部分并不完全确定。这是一个重要的问题,我正在寻找这个论点的准确性。

我正在寻找这两个部分的验证。

提前致谢。

//================================================== ===============

EDIT:

最大桶大小是固定的,即每当 存储桶中的 #entries 达到最大值即可解决该问题 - 访问时间很简单 理论上和使用中恒定。

这不是一个结构良好但快速的解决方案,并且对于持续访问来说可以很好地工作。

哈希码可能均匀分布在整个存储桶中,但可能性不大 在达到哈希总体大小的阈值之前,任何存储桶都将达到存储桶最大值​​。 这也是当前 HashMap 设置所使用的假设。

也基于 Peter Lawrey 下面的讨论。


HashMap 中的冲突仅在拒绝服务攻击等病态情况下才会出现问题。

在 Java 7 中,您可以更改哈希策略,以使外部方无法预测您的哈希算法。

AFAIK,在 Java 8 HashMap 中,字符串键将使用树形图而不是链表来进行冲突。这意味着最坏情况是 O(ln N),而不是 O(n) 访问时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 中的散列——结构和访问时间 的相关文章

随机推荐

  • Google Chart API:更改悬停图例的颜色

    所以我有一个柱形图其中一项内置功能是 您可以将鼠标悬停在图表图例中的某个项目 所谓的类别 上 然后您会在图表中相应的列周围看到一些突出显示边框 现在 我的图表中有许多列和类别 并且很难看到突出显示的系列 类别 因为默认行为仅在列周围显示 1
  • 使用“rvalueCast”的默认 Visual Studio 项目设置

    我有了一个令人震惊讽刺 gt 的发现 默认情况下 Visual Studio 2015 不兼容 C 11 我可以按照步骤操作我在这里列出对于每个项目 或使用 Notepad 或类似工具进行文件替换 但我确实注意到 命令行 属性有一个复选框
  • 在 SQL Server 中,我可以将多个节点从表插入到 XML 中吗?

    我想根据表中的数据在存储过程中生成一些 XML 以下插入允许我添加许多节点 但它们必须是硬编码或使用变量 sql variable SET MyXml modify insert
  • 使用 JSch 作为 SFTP 客户端时如何启用被动模式?

    我正在使用 JSch 作为 SFTP 客户端 现在我需要启用被动模式由于安全方面的一些限制 但我找不到启用的方法被动模式 有人可以告诉我该怎么做吗 被动模式 是FTP协议的一个特点 在正常 FTP 模式下 对于每个单独的文件 客户端都会侦听
  • 按下空格键时,删除的复选框会重新出现在树视图节点中

    我已经使用了公认的解决方案从这个问题去除checkbox from a 树形视图节点 in my WM INITDIALOG处理程序 加载后 tree有一个适当的外观 选择节点并单击所在位置后checkbox会是 什么也没有发生 check
  • keras多层LSTM模型的股价预测收敛于恒定值

    I ve made a multilayer LSTM model that uses regression to predict next frame s values of the data The model finishes aft
  • 如何使用indexedDB的承诺在@ngrx/core中设置initialState

    我想使用 idb 包在 ngrx 中设置初始状态 该包使用 Promise 来获取数据 但每次尝试设置时都会出现错误 我读到 ngrx 是同步的 这是否意味着它不能与 Promise 一起使用 我尝试过的不同方法 这是我的 idb 包装方法
  • CPU 如何知道针对硬件中断运行哪个中断服务程序?

    例如 按下键盘上的按键 导致向CPU生成硬件中断 CPU向中断控制器发送确认 在中断处理阶段 CPU如何根据键盘上的按键判断运行哪个中断服务程序呢 None
  • 元素跟随鼠标移动和滚动

    我正在尝试编写一些 Vanilla Javascript 来使元素跟随我的鼠标移动 我使用了 clientX clientY 和 mousemove 事件来使其跟随 但是当我滚动页面时 元素不会随鼠标移动 我想也许我需要使用滚动事件 但我正
  • 将 Firebase 身份验证与 Google App Engine 结合使用

    我是新手所以任何帮助表示赞赏 我使用 Google App Engine 节点 创建了一个应用程序 服务 它返回一个简单的 hello world 响应 请参阅https resumetemplatesconverter appspot c
  • 无法使用 .NET 验证 JSON Web 令牌 – 密钥太短

    我用过JSONWebTokennpm 模块生成 jwt var jwt require jsonwebtoken var payload iss https secure example com exp 1410819380 http ex
  • `Apache` `localhost/~用户名/` 不工作

    所以我最近刚刚升级到 Mac OS X Yosemite 我需要再次设置我的 Apache 我在下面创建一个文件夹 Sites user kevin并将文件权限更改为 777 并取消注释 php5module 行 etc apache2 h
  • 使用变量中存储的类型进行 PowerShell 类型转换

    我想将 NET 对象转换为另一个 NET 类型 但是 目标 NET类型 类 存储在变量中 我不想使用 asPowerShell 运算符 我正在使用复杂的非原始类型 你将如何实现这一目标 例如 这是 PowerShell 的方式来做到这一点
  • Linux 上具有零端口的 CommPortIdentifier.getPortIdentifiers

    我正在尝试连接 ubuntu 上的串行端口 但是 它对我不起作用 我在 Windows 上成功运行了同一个项目 只是使用了不同的驱动程序 问题是我在使用它时无法加载任何端口 CommPortIdentifier getPortIdentif
  • 授予对封装容器的访问权限

    class X public typedef std list
  • 如何使用 C# 解压 docx 文件?

    如何使用 C 解压 docx 文件 新的 Office 文件扩展名 docx potx xlsx 等 在上传到 Web 服务器然后下载时会变成 zip 文件 这些文件格式现在使用 Open XML 文件格式系统 因此它们与 Google O
  • 将 .org 指令与 .data 部分中的数据一起使用:与 ld 相关

    在我努力了解如何使用 GNU binutils 来构建一个简单的引导加载程序时 使用gas我遇到过这样的问题 如何告诉链接器将数据放置在使用 org 推进位置计数器的文件中 同时将文件大小保持在 512 字节 我似乎找不到办法做到这一点 尝
  • 创建 Gmail 共享链接

    我想在我的单页 Web 应用程序上放置一个按钮 允许用户通过 Gmail 发送链接 我发现有些网站 例如 addthis com 提供了这样的按钮 但是该按钮自动使用网址栏中的链接 由于我有一个单页 Web 应用程序 因此网址栏中的链接将始
  • 嵌入数组中嵌入文档中的项目字段

    我有以下查询 cursor self postCol aggregate graphLookup from pCol startWith parent connectFromField parent connectToField id as
  • Java 中的散列——结构和访问时间

    我正在寻找两个不同但相关的论点的验证 上述论点 A 及以下 B Q 中的第一行行注释 A 道路HashMap的结构是 a HashMap是一张普通的桌子 这就是直接内存访问 DMA 背后的整个想法HashMap 或一般的散列 首先 是将这种