假设您有一大组数字(大小为n),并要求您计算数据的平均值。您一次只有足够的空间和内存用于c号码。这些数据的运行时复杂性是什么?
答案 0 :(得分:0)
是O(n)
。
基本(虽然不是特别稳定)算法迭代计算如下:
mean = 0
for n = 0,1,2,.. length(arr)-1
mean = (mean*n + arr[n])/(n+1)
此算法的一种变体可用于以c
个数字形式解析数组中的数据,但在n
中仍然是线性的。
要拼写出来,你可以这样做:
mean = 0
for m = 0, c, 2c, ..., arr_length -1
sub_arr = request_sub_arr_between(m,min(m+c-1, total_length(arr)-1))
for i = 0, 1, ..., length(sub_arr)
n = m + i
mean = (mean*n + sub_arr[i])/(n+1)
这仍然是O(n)
,因为我们只为每个n
做了大量事情。事实上,在这个答案的顶部给出的算法是c=1
的变体。如果sub_arr
没有保存在本地内存中,但每一步都读取sub_arr[n]
,那么我们只会在任何步骤存储3个数字。
答案 1 :(得分:0)
要计算整个数据集的平均值,复杂度将为O(n)。请考虑以下算法:
set sum = 0;
for(i = 0; i < n; i++){ // Loop n times
add value of n to sum;
}
set average = sum / n;
由于我们可以忽略两个常数时间操作,因此主要操作(向sum添加值)会出现n次。
在此特定示例中,您一次只能获得“c”数字的数据。对于每个单独的组,您需要时间复杂度为O(c)。但是,这不会改变您的整体复杂程度,因为最终您将获得n次通过。
为了提供一个具体的例子,考虑n = 100和c = 40的情况,你的值在数组中传递。你的第一个循环将有40个传递,第二个循环将有40个,第三个循环只有20个。无论如何,你已经完成了100次循环。
这也假设获得第二组数字是一个恒定时间操作。