如果我使用堆栈上的零填充初始化语法定义以下数组:
int arr[ 10 ] = { 0 };
...是运行时常数还是线性?
我的假设是它是一个线性运行时间 - 我的假设仅针对calloc
必须遍历每个字节以将其填充为零的事实。
如果你也可以提供一个原因,而不仅仅是它的订单xxx将是巨大的!
答案 0 :(得分:1)
运行时在数组大小上是线性的。
要了解原因,这里是memset的sample implementation,它将数组初始化为任意值。在汇编语言级别,这与您的代码中发生的情况没有什么不同。
void *memset(void *dst, int val, size_t count) {
unsigned char *start = dst;
for (size_t i = 0; i < count; i++)
*start++ = value;
return dst;
}
当然,编译器通常会使用intrinsics一次设置多个数组元素。根据数组的大小以及对齐和填充等内容,这可能会使运行时数组长度更像楼梯,步长大小取决于向量长度。对于数组大小的微小差异,这将有效地使运行时保持不变,但一般模式仍然是线性的。
答案 1 :(得分:1)
这实际上是冰山问题的一小部分。您真正要问的是初始化数组的顺序(Big Oh)是什么。本质上,代码循环遍历数组的每个元素并将它们设置为零。你可以编写一个for循环来做同样的事情。
该循环的数量级为O(n),也就是说,循环中花费的时间与初始化元素的数量成比例增加。
如果硬件支持一条指令,说明将所有字节从位置X设置为Y并且该指令在M个指令周期内工作且M从未改变,无论字节数被设置为零,那么那将是订单k,或O(k)。
通常,O(k)可能被称为常数时间,O(n)可能被称为线性。