Python算法:前缀和与差分

前缀和:        

数组a[0]~a[n-1],前缀和sum[i]等于a[0]~a[i]的和:

sum[0]=a[0]        sum[1]=a[0]+a[1]        sum[2]= a[0]+ a[1]+a[2]

能在0(n)时间内求得所有前缀和:sum[i] = sum[i-1]+a[i]

预计算出前缀和,能快速计算出区间和: a[i] + a[i+1] +... +a[j-1]+a[j]= sum[j]- sum[i-1]

复杂度为O(n)的区间和计算,优化到了O(1)的前缀和计算

前缀和与差分的关系

一维差分数组D[k]=a[k] -a[k-1],即原数组a[ ]的相邻元素的差

Python算法:前缀和与差分_第1张图片a[k]=D[1]+ D[2] +...+D[k]

a[ ]是D[ ]的前缀和

差分是前缀和的逆运算:把求a[k]转化为求D的前缀和

差分数组能提高修改的效率:

把区间[L,R]内每个元素a[ ]加上d,只需要把对应的D[ ]做以下操作:

  (1)把D[L]加上d:              D[L] +=d

    (2)把D[R+1]减去d:        D[R+1]-=d

原来需要O(n)次计算,现在只需要O(1)

利用D[ ],能精确地实现只修改区间[L,R]内元素的目的。原来需要O(n)次计算,现在只需要O(1)

前缀和a[x]=D[1]+D[2] +..+D[x],有:

        (1)1≤x

        (2)L≤x≤R,前缀和a[x]增加了d;

        (3)R

二维数组前缀和:

这里的前缀指的是从(0,0) 到 (x,y)这个矩形区域,其和就是 s[x][y]
前缀和的推导公式 s[i][j] = s[i-1][j] + s[i][j-1]- s[i-1][j-1] + val[i][j]

你可能感兴趣的:(算法,python,算法,开发语言)