使用子集获得大数据集平均值的时间复杂度

时间:2015-03-24 15:45:21

标签: algorithm sorting big-o

假设您有一大组数字(大小为n),并要求您计算数据的平均值。您一次只有足够的空间和内存用于c号码。这些数据的运行时复杂性是什么?

2 个答案:

答案 0 :(得分:0)

O(n)

基本(虽然不是特别稳定)算法迭代计算如下:

mean = 0
for n = 0,1,2,.. length(arr)-1
    mean = (mean*n + arr[n])/(n+1)

此算法的一种变体可用于以c个数字形式解析数组中的数据,但在n中仍然是线性的。

即,拼写出seralization:

要拼写出来,你可以这样做:

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次循环。

这也假设获得第二组数字是一个恒定时间操作。