• 平均值、中值查询(转)


    #谷歌面试题#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];

  • 相关阅读:
    sizeof与strlen的区别
    面试题46:求1+2+...+n
    opennebula 安装指定参数
    opennebula 开发记录
    virsh 查看hypervisor特性
    opennebula kvm日志
    Cgroup
    opennebula kvm 创建VM oned报错日志
    opennebula kvm 创建虚拟机错误
    golang hello
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3231321.html
Copyright © 2020-2023  润新知