如果我必须添加任意数字,如数字1,12,14,71,83,21 ......那么这个操作的时间复杂度是多少?
我知道添加两个数字是O(1),但是n个数字列表怎么样。假设我使用最好的数据结构来存储它们,如果可能对这个过程产生任何影响的话!
提前致谢!
答案 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)
,因为你必须检查(添加)每个元素。