在 C++ 中查詢給定陣列中子陣列均值的均值


在這個問題中,我們得到一個大小為 n 的陣列 arr[] 和一個整數 m。我們的任務是查詢給定陣列中子陣列均值的均值。

程式碼描述 − 在這裡,我們需要將陣列的均值作為大小為 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<<"The mean of subarray means is "<<calcMeanOfSubarrayMeans(arr, n, m);
   return 0;
}

輸出

The mean of subarray means is 8.06667

更新於:2021年3月12日

124 次瀏覽

開始您的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.