添加n个数字的时间复杂度是多少?

时间:2015-12-26 10:11:03

标签: performance big-o time-complexity

如果我必须添加任意数字,如数字1,12,14,71,83,21 ......那么这个操作的时间复杂度是多少?

我知道添加两个数字是O(1),但是n个数字列表怎么样。假设我使用最好的数据结构来存储它们,如果可能对这个过程产生任何影响的话!

提前致谢!

3 个答案:

答案 0 :(得分:2)

添加2个数字是 O(1),因为操作本身是恒定时间并且输入是固定的。无论输入如何,操作总是需要节省时间。

移动到一组项目,操作仍然是恒定的时间,但现在它已经多次完成。输入大小(N)越大,所需的时间越长,增长率将是线性的 - 对于输入中的每个额外项目,操作将需要1个周期。

因此,时间复杂度 O(N)

答案 1 :(得分:2)

它是O(N)。每个数据点必须至少被击中一次。

但是,假设您的问题是实际问题而非理论问题:如果您的N/2核心能够在一个周期内添加两个数字,则可以在log2(N)个周期内执行操作。用于快速并行方法的伪代码:

while N > 1:
    N = N / 2
    for i in 0..N: // in parallel
        X[i] += X[i + N]
// result in X[0]

与天真的方法相反:

 accum = 0
 for i in 0..N: // in serial
     accum += X[i]
 // result in accum

在天真的情况下防止并行化的瓶颈是“减少”。进入accum。我认为任何可交换的减少操作(加法,标量乘法等)都可以如上所述进行并行化。

另一个实际考虑因素是CPU和GPU处理器内核可以在单个"周期中进行多次添加。 (例如SSE)。

Big-O并未强调减少瓶颈,并不一定反映实时中测量的时间复杂度。

答案 2 :(得分:0)

这将是O(N)。例如,在伪代码中,而list包含数字:

while(list[i] != end) { //n in the size of the list, so O(N)
    sum += list[i]; //O(1)
    i++;  //O(1)
}

无论结构是什么,它总是O(N),因为你必须检查(添加)每个元素。