Java HashMap 调整大小的时间复杂度

2023-12-20

我想知道时间复杂度是多少Java HashMap当负载因子超过阈值时调整大小?据我了解,HashMap 的表大小始终是 2 的偶数次幂,因此每当我们调整表大小时,我们不需要重新散列所有键(如果我错了,请纠正我),我们需要做的就是是分配额外的空间而不复制旧表中的所有条目(我不太确定JVM内部如何处理它),对吗?而对于Hashtable因为它使用素数作为表大小,所以每当我们调整表大小时,我们都需要重新哈希所有条目。所以我的问题是调整大小是否仍然需要 O(n) 线性时间HashMap ?


还需要吗O(N)调整大小的时间HashMap?

基本上,是的。

结果是插入操作这会导致调整大小将采取O(N)时间。但这发生在O(1/N)所有插入,所以(在某些假设下)average插入时间是O(1).

那么良好的负载因子会影响这种性能吗?喜欢比更好更快O(N)?

负载因子的选择会影响性能,但不会影响复杂性。

如果我们对哈希函数和键聚类进行正常假设,当负载因子较大时:

  • 平均哈希链长度更长,但仍然O(1),
  • 调整大小的频率减少,但仍然存在O(1/N),
  • 调整大小的成本保持不变,并且复杂性仍然是O(N).

...所以每当我们调整表的大小时,我们都不需要重新哈希所有键(如果我错了,请纠正我。

其实,你would需要重新散列所有密钥。当哈希表大小加倍时,需要拆分哈希链。为此,您需要测试每个键的哈希值映射到两个链中的哪一个。 (事实上​​,如果哈希表也有开放的组织,则您需要执行相同的操作。)

然而,在当前这一代HashMap实现中,哈希码值为cached在链接的条目对象中,因此不需要重新计算键的哈希码。


一条评论提到了一种退化情况,即所有键都散列到相同的散列码。发生这种情况的原因可能是哈希函数设计不当,或者密钥分布不均。

这会影响查找、插入和其他操作的性能,但不会影响调整大小的成本或频率。

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

Java HashMap 调整大小的时间复杂度 的相关文章

随机推荐

  • 如何检测数据集中的所有空列并删除\删除它们?

    正如标题中所建议的 我想删除所有空列 变量 其中所有记录均为空或等于 null 或 以减少以后执行的时间成本 详细场景 我有一个包含 1000 列的 dataset 其中一些 很多是空的 现在我想创建一个新的数据集 其中需要在先前数据集的某
  • 如何存储由 std::unique_ptr 给出的抽象类的对象向量?

    我有一个循环 其中我使用一个函数将 std unique ptr 返回到抽象类的对象 我想通过push back将这些对象存储到std vector中 但由于对象是抽象类型 我收到以下错误 error cannot allocate an
  • 防止 Perl 中的循环引用内存泄漏

    我最近问了一个question https stackoverflow com questions 31971633 perl memory management when overwriting objects关于 Perl 中的覆盖对象
  • 如何在asp.net core中将ViewDataDictionary与Html.Partial一起使用?

    我的案例是这样的 Model public class Book public string Id get set public string Name get set public class Comment public string
  • 如何通过spark REST API获取所有作业状态?

    我正在使用 Spark 1 5 1 我想通过 REST API 检索所有作业状态 我使用得到正确的结果 api v1 applications appId 但在找工作的同时 api v1 applications appId jobs得到
  • 金字塔和变色龙中的ajax小部件

    我希望能够在服务器端轻松创建由变色龙和金字塔支持的ajax 小部件 Pyramid 是否提供任何可以使编写小部件变得容易的管道代码 我当前的方法是我有一个使用 home pt 作为渲染器的主视图 home pt 使用宏 base pt 定义
  • 如何在 CUDA 中进行原子加载

    我的问题是如何在 CUDA 中进行原子加载 原子交换可以模拟原子存储 原子加载是否可以以类似的方式廉价地模拟 我可以使用带有 0 的原子添加来自动加载内容 但我认为它很昂贵 因为它执行原子读取 修改 写入而不是仅读取 除了使用volatil
  • android-support-v7-mediarouter 中的 styles.xml 错误

    以下是 android support v7 mediarouter 的 styles xml 文件
  • 如何在多个文件中导入常量

    我有一个包含许多模块的包 每个模块都使用我在每个文件中独立定义的常量 然而 所有这些常数必须彼此一致 所以我尝试在单个文件中定义它们并将其导入每个文件中 当我运行它时 出现未找到常量的错误 他们是让许多其他人导入单个文件并包含常量的干净方法
  • 在 JavaScript 中将 DOM 节点或文档转换为 XML

    假设您在 JavaScript 中收到一个 DOM 元素或文档 例如 window document 您如何将其转换为有效的 XML 更具体地说 对于我的示例 我有一个显示 SVG 的网页 该 SVG 有大量 JavaScript 来允许交
  • Python、tkinter 和导入的类:记录未捕获的异常

    我正在编写一些想要与我的团队共享的脚本 因此我一直在构建一堆日志记录 以便在他们在某个地方遇到崩溃时更容易进行调试 从那时起我就可以看到到底发生了什么崩溃 一般记录到文件没有问题 但我有一个未捕获的异常问题 我尝试了各种方法来让它工作 例如
  • 程序集中的类顺序

    什么决定了程序集中类的顺序 还有 有办法改变它吗 附加信息 您可以自己通过反射检查顺序 也可以使用ILDASM之类的工具 禁用字母排序 然后您也会得到顺序 顺序似乎是由编译器以一种奇怪的方式确定的 我已经尝试了一些事情 例如重命名类 顺序保
  • cakephp 中在哪里定义常量

    我应该在哪个文件中定义特定于我的 cakephp 应用程序的应用程序范围常量 我在 app config bootstrap php 中定义它们 引导 CakePHP 如果您有任何其他配置需求 请使用 CakePHP 的引导文件 该文件位于
  • JBoss 4.2.2 节点开始集群然后互相怀疑

    我有一个在现有 Red Hat 服务器上运行 JBoss 4 2 2 的网站 我正在设置第二台服务器 以便拥有一对集群 然后将进行负载平衡 但是 我无法让它们成功集群 现有服务器启动 JBoss run sh c default b 0 0
  • xslt apply-templates 选择所有剩余的文本节点

    我有这个简化的 xml a b b a
  • 在 C++ 应用程序中使用纯 C(非类包装)函数时是否存在任何问题?

    我计划在 C 应用程序中使用纯 C MPI 库 我不想通过运行例如添加不必要的膨胀 Boost MPI 层将所有内容包装在MPI
  • 如何在Flutter中更改按钮主题的文本颜色

    如果我向我的应用程序添加一个主题 如下所示 class MyApp extends StatelessWidget override Widget build BuildContext context return MaterialApp
  • 使用 _renderItem 类型会破坏自动完成字段

    我有一个 jQuery 自动完成字段 到目前为止一直运行良好 我决定使用 renderItem因为我想在结果中使用一些 HTML 这是我的代码 function prepareClientField var renderItemFuncti
  • Android 中的*窗口焦点*什么时候会改变?

    在我的项目中 我需要捕捉窗口焦点的变化 我已经注销了活动所有阶段的结果 当屏幕亮起时 结果如下 02 17 13 50 03 898 DEBUG InquiryInterface 3829 onCreate screen state fal
  • Java HashMap 调整大小的时间复杂度

    我想知道时间复杂度是多少Java HashMap当负载因子超过阈值时调整大小 据我了解 HashMap 的表大小始终是 2 的偶数次幂 因此每当我们调整表大小时 我们不需要重新散列所有键 如果我错了 请纠正我 我们需要做的就是是分配额外的空