当空间用尽时,为什么动态数组的大小会特别增加一倍?

丹尼尔

我是摊销分析的新手。我注意到,动态数组的常见做法是在空间不足时将其大小加倍。我们选择加倍尺寸是否有特定原因?为什么不三重或四重?对于使用摊余分析加倍的选择是否有具体解释?还是选择是任意的?

templatetypedef

通过按任何常数因子进行缩放来增大数组大小将足以使运行时为O(n)。要看到这一点,请注意,如果最终数组的大小最终为n,并且在每个步骤中我们将比例缩放为m,那么完成数组增长的总工作量将为

1 + m + m 2 + ... + m 1 + log m n

要了解为什么会这样,请注意(如果数组从大小1开始),则数组将以大小1,m,m 2 ... ...增长,直到达到大小n。最后一个增长步骤在m k = n时发生,而在k = log m n时发生考虑到另外一个增长步骤来超调n个,因此这里的+1。

上面的总和是一个几何级数的总和

(m 2 + log m n -1)/(m-1)

=(m 2 n-1)/(m-1)

≤n·(m 2 /(m-1))

因此,基本上任何大于1的指数都起作用,但是前导系数取决于我们选择m的​​方式。对于大的m,该系数大约等于m,我们最终浪费了大量的精力和空间来增加阵列。如果m接近于1,分母将变得越来越大,并且越来越令人担忧。

选取m = 2可获得4的超前系数,该系数非常低。选择1.5可得出4.5的超前系数。那是更高的,但不是很多。但是,选择1.5还有其他一些优点:

  • 如果我们继续增加数组,分配的数组永远不会比以前大50%以上。与加倍相比,这减少了数据结构的开销。
  • 如果我们需要增加数组,则先前数组的大小总和超过新数组的大小(选中此选项-两个的幂不这样做)。这使得内存分配器更有可能从较旧的废弃数组中回收空间以适应新数组。
  • 1.5的乘法可以通过计算完成,size + (size >> 1)与乘法相比,在处理器上非常便宜。

希望这可以帮助!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在增加数组时大小增加一倍?

来自分类Dev

genisoimage使文件夹大小增加一倍

来自分类Dev

为什么Cosmos Upserts会使插入成本增加一倍?

来自分类Dev

为什么toString('hex')导致Nodejs中的字节增加一倍?

来自分类Dev

从CGImageRef创建NSImage会使图像像素大小增加一倍

来自分类Dev

在sgma.js中,通过鼠标悬停使节点大小增加一倍

来自分类Dev

当列表需要更多空间时,它们在c#中的空间将增加一倍。在某个时候将1024翻倍为2048的效率降低了吗?

来自分类Dev

职位增加一倍以上吗?

来自分类Dev

如何将观察值增加一倍?

来自分类Dev

为什么我的AIR iOs应用程序大小增加了一倍?

来自分类Dev

为什么DynamoDB一步一步删除项目将使写入吞吐量增加一倍

来自分类Dev

以更固定的方式增加一倍到两倍?

来自分类Dev

为什么在64位体系结构中对象标头的大小增加了一倍?

来自分类Dev

边缘权重每隔一跳就增加一倍的最短路径

来自分类Dev

切片如何通过追加放大?容量是否总是增加一倍?

来自分类Dev

将@time报告的Julia中的大向量分配增加一倍

来自分类Dev

1分钟后,JavaScript计时器秒数增加一倍

来自分类Dev

从单核升级到双核-吞吐量会增加一倍吗?

来自分类Dev

以二进制格式保存后,Python数组的大小增加了一倍

来自分类Dev

PostgreSQL大小增加了一倍

来自分类Dev

在给定时间点的情况下,如何从纪元开始将秒数增加一倍?

来自分类Dev

如果我从tmpfs映射文件,它将使内存使用量增加一倍吗?

来自分类Dev

在图形中找到最安全的路线,但要防止最快路线的旅行时间增加一倍?

来自分类Dev

从ext4复制到NTFS-3G时,rsync的大小增加了一倍

来自分类Dev

当作为公共虚拟继承时,为什么类的大小会增加?

来自分类Dev

为什么shred的-z选项慢一倍?

来自分类Dev

为什么Jenkins日志文件大小会增加很多?

来自分类Dev

通过使用双cpu pc将可用的cpu内核增加一倍,性能是否与使用双核cpu的cpu相同?

来自分类Dev

更新到单个新列时数据库大小增加了一倍

Related 相关文章

  1. 1

    为什么在增加数组时大小增加一倍?

  2. 2

    genisoimage使文件夹大小增加一倍

  3. 3

    为什么Cosmos Upserts会使插入成本增加一倍?

  4. 4

    为什么toString('hex')导致Nodejs中的字节增加一倍?

  5. 5

    从CGImageRef创建NSImage会使图像像素大小增加一倍

  6. 6

    在sgma.js中,通过鼠标悬停使节点大小增加一倍

  7. 7

    当列表需要更多空间时,它们在c#中的空间将增加一倍。在某个时候将1024翻倍为2048的效率降低了吗?

  8. 8

    职位增加一倍以上吗?

  9. 9

    如何将观察值增加一倍?

  10. 10

    为什么我的AIR iOs应用程序大小增加了一倍?

  11. 11

    为什么DynamoDB一步一步删除项目将使写入吞吐量增加一倍

  12. 12

    以更固定的方式增加一倍到两倍?

  13. 13

    为什么在64位体系结构中对象标头的大小增加了一倍?

  14. 14

    边缘权重每隔一跳就增加一倍的最短路径

  15. 15

    切片如何通过追加放大?容量是否总是增加一倍?

  16. 16

    将@time报告的Julia中的大向量分配增加一倍

  17. 17

    1分钟后,JavaScript计时器秒数增加一倍

  18. 18

    从单核升级到双核-吞吐量会增加一倍吗?

  19. 19

    以二进制格式保存后,Python数组的大小增加了一倍

  20. 20

    PostgreSQL大小增加了一倍

  21. 21

    在给定时间点的情况下,如何从纪元开始将秒数增加一倍?

  22. 22

    如果我从tmpfs映射文件,它将使内存使用量增加一倍吗?

  23. 23

    在图形中找到最安全的路线,但要防止最快路线的旅行时间增加一倍?

  24. 24

    从ext4复制到NTFS-3G时,rsync的大小增加了一倍

  25. 25

    当作为公共虚拟继承时,为什么类的大小会增加?

  26. 26

    为什么shred的-z选项慢一倍?

  27. 27

    为什么Jenkins日志文件大小会增加很多?

  28. 28

    通过使用双cpu pc将可用的cpu内核增加一倍,性能是否与使用双核cpu的cpu相同?

  29. 29

    更新到单个新列时数据库大小增加了一倍

热门标签

归档