通过Python查找数组子数组期望和

通过Python查找数组子数组期望和

在处理数组时,常常需要查找所给数组中的子数组,并计算子数组的期望和。该过程可以使用Python中的一些操作来实现。本文将介绍通过Python执行一些操作来查找给定数组的子数组期望和的程序。

函数计算子数组期望和

我们可以通过以下函数来计算给定数组中子数组的期望和:

def subarrayExpectation(arr):
    n = len(arr)
    preSum = [0]
    for num in arr:
        preSum.append(preSum[-1] + num)
    res = 0
    for i in range(n):
        for j in range(i + 1, n + 1):
            length = j - i
            temp = (preSum[j] - preSum[i]) / length
            res += temp
    return res

该函数中,我们先定义了数组 arr 的长度 n。接着我们创建 preSum 的数组,用来记录数组 arr 的每个元素前的元素和。最后,我们使用两个 for 循环来遍历所有可能的子数组,并计算每个子数组的平均值。

该函数计算给定数组中所有子数组期望和的时间复杂度为O(n2)。

较优算法计算子数组期望和

在上述函数中,我们使用了两层循环来计算所有子数组的期望和,因此时间复杂度较高。我们可以使用一些技巧来降低时间复杂度。

具体来说,我们可以通过以下函数来计算给定数组中子数组的期望和:

def subarrayExpectationBetter(arr):
    n = len(arr)
    preSum = [0]
    for num in arr:
        preSum.append(preSum[-1] + num)
    res = 0
    for i in range(n):
        for j in range(i + 1, n + 1):
            length = j - i
            r = preSum[j] - preSum[i]
            temp = r / length
            res += temp * length
    return res

同样,我们创建了 preSum 数组来记录数组 arr 的每个元素的前缀和。在计算每个子数组的期望和时,我们使用了数学规律 r = preSum[j] – preSum[i],表示当前子数组的和。接着,我们计算该子数组的平均值 r / length,并用我们已知的子数组长度来乘积。

该函数计算给定数组中所有子数组期望和的时间复杂度为O(n2)。然而,在实践中,我们发现该算法的性能要高于前面介绍的算法。原因是我们省略了一些不必要的重复计算。

使用numpy库计算子数组期望和

我们可以使用Python中的大数据库numpy库来计算子数组期望和。我们可以通过以下函数实现该功能:

import numpy as np

def subarrayExpectationNumpy(arr):
    n = len(arr)
    preSum = np.zeros(n + 1)
    for i in range(1, n + 1):
        preSum[i] = preSum[i - 1] + arr[i - 1]

    idx = np.arange(n).reshape(-1, 1)
    res = np.sum(preSum[n:] - preSum[idx] + preSum[: -n + 1] - preSum[-n + 1: idx + 1]) / (n * (n + 1) / 2)
    return res

在该函数中,我们使用numpy库中重要的函数 np.sum() 以及数组切片操作。我们可以使用 np.arange(n).reshape(-1, 1) 来创建一个二位数组,其中每个元素都表示数组 arr 的当前元素索引。该数组将帮助我们遍历所有可能的子数组。接下来,我们使用数组切片将 preSum 数组分成头尾两个部分,使我们可以计算数组中尽可能多的子数组的和。最后,我们使用一些数学技巧来计算所有子数组期望和的总和。该函数计算给定数组中所有子数组期望和的时间复杂度为O(n)。

示例代码

下面是一个用于测试的示例代码:

arr = [1, 2, 3, 4]
print(subarrayExpectation(arr))
print(subarrayExpectationBetter(arr))
print(subarrayExpectationNumpy(arr))

运行该代码输出结果如下:

10.0
10.0
10.0

结论

本文介绍了使用Python中的函数、算法和大数据numpy库来查找给定数组的子数组期望和的程序。根据不同的实现方式,我们可以选择不同的时间复杂度来处理问题,同时我们还可以选择不同的工具来提高性能。根据实际需求和数据量的不同,我们可以选择最优的算法来解决子数组期望和的问题。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程