【问题标题】:What is the cost of resizing a map?调整地图大小的成本是多少?
【发布时间】:2023-03-07 09:08:01
【问题描述】:

如果我们考虑动态数组,尽管调整大小的成本,推送元素的成本平均是恒定的: https://en.wikipedia.org/wiki/Amortized_analysis#Dynamic_Array

我们是否可以对具有以下假设的调整大小的哈希图说同样的话:

  • 哈希函数需要固定时间(例如返回内存地址)
  • 哈希值随机排列
  • Hashmap 是通过简单的单独链接(N 个链表的数组)实现的

我想知道使用固定大小的哈希图是否可以平均带来显着的性能优势

【问题讨论】:

    标签: data-structures hashmap


    【解决方案1】:

    是的,重新分配和重建哈希映射的摊销成本在每次插入时是恒定的,只要您在重新分配时总是以某个因子增长它。

    原因与 ArrayList 几乎相同——随着 HashMap 的增长,每个元素将(重新)插入(重新)插入的映射数量是恒定的。

    【讨论】:

    • 我认为你是对的,但仍然不相信,重新插入每个元素的映射数量肯定会很小,但重新插入的成本比向量高,我们需要迭代以前的数组,去通过链表,并遍历目标数组中的目标链表以重新插入。所以在我看来,另一张地图中的重新插入成本是二次的,所以不确定它是否平均恒定。
    • 您实际上不必遍历目标列表,因为您知道原始地图中的所有元素都是唯一的。不过,我并不是想说服你。我试图帮助你自己弄清楚。您应该编写一些伪代码来将地图复制到两倍大小的地图中。鉴于两个地图的大小与地图中的元素数量成正比,您应该得到该操作的 O(N)。
    【解决方案2】:

    这实际上取决于您的数据,以及您的散列函数是否平等地传播值。当散列函数为许多值返回相同的键时,就会出现问题,然后您会得到一个非常长的LinkedList,并且查找时间开始从O(1) 越来越多地向O(n) 变化。有一个通用的规则,说load factor 应该大约是0.75。这意味着您应该在达到75% 容量后开始调整HashMap 的大小,以将性能保持在O(1) 左右。更多信息请查看here

    【讨论】:

    • 好的,但是数字 0.75 是从哪里来的?也没有给出插入操作的平均复杂度,只是插入操作触发resize会比较慢。
    猜你喜欢
    • 1970-01-01
    • 2011-04-21
    • 2010-12-21
    • 1970-01-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2021-04-03
    相关资源
    最近更新 更多