使用O(1)性能初始化n个元素数组?

时间:2008-11-19 21:55:56

标签: performance

有人知道我该怎么办?

感谢

8 个答案:

答案 0 :(得分:5)

如果您需要对一组n元素的每个元素执行某些操作,则不能以比O(n)性能更好的方式执行此操作。

答案 1 :(得分:4)

如果你的意思是“在一个独立于N的时间内初始化一个密集的N个项目”,那么它在物理上是不可能的。密集阵列的存储空间随着项目数量呈线性增长,初始化此空间需要一段线性时间。

您可以使用稀疏数组进行常量初始化。这本质上是一个关联数组(或hashmap,或字典,或表,取决于语言),它们在首次访问时初始化项目。

答案 2 :(得分:1)

我认为它只是一个简单的语法问题。在C ++中,您可以这样做:

int foo[1000] = {0};

数组中的所有值现在都是0

虽然看起来它是在恒定时间内完成的,但它仍然是O(n)

答案 3 :(得分:1)

实际上, 是可能的,但仅限于硬件帮助。在软件上,您必须执行与n成比例的多个步骤,因此它是O(n);但是,在硬件上,您可以连接数据,以便并行设置数组的所有元素。

这实际上是时间/空间权衡;在需要O(n)时间之前,现在需要O(n)电路元素,但可以在O(1)时间内完成操作。

这实际上是常见的事情。许多硬件都有一个复位输入,当置位时,将整个硬件设置为已知状态。这可能涉及将整个内存归零。

答案 4 :(得分:1)

如果您使用Amortized Analysis计算所有未来读取操作的运行时间,可以在O(1)中执行此操作。您只需按需初始化元素(第一次读取它)。

答案 5 :(得分:0)

您可以使用O(1)时间中的常量值初始化数组。但它需要额外的内存。

看看Initializing an array in constant time

答案 6 :(得分:0)

可以完成!

您可以在 O(1)最差时间和O(1)额外空间中初始化数组,并且可以改进为仅使用数组的 1个额外位记忆。

两者都可以在此 Paper 中找到,在此 Article 中进行了简单说明,并在 {{3} } 项目。
完全披露-最后两个是我写的。

这是最先进的可初始化数组,可能会保留。上面的论文证明,没有多余的位,即使对于分期/随机化算法,填充(初始化)操作也应花费Ө(n)时间。

答案 7 :(得分:-1)

没有。这在身体上是不可能的。但是,您可以使用向量指令使其为O(n * 1 / k)时间,其中k是向量setter指令的宽度。那仍然是O(n),但是常数缩小了。