logo

סכום הממוצע של כל קבוצות המשנה

נסה את זה ב-GfG Practice ' title= #practiceLinkDiv { display: none !חשוב; }

בהינתן מערך arr[] של N אלמנטים שלמים המשימה היא למצוא את סכום הממוצע של כל תת-הקבוצות של מערך זה.

java int להכפיל

דוּגמָה:   

Input : arr[] = [2 3 5]  
Output : 23.33
Explanation : Subsets with their average are
[2] average = 2/1 = 2
[3] average = 3/1 = 3
[5] average = 5/1 = 5
[2 3] average = (2+3)/2 = 2.5
[2 5] average = (2+5)/2 = 3.5
[3 5] average = (3+5)/2 = 4
[2 3 5] average = (2+3+5)/3 = 3.33
Sum of average of all subset is
2 + 3 + 5 + 2.5 + 3.5 + 4 + 3.33 = 23.33
Recommended Practice סכום הממוצע של כל קבוצות המשנה נסה את זה!

גישה נאיבית: פתרון נאיבי הוא לחזור על כל תת-הקבוצות האפשריות לקבל an מְמוּצָע של כולם ולאחר מכן הוסף אותם אחד אחד, אבל זה ייקח זמן אקספוננציאלי ולא יהיה אפשרי עבור מערכים גדולים יותר. 
נוכל לקבל דפוס על ידי נטילת דוגמה  



arr = [a0 a1 a2 a3]  
sum of average =
a0/1 + a1/1 + a2/2 + a3/1 +
(a0+a1)/2 + (a0+a2)/2 + (a0+a3)/2 + (a1+a2)/2 +
(a1+a3)/2 + (a2+a3)/2 +
(a0+a1+a2)/3 + (a0+a2+a3)/3 + (a0+a1+a3)/3 +
(a1+a2+a3)/3 +
(a0+a1+a2+a3)/4
If S = (a0+a1+a2+a3) then above expression
can be rearranged as below
sum of average = (S)/1 + (3*S)/2 + (3*S)/3 + (S)/4

ניתן להסביר את המקדם עם המונים באופן הבא נניח שאנו חוזרים על תת-קבוצות עם K אלמנטים אז המכנה יהיה K והמונה יהיה r*S כאשר 'r' מציין את מספר הפעמים שאלמנט מערך מסוים יתווסף תוך איטרציה על תת-קבוצות בגודל זהה. על ידי בדיקה נוכל לראות ש-r יהיה nCr(N - 1 n - 1) מכיוון שלאחר הצבת רכיב אחד בסיכום עלינו לבחור (n - 1) אלמנטים מ- (N - 1) אלמנטים כך שלכל אלמנט תהיה תדירות של nCr(N - 1 n - 1) תוך התחשבות בתת-קבוצות בגודל זהה למספר של כל האלמנטים ותדירות של סכום זהה. יהיה המונה בביטוי הסופי. 

בקוד למטה nCr מיושם בשיטת תכנות דינמית אתה יכול לקרוא עוד על זה כאן 

C++
// C++ program to get sum of average of all subsets #include    using namespace std; // Returns value of Binomial Coefficient C(n k) int nCr(int n int k) {  int C[n + 1][k + 1];  int i j;  // Calculate value of Binomial Coefficient in bottom  // up manner  for (i = 0; i <= n; i++) {  for (j = 0; j <= min(i k); j++) {  // Base Cases  if (j == 0 || j == i)  C[i][j] = 1;  // Calculate value using previously stored  // values  else  C[i][j] = C[i - 1][j - 1] + C[i - 1][j];  }  }  return C[n][k]; } // method returns sum of average of all subsets double resultOfAllSubsets(int arr[] int N) {  double result = 0.0; // Initialize result  // Find sum of elements  int sum = 0;  for (int i = 0; i < N; i++)  sum += arr[i];  // looping once for all subset of same size  for (int n = 1; n <= N; n++)  /* each element occurs nCr(N-1 n-1) times while  considering subset of size n */  result += (double)(sum * (nCr(N - 1 n - 1))) / n;  return result; } // Driver code to test above methods int main() {  int arr[] = { 2 3 5 7 };  int N = sizeof(arr) / sizeof(int);  cout << resultOfAllSubsets(arr N) << endl;  return 0; } 
Java
// java program to get sum of // average of all subsets import java.io.*; class GFG {  // Returns value of Binomial  // Coefficient C(n k)  static int nCr(int n int k)  {  int C[][] = new int[n + 1][k + 1];  int i j;  // Calculate value of Binomial  // Coefficient in bottom up manner  for (i = 0; i <= n; i++) {  for (j = 0; j <= Math.min(i k); j++) {  // Base Cases  if (j == 0 || j == i)  C[i][j] = 1;  // Calculate value using  // previously stored values  else  C[i][j] = C[i - 1][j - 1] + C[i - 1][j];  }  }  return C[n][k];  }  // method returns sum of average of all subsets  static double resultOfAllSubsets(int arr[] int N)  {  // Initialize result  double result = 0.0;  // Find sum of elements  int sum = 0;  for (int i = 0; i < N; i++)  sum += arr[i];  // looping once for all subset of same size  for (int n = 1; n <= N; n++)  /* each element occurs nCr(N-1 n-1) times while  considering subset of size n */  result += (double)(sum * (nCr(N - 1 n - 1))) / n;  return result;  }  // Driver code to test above methods  public static void main(String[] args)  {  int arr[] = { 2 3 5 7 };  int N = arr.length;  System.out.println(resultOfAllSubsets(arr N));  } } // This code is contributed by vt_m 
C#
// C# program to get sum of // average of all subsets using System; class GFG {    // Returns value of Binomial  // Coefficient C(n k)  static int nCr(int n int k)  {  int[ ] C = new int[n + 1 k + 1];  int i j;  // Calculate value of Binomial  // Coefficient in bottom up manner  for (i = 0; i <= n; i++) {  for (j = 0; j <= Math.Min(i k); j++)   {  // Base Cases  if (j == 0 || j == i)  C[i j] = 1;  // Calculate value using  // previously stored values  else  C[i j] = C[i - 1 j - 1] + C[i - 1 j];  }  }  return C[n k];  }  // method returns sum of average   // of all subsets  static double resultOfAllSubsets(int[] arr int N)  {  // Initialize result  double result = 0.0;  // Find sum of elements  int sum = 0;  for (int i = 0; i < N; i++)  sum += arr[i];  // looping once for all subset   // of same size  for (int n = 1; n <= N; n++)  /* each element occurs nCr(N-1 n-1) times while  considering subset of size n */  result += (double)(sum * (nCr(N - 1 n - 1))) / n;  return result;  }  // Driver code to test above methods  public static void Main()  {  int[] arr = { 2 3 5 7 };  int N = arr.Length;  Console.WriteLine(resultOfAllSubsets(arr N));  } } // This code is contributed by Sam007 
JavaScript
<script>  // javascript program to get sum of  // average of all subsets    // Returns value of Binomial  // Coefficient C(n k)  function nCr(n k)  {  let C = new Array(n + 1);  for (let i = 0; i <= n; i++)   {  C[i] = new Array(k + 1);  for (let j = 0; j <= k; j++)   {  C[i][j] = 0;  }  }  let i j;    // Calculate value of Binomial  // Coefficient in bottom up manner  for (i = 0; i <= n; i++) {  for (j = 0; j <= Math.min(i k); j++) {  // Base Cases  if (j == 0 || j == i)  C[i][j] = 1;    // Calculate value using  // previously stored values  else  C[i][j] = C[i - 1][j - 1] + C[i - 1][j];  }  }  return C[n][k];  }    // method returns sum of average of all subsets  function resultOfAllSubsets(arr N)  {  // Initialize result  let result = 0.0;    // Find sum of elements  let sum = 0;  for (let i = 0; i < N; i++)  sum += arr[i];    // looping once for all subset of same size  for (let n = 1; n <= N; n++)    /* each element occurs nCr(N-1 n-1) times while  considering subset of size n */  result += (sum * (nCr(N - 1 n - 1))) / n;    return result;  }    let arr = [ 2 3 5 7 ];  let N = arr.length;  document.write(resultOfAllSubsets(arr N));   </script> 
PHP
 // PHP program to get sum  // of average of all subsets // Returns value of Binomial // Coefficient C(n k) function nCr($n $k) { $C[$n + 1][$k + 1] = 0; $i; $j; // Calculate value of Binomial // Coefficient in bottom up manner for ($i = 0; $i <= $n; $i++) { for ($j = 0; $j <= min($i $k); $j++) { // Base Cases if ($j == 0 || $j == $i) $C[$i][$j] = 1; // Calculate value using  // previously stored values else $C[$i][$j] = $C[$i - 1][$j - 1] + $C[$i - 1][$j]; } } return $C[$n][$k]; } // method returns sum of // average of all subsets function resultOfAllSubsets($arr $N) { // Initialize result $result = 0.0; // Find sum of elements $sum = 0; for ($i = 0; $i < $N; $i++) $sum += $arr[$i]; // looping once for all  // subset of same size for ($n = 1; $n <= $N; $n++) /* each element occurs nCr(N-1   n-1) times while considering   subset of size n */ $result += (($sum * (nCr($N - 1 $n - 1))) / $n); return $result; } // Driver Code $arr = array( 2 3 5 7 ); $N = sizeof($arr) / sizeof($arr[0]); echo resultOfAllSubsets($arr $N) ; // This code is contributed by nitin mittal.  ?> 
Python3
# Python3 program to get sum # of average of all subsets # Returns value of Binomial # Coefficient C(n k) def nCr(n k): C = [[0 for i in range(k + 1)] for j in range(n + 1)] # Calculate value of Binomial  # Coefficient in bottom up manner for i in range(n + 1): for j in range(min(i k) + 1): # Base Cases if (j == 0 or j == i): C[i][j] = 1 # Calculate value using  # previously stored values else: C[i][j] = C[i-1][j-1] + C[i-1][j] return C[n][k] # Method returns sum of # average of all subsets def resultOfAllSubsets(arr N): result = 0.0 # Initialize result # Find sum of elements sum = 0 for i in range(N): sum += arr[i] # looping once for all subset of same size for n in range(1 N + 1): # each element occurs nCr(N-1 n-1) times while # considering subset of size n */ result += (sum * (nCr(N - 1 n - 1))) / n return result # Driver code  arr = [2 3 5 7] N = len(arr) print(resultOfAllSubsets(arr N)) # This code is contributed by Anant Agarwal. 

תְפוּקָה
63.75

מורכבות זמן: עַל3)
מרחב עזר: עַל2)

גישה יעילה: אופטימיזציית שטח O(1)
כדי לייעל את מורכבות החלל של הגישה לעיל, נוכל להשתמש בגישה יעילה יותר המונעת את הצורך במטריצה ​​כולה ג[][] לאחסן מקדמים בינומיים. במקום זאת נוכל להשתמש בנוסחת שילוב כדי לחשב את המקדם הבינומי ישירות בעת הצורך.

שלבי יישום:

  • חזור על רכיבי המערך וחשב את סכום כל האלמנטים.
  • חזור על כל גודל משנה מ-1 עד N.
  • בתוך הלולאה לחשב את מְמוּצָע של סכום האלמנטים כפול המקדם הבינומי עבור גודל המשנה. הוסף את הממוצע המחושב לתוצאה.
  • החזר את התוצאה הסופית.

יישום:

C++
#include    using namespace std; // Method to calculate binomial coefficient C(n k) int binomialCoeff(int n int k) {  int res = 1;  // Since C(n k) = C(n n-k)  if (k > n - k)  k = n - k;  // Calculate value of [n * (n-1) * ... * (n-k+1)] / [k * (k-1) * ... * 1]  for (int i = 0; i < k; i++)  {  res *= (n - i);  res /= (i + 1);  }  return res; } // Method to calculate the sum of the average of all subsets double resultOfAllSubsets(int arr[] int N) {  double result = 0.0;  int sum = 0;  // Calculate the sum of elements  for (int i = 0; i < N; i++)  sum += arr[i];  // Loop for each subset size  for (int n = 1; n <= N; n++)  result += (double)(sum * binomialCoeff(N - 1 n - 1)) / n;  return result; } // Driver code to test the above methods int main() {  int arr[] = { 2 3 5 7 };  int N = sizeof(arr) / sizeof(int);  cout << resultOfAllSubsets(arr N) << endl;  return 0; } 
Java
import java.util.Arrays; public class Main {  // Method to calculate binomial coefficient C(n k)  static int binomialCoeff(int n int k) {  int res = 1;  // Since C(n k) = C(n n-k)  if (k > n - k)  k = n - k;  // Calculate value of [n * (n-1) * ... * (n-k+1)] / [k * (k-1) * ... * 1]  for (int i = 0; i < k; i++) {  res *= (n - i);  res /= (i + 1);  }  return res;  }  // Method to calculate the sum of the average of all subsets  static double resultOfAllSubsets(int arr[] int N) {  double result = 0.0;  int sum = 0;  // Calculate the sum of elements  for (int i = 0; i < N; i++)  sum += arr[i];  // Loop for each subset size  for (int n = 1; n <= N; n++)  result += (double) (sum * binomialCoeff(N - 1 n - 1)) / n;  return result;  }  // Driver code to test the above methods  public static void main(String[] args) {  int arr[] = {2 3 5 7};  int N = arr.length;  System.out.println(resultOfAllSubsets(arr N));  } } 
C#
using System; public class MainClass {  // Method to calculate binomial coefficient C(n k)  static int BinomialCoeff(int n int k)  {  int res = 1;  // Since C(n k) = C(n n-k)  if (k > n - k)  k = n - k;  // Calculate value of [n * (n-1) * ... * (n-k+1)] / [k * (k-1) * ... * 1]  for (int i = 0; i < k; i++)  {  res *= (n - i);  res /= (i + 1);  }  return res;  }  // Method to calculate the sum of the average of all subsets  static double ResultOfAllSubsets(int[] arr int N)  {  double result = 0.0;  int sumVal = 0;  // Calculate the sum of elements  for (int i = 0; i < N; i++)  sumVal += arr[i];  // Loop for each subset size  for (int n = 1; n <= N; n++)  result += (double)(sumVal * BinomialCoeff(N - 1 n - 1)) / n;  return result;  }  // Driver code to test the above methods  public static void Main()  {  int[] arr = { 2 3 5 7 };  int N = arr.Length;  Console.WriteLine(ResultOfAllSubsets(arr N));  } } 
JavaScript
// Function to calculate binomial coefficient C(n k) function binomialCoeff(n k) {  let res = 1;  // Since C(n k) = C(n n-k)  if (k > n - k)  k = n - k;  // Calculate value of [n * (n-1) * ... * (n-k+1)] / [k * (k-1) * ... * 1]  for (let i = 0; i < k; i++) {  res *= (n - i);  res /= (i + 1);  }  return res; } // Function to calculate the sum of the average of all subsets function resultOfAllSubsets(arr) {  let result = 0.0;  let sum = arr.reduce((acc val) => acc + val 0);  // Loop for each subset size  for (let n = 1; n <= arr.length; n++) {  result += (sum * binomialCoeff(arr.length - 1 n - 1)) / n;  }  return result; } const arr = [2 3 5 7]; console.log(resultOfAllSubsets(arr)); 
Python3
# Method to calculate binomial coefficient C(n k) def binomialCoeff(n k): res = 1 # Since C(n k) = C(n n-k) if k > n - k: k = n - k # Calculate value of [n * (n-1) * ... * (n-k+1)] / [k * (k-1) * ... * 1] for i in range(k): res *= (n - i) res //= (i + 1) return res # Method to calculate the sum of the average of all subsets def resultOfAllSubsets(arr N): result = 0.0 sum_val = 0 # Calculate the sum of elements for i in range(N): sum_val += arr[i] # Loop for each subset size for n in range(1 N + 1): result += (sum_val * binomialCoeff(N - 1 n - 1)) / n return result # Driver code to test the above methods arr = [2 3 5 7] N = len(arr) print(resultOfAllSubsets(arr N)) 


תְפוּקָה

63.75

מורכבות זמן: O(n^2)
מרחב עזר: O(1)



 

צור חידון