在C ++中查找给定数组中子数组均值的均值
在这个问题中,我们得到了大小为n且整数为m的数组arr []。我们的任务是在给定数组中查找子数组均值的均值。
代码描述-在这里,我们需要找到数组的平均值作为大小为m的子数组的平均值。
让我们举个例子来了解这个问题,
输入
arr[] = {2, 5, 3, 6, 1}, m = 3输出结果
3.78
解释
All subarrays of size m are {2, 5, 3}, {5, 3, 6}, {3, 6, 1}Means of means of subarray of size m,
$$(\ left(\ frac {2 + 5 + 3} {3} \ right)+ \ left(\ frac {5 + 3 + 6} {3} \ right)+ \ left(\ frac {3 + 6 +1} {3} \ right))/ 3 = \ left(\ frac {10} {3} \ right)+ \ left(\ frac {14} {3} \ right)+ \ left(\ frac {10 } {3} \ right)/3=34/3/3=3.78$$
解决方法
解决此问题的简单方法是找到所有大小为m的子阵列并找到其均值。然后将所有这些方法相加并除以子数组的数量。并返回结果。
另一种更有效的方法是使用滑动窗口算法。我们将从索引0开始找到大小为m的发现。为每个窗口找到均值和总和。最后,将总和除以窗口计数并返回值。
该程序说明了我们解决方案的工作原理,
示例
#include <iostream>输出结果using namespace std;
float calcMeanOfSubarrayMeans(int arr[], int n, int m) {
float meanSum = 0, windowSum = 0;
for (int i = 0; i < m; i++)
windowSum += arr[i];
meanSum += (windowSum / m);
for (int i = 0; i < n; i++) {
windowSum = windowSum - arr[i - m] + arr[i];
meanSum += (windowSum / m);
}
int windowCount = n - m + 1;
return (meanSum / windowCount);
}
int main() {
int arr[] = { 4, 1, 7, 9, 2, 5, 3};
int n = sizeof(arr) / sizeof(arr[0]);
int m = 3;
cout<<"子数组均值的均值为 "<<calcMeanOfSubarrayMeans(arr, n, m);
return 0;
}
子数组均值的均值为 8.06667
以上是 在C ++中查找给定数组中子数组均值的均值 的全部内容, 来源链接: utcz.com/z/340049.html