为什么在满时将阵列容量加倍是常见的做法?

2023-12-23

我注意到实现动态数组是很常见的(尤其是在面试问题和家庭作业中);通常,我看到的问题是这样表述的:

实现一个数组,其中doubles满时容量

或者非常相似的东西。他们几乎总是(根据我的经验)使用这个词double明确地,而不是更笼统地

实现一个数组,其中增加满时容量

我的问题是,为什么要加倍?我理解为什么使用常量值是一个坏主意(感谢这个问题 https://stackoverflow.com/questions/20448031/is-doubling-the-capacity-of-a-dynamic-array-necessary)但似乎使用比 double 更大的倍数更有意义;为什么不将容量增加三倍、四倍或平方呢?

澄清一下,我不是在问how为了使数组的容量加倍,我问why加倍是惯例。


是的,这是常见的做法。

加倍是管理内存的好方法。堆管理算法通常基于经典的 Buddy System,这是处理寻址、合并和其他挑战的简单方法。知道了这一点,在处理分配时最好坚持使用 2 的倍数(尽管有一些混合算法,如平板分配器,可以帮助解决碎片问题,因此使用倍数并不像以前那么重要)。

高德纳在他的一本书中对此进行了介绍,我已经忘记了书名。

See http://en.wikipedia.org/wiki/Buddy_memory_allocation http://en.wikipedia.org/wiki/Buddy_memory_allocation

将数组大小加倍的另一个原因是增加成本。您不希望每个 Add() 操作都触发重新分配调用。如果您已经填满了 N 个插槽,那么您很有可能需要 N 的倍数,历史是未来需求的良好指标,因此该对象需要“毕业”到下一个竞技场大小。通过加倍,重新分配的频率呈对数下降 (Log N)。加倍只是最方便的倍数(作为最小的整体乘数,它比 3*N 或 4*N 的内存效率更高,而且它往往紧密遵循堆内存管理模型)。

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

为什么在满时将阵列容量加倍是常见的做法? 的相关文章

  • 2D 矩阵上的 Numpy where()

    我有一个像这样的矩阵 t np array 1 2 3 foo 2 3 4 bar 5 6 7 hello 8 9 1 bar 我想获取行包含字符串 bar 的索引 在一维数组中 rows np where t bar 应该给我索引 0 3
  • 验证项目是否在开始日期和结束日期内

    我有一个java程序 它将检查每个项目的开始日期和结束日期 每个项目必须有自己特定的开始日期和结束日期范围 如果新的开始日期和结束日期的范围落在旧的开始日期和结束日期内 系统将提示错误消息 例如 Company ABC Item Numbe
  • 查找整数数组中的最大/最小出现次数

    我刚刚编写完一个算法 该算法可以在输入整数数组中查找出现次数最多 最少的值 我的想法是对数组进行排序 所有出现的地方现在都按顺序排列 并使用
  • 如何将一个数组中的所有项目复制到另一个数组中?

    如何将数组的每个元素 其中元素是对象 复制到另一个数组中 以便它们完全独立 我不想更改一个数组中的元素来影响另一个数组 这里的关键是 数组中的条目是对象 并且 您不希望对一个数组中的对象的修改显示在另一个数组中 这意味着我们不仅需要将对象复
  • Mac OSX 10.7.4,Xcode 4.4.1,没有 头文件?

    我正在编写一个程序 它将使用 C 标准库的数组容器来保存一些对象 但是 每当我尝试在程序中包含以下代码行时 include
  • PHP 使用主键和辅助键对多维数组进行排序[重复]

    这个问题在这里已经有答案了 如何按主键和辅助键对多维数组进行排序 例如 假设有以下数组 result array result 0 prio 1 result 0 date 2010 02 28 result 0 post February
  • 找到一个恰好出现了 N/2 次的数字

    这是我的面试问题之一 给定一个包含 N 个元素的数组以及元素出现的位置正好 N 2次 其余 N 2 个元素是unique 您如何找到运行时间更好的元素 请记住 元素未排序 您可以假设 N 是偶数 例如 input array 10 2 3
  • 无法从 XML 获取数组字符串资源

    我的 XML 文件中有一个值列表 我想根据微调器选择来选择这些值 由于某种原因 使用数组字符串作为微调器可以正常工作 这些值将填充到微调器中 无论出于何种原因 我无法获取第二个数组的值来挽救我的生命 它们位于同一个文件中 没有我能找到的错误
  • 数组索引超出范围的表视图

    我正在使用数组从数据库读取数据 目前数组中有 8 个项目 我正在尝试制作一个有节标题的表格 目前我有 4 个部分 并且我已正确设置并且它有效 它也可以在第一次运行时运行 但是当我尝试向后滚动时 我发现索引超出了范围 我正在使用 myarra
  • 如何初始化一个大多数值相同但某些值不同的静态数组?

    我想使用静态或常量数组 但使用除 T N 句法 我需要定义特定元素 但所有其他值都可以默认为 0 或其他值 在 C 中 您可以执行以下操作 byte ARRAY 256 0x1F 1 lt lt 4 Or even simply just
  • 帕斯卡三角形定位

    我编写了一个打印出帕斯卡三角形的Java程序 但是我不知道如何正确定位它 方案1 public class Triangle public static void main System out println nTriangle int
  • 删除 NSMutablearray 中的最后一个对象[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 为什么要删
  • 如何过滤掉数组的数组

    您好 我有一个包含多个值的数组 我想尝试过滤掉搜索栏的索引 英语术语的一个例子是这样的 给我名称 Name2 的索引 并通过检查每个索引的第一个值中的所有字符串来执行此操作 Code Multiple Errors var received
  • 为什么使用数组索引循环数组比指针访问慢?

    我正在读Kochan的书 Programming in C 在第 14 页的 指针和数组 部分中 264 他说 一般来说 索引数组的过程比执行索引过程花费更多的时间 访问指针内容的过程 其实这也是主要原因之一 为什么使用指针来访问数组的元素
  • 对数字和字母元素的数组进行排序(自然排序)

    假设我有一个数组 var arr 1 5 ahsldk 10 55 3 2 7 8 1 2 75 abc huds 我尝试对其进行排序 我得到了类似的东西 1 1 10 2 2 3 5 55 7 75 8 abc ahsldk huds 注
  • Swift 数组设置索引值不起作用

    我有一个方法 下面的内容 其中queue2只是一个 Int 我打印了很多东西 看看一切是否都正常 public func cool item Int println item println back queue2 insert item
  • 过滤数组以获取唯一字段值

    我知道有很多方法可以过滤数组中的唯一值 但是如何过滤数组中具有给定字段的唯一值的对象呢 例如我有 obj1 obj2 obj3 其中每个对象具有以下形式 firstName lastName 如何过滤数组以最终得到一个最终数组 其中所有对象
  • 在 postgresql 9.4 或 9.5 中查询 json 对象的嵌套数组中的元素

    studentID 1 StudentName jhon Data schoolname school1 enrolmentInfo year 2015 info courseID csc213 school IT enrollmentda
  • 在 Numpy 中切片后确定结果数组的形状

    我很难理解在 numpy 中切片后如何确定结果数组的形状 例如 我使用以下简单代码 import numpy as np array np arange 27 reshape 3 3 3 slice1 array 1 2 1 slice2
  • 如何按值删除数组中的多个项目?

    我正在尝试做一个removeAll 函数 它将删除具有该特定值 而不是索引 的数组的所有元素 当我们对循环进行任何更改时 棘手的部分就出现了 索引往往会移动 使其很难像我们想要的那样工作 并且每次更改时都重新启动循环 这在大数组上效率非常低

随机推荐

  • Try/Catch 是否比哈希查找更便宜?

    我知道异常捕获可能很昂贵 但我想知道是否在某些情况下它实际上比查找更便宜 例如 如果我有一本大字典 我可以测试一个键是否存在 If MyDictionary ContainsKey MyKey Then MyValue MyDictiona
  • h:commandButton 在 h:dataTable 中不起作用

    我正在尝试执行action通过commandButton里面一个dataTable 但是action当commandButton放置在数据表内 如下所示
  • 传递一个简单的 IEnumerable 来查看并使用 foreach 循环会返回空白屏幕?

    我有一个简单的客户模型类列表 我将其传递到我的视图 我想迭代客户类 但我的观点是告诉我通过返回空白屏幕来结束 请告诉我这里出了什么问题 型号类别 public class Customer public string CustomerNam
  • ASCII 艺术图像转换算法如何工作? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有一些不错的免费 图像到 ASCII 艺术 转换网站 如下所示 ASCII art org http www ascii art or
  • Laravel 有没有办法执行 .SQL 文件来加载数据

    我有历史数据想要加载到新数据库中 我可以通过运行 MySQL 命令来做到这一点 但我有兴趣知道是否有artisan命令来做到这一点 没有办法使用以下方式导入开箱即用的数据库转储artisan 但是 您可以创建自定义artisan命令 php
  • 什么场景调用fs.close是必要的

    我在nodejs API中找不到更多关于fs close的解释 我想知道什么场景下调用fs close是必要的 例如 var fs require fs fs writeFile home a tex abc or like fs appe
  • codeigniter 2.1.4 支持http方法自定义路由吗?

    我知道 codeigniter 支持自定义路由到另一个类 方法 例如 route product any catalog product lookup 但是 它是否支持基于调用 url 的 http 请求类型的路由 如 laravel 中那
  • Android Facebook 获取所有个人资料信息

    我如何从 Facebook 获取所有用户个人资料信息 如名字 姓氏 电子邮件等 我已经下载了FB SDK https github com facebook facebook android sdk但没有获取个人资料信息的示例 文件夹 fa
  • 如何用另一个 numpy 数组填充 numpy 数组

    我有一个空的 numpy 数组 另一个填充了值 我想用填充的数组填充空的 numpy 数组 x 次 因此 当 x 3 时 最初为空数组 看起来像 populated array populated array populated array
  • 如何使 ActionBar 上的项目分别为左、中、右各一个?

    我在用着actionbarsherlock去做吧 我想要在操作栏中显示的示例 登录 公司徽标 过滤器 我在操作栏中得到的示例 登录 公司徽标 过滤器 我在 res menu 中创建了登录按钮 公司徽标和过滤按钮 以可绘制的形式 activi
  • Django + uwsgi + nginx 重定向到默认页面“欢迎来到 NGINX”

    我是 python 和 django 的初学者 不过 我正在尝试创建一个服务器来部署我的应用程序 但是当我想访问我的应用程序时 我总是得到默认的 nginx 页面 欢迎使用 nginx 该服务器运行 Ubuntu 12 04 精确 我已经使
  • 将 switch 语句案例分组在一起?

    我可能忽略了一些东西 但是 C 中有没有一种简单的方法可以将案例分组在一起 而不是将它们单独写出来 我记得基本我可以这样做 SELECT CASE Answer CASE 1 2 3 4 C 示例 对于需要的人 include
  • 网络日期的国际化

    有人有任何好的日期国际化 架构 吗 就像英语中的it Monday 中文 Monday 荷兰语 maandag 日语 月曜日 所以我的第一个想法是创建某种类 以 59 种不同的语言存储周一到周日的字符串 显然这根本不可扩展 想象一下现在我需
  • 将实体关系模型扩展到表(子类)

    在 EER 模型中存在子类实体 我想知道在真正的 SQL 表中实现这一点的方法是什么 或者是否有任何指南可以帮助我了解如何将实体子类实现到有帮助的表中 谢谢 马丁 福勒的书企业应用架构模式 http www martinfowler com
  • 从经过身份验证的路由获取图像

    我有一个正在运行的图像上传前端 后端代码 现在我希望能够在上传后从服务器获取图像 问题是图像必须位于经过身份验证的路由后面 用户必须在标头或正文中传递 jwt 令牌 当我尝试像这样获取图像时 fetch imageURL method GE
  • hidpi 显示上的 Android 模拟器?

    我在安装了 KDE Neon 的笔记本电脑上运行 android 模拟器 26 1 3 KDE Neon 是基于 Ubuntu 16 04 和最新 KDE 的发行版 我的笔记本电脑的屏幕分辨率是 14 3840X2160 物理 DPI 31
  • Woocommerce 和 Opayo:向发送到 API 的数据添加自定义字段

    非常具体的问题 但是 我在我们的 Wordpress Woocommerce 网站上遇到了我们公司支付网关的问题 我们在该网站上使用 Opayo 插件 适用于 Opayo Direct 问题是 最初设置时 没有选择模板 选项Referenc
  • 使用Java Apache PoolingClientConnectionManager泄漏内存,如何解决?

    我的网络应用程序在晚上运行作业 并遇到问题 它使用了大量内存 我用命令来查找哪个函数占用了java资源 其结果是 tomcat uhzd006525 jstack 2365 grep 93f A 30 parking to wait for
  • 如何在Python中将元组作为参数传递?

    假设我想要一个元组列表 这是我的第一个想法 li li append 3 three 结果是 Traceback most recent call last File foo py line 12 in
  • 为什么在满时将阵列容量加倍是常见的做法?

    我注意到实现动态数组是很常见的 尤其是在面试问题和家庭作业中 通常 我看到的问题是这样表述的 实现一个数组 其中doubles满时容量 或者非常相似的东西 他们几乎总是 根据我的经验 使用这个词double明确地 而不是更笼统地 实现一个数