【发布时间】:2018-12-04 21:49:55
【问题描述】:
.Net 中分配数组的大 O 时间复杂度是多少?
我猜如果数组足够小以适合临时段,它应该是 O(1),但是随着 n 变大,找到足够的内存变得更加困难,因此它可能会改变。
此外,大对象堆也可能是碎片化的,因此如果 n 足够大以使数组适合 LOH,它可能不会是 O(1)。
【问题讨论】:
-
"但是随着 n 变大,找到足够的内存变得更加困难,因此它可能会改变。"但是整个空闲内存都在一个连续的块中。您似乎在考虑 C++ 内存模型,其中对象不会通过 GC 在内存中移动。与小对象堆不同,LOH 没有被压缩,因此该语句适用于它。
-
LOH 是否使用 malloc 样式的内存管理?
-
它不会压缩内存。我不确定它们有多么相似(或者甚至不同的 C/C++ 实现往往有多么不同)。
-
O(1) 其中第 1 次操作的成本可能相差很大,这确实是您可以对任何远程典型分配有用的最佳方法
-
嗯,数组需要进行零初始化。我想这也能让你得到 O(n)。
标签: c# .net memory-management garbage-collection big-o