1
5
建议在调整大小时将数组的大小增加一倍。双倍的规模导致摊销的线性时间成本。 幼稚的想法是有两个与调整大小值相关的成本:
如果要通过一次添加一个元素来重新调整数组的大小,则内存开销为零,但复制成本是二次的。如果要分配太多的插槽,复制成本将是线性的,但是内存开销太大。 加倍会导致线性摊余成本(即在很长一段时间内,复制成本与阵列大小呈线性关系),并且保证您不会浪费超过一半的阵列。
更新:顺便说一下,显然是Java
小修正:加倍将使成本调整线性摊销,但将确保您有一个摊销的固定时间插入。检查 CMU's lecture on Amortized Analysis . |
2
5
3/2很可能被选为“一个划分清晰但小于
phi
“。有
an epic thread on
见 post #7 from Andrew Koenig 第一次提到 φ 的应用程序。 |
3
2
如果您大致知道将有多少个项,那么就将数组或arraylist预先分配到该大小,并且您将永远不必展开。无与伦比的性能! 如果不能做到这一点,实现良好的摊余成本的一个合理的方法就是保持一定比例的微利。100%或50%是常见的。 |
4
2
您应该将列表的大小调整为以前大小的倍数,而不是每次添加一个常量。 例如:
不
|
5
2
如果内存不是问题,就从一个大数组开始。 |
6
2
你的代码看起来和arraylist差不多——如果你知道你将要使用一个大的列表,你可以在创建列表时传递一个初始大小,并且完全避免调整大小。当然,这是假设您使用的是原始速度,而内存消耗并不是问题。 |
7
1
从其中一个答案的评论中:
试试这个:
你也可以用你的数组来完成。在这两种情况下都不应该调整大小,因为数组将是文件的大小(假设文件不再是int…)。 |
8
0
为了获得最佳性能,您需要尽可能少地调整大小。将初始大小设置为您通常需要的大小,而不是从n个元素开始。在这种情况下,为n选择的值无关紧要。 如果要创建大量大小不同的列表对象,那么您需要使用基于池的分配器,在退出之前不要释放内存。 为了完全消除复制操作,可以使用数组列表 |
9
0
这是一个类比,很久以前我在大型机上工作时,我们使用了一个名为vsam的文件系统,它要求您指定初始文件大小和所需的空闲空间量。 每当空闲空间量降到所需阈值以下时,所需的空闲空间量将在后台分配,而程序将继续处理。 这将是有趣的,看看这是否可以在Java中使用一个单独的线程来分配额外的空间,并在主线程继续处理的时候将它附加到数组的末尾。 |
Hatsune Miku · 比较或if语句是否更快[已关闭] 1 年前 |
Black Swan · 无法解压缩的值太多(应为2)错误 1 年前 |
Kai · 有什么方法可以轻松优化VSCode中的锈迹? 2 年前 |
Balfar · 处理NumPy阵列上的循环最有效的方法是什么? 2 年前 |
Daniel · C#轻松存储快速访问的大型位矩阵 6 年前 |
halbe · 优化音频DSP程序的numpy计算 6 年前 |
Afsara · 是否有任何方法不能优化我们的应用程序? 6 年前 |