平均值、中值查询(转)

#谷歌面试题#http://blog.sina.com.cn/s/blog_979956cc0101hd0f.html

给你一个数组,它有N个8-bit整数, (比如,从0到255), 和M个子数组,[i, j] (每个子数组由两个下标 i 和 j 确定,0 <= i <= j < N)。对每个子数组,找到平均值和中值

分析:假设仅需要求一个子数组,则我们可以在线性时间内求出平均值和中值。

case 1:M很小,则可以用M次brute-force算法求出,时间复杂度O(M*N),空间复杂度O(1)

case 2:  M很大,N较小, M >> N^2,则可以预处理,用O(N^2)的空间存储所有M个子数组可能的结果,预处理时间O(N^2),M次查询时间为O(M)

case 3:  N较大时,

1) 平均值:计算累加和sum[i] 为从0到i的求和,则mean(i, j) = sum(i, j) / (j - i + 1) = ( sum[j] - sum[i-1]) / (j - i + 1), 预处理时间O(N),空间O(N),M次查询时间O(M)

2)中值:与平均值类似,计算累加的统计频数,c[i][ ]为从0到i这i+1个值在0~255上的分别出现次数的数组,利用c[j][ ] - c[i-1][ ]即可求出[i, j]之间所有数在0~255上出现的频数数组,根据这个数组可在O(256)时间内求出中值, 预处理时间O(N),空间O(N),M次查询时间O(M)

用到等式S[I --J]=S[J] –S[I];

原文地址:https://www.cnblogs.com/cheng07045406/p/3231321.html