📌  相关文章
📜  从给定数组的所有子集中找到可能的最大差异之和。

📅  最后修改于: 2022-05-13 01:57:47.405000             🧑  作者: Mango

从给定数组的所有子集中找到可能的最大差异之和。

给定一个包含 n 个非负整数(允许重复元素)的数组 arr[],从给定数组的所有子集中找出可能的最大差异之和。
假设 max(s) 表示任何子集“s”中的最大值,而 min(s) 表示集合“s”中的最小值。我们需要找到所有可能子集的 max(s)-min(s) 之和。

例子:

Input : arr[] = {1, 2, 3}
Output : result = 6

Explanation : 
All possible subset and for each subset s,
max(s)-min(s) are as :
SUBSET    |  max(s) | min(s) | max(s)-min(s)
{1, 2}    |  2      |  1     |   1
{1, 3}    |  3      |  1     |   2
{2, 3}    |  3      |  2     |   1
{1, 2, 3} |  3      |  1     |   2
Total Difference sum = 6
Note : max(s) - min(s) for all subset with 
single element must be zero.

Input : arr[] = {1, 2, 2}
Output : result = 3

Explanation : 
All possible subset and for each subset s,
max(s)-min(s) are as :
  SUBSET  |  max(s) | min(s)| max(s)-min(s)
  {1, 2}  |  2      |  1    |   1
  {1, 2}  |  2      |  1    |   1
  {2, 2}  |  2      |  2    |   0
{1, 2, 2} |  2      |  1    |   1
Total Difference sum = 3

基本方法:分别计算每个子集的最大元素之和,以及每个子集的最小元素之和,然后从最大值中减去最小和,得到答案。每个子集的最大/最小元素之和可以通过迭代每个子集的元素来轻松计算。但是由于我们必须遍历所有子集,这种方法的时间复杂度是指数 O(n2^n)。
有效的方法:
由于我们必须计算每个子集的最大元素之和,这里分别计算每个子集的最小元素之和是执行此计算的有效方法。
所有子集的最小元素之和:
假设 arr[] 的非降序元素是 {a1,a2,...,an}。现在,我们可以将 arr[] 的子集划分为以下类别:

  • 包含元素 a1 的子集:这些子集可以通过取 {a2,a3,...,an} 的任何子集然后将 a1 添加到其中来获得。这样的子集的数量将是 2 n-1 ,并且它们都具有 a1 作为它们的最小元素。
  • 不包含元素 a1 但包含 a2 的子集:这些子集可以通过取 {a3, a4,…,an} 的任何子集,然后将 a2 添加到其中来获得。这样的子集的数量将是 2 n-2 ,并且它们都具有 a2 作为它们的最小元素。
  • ……
  • 不包含元素 a1, a2,…, ai-1 但包含 ai 的子集:这些子集可以通过取 {ai+1,ai+2,…, an} 的任何子集,然后将 ai 添加到其中来获得。这样的子集的数量将是 2 ni ,并且它们都以 ai 作为它们的最小元素。

可以看出,上述迭代是完整的,即每个子集只考虑一次。因此,所有子集的最小元素之和将是:
min_sum = a1*2 n-1 + a2*2 n-2 + … + an*2 0
借助霍纳方法,可以在线性时间内轻松计算出这个总和……
类似地,我们可以计算 arr[] 的所有子集的最大元素之和。唯一的区别是我们需要以非递增的顺序迭代 arr[] 的元素。
注意:我们可能有一个很大的答案,所以我们必须用 mod 10^9 +7 来计算答案。

C++
// CPP for finding max min difference
// from all subset of given set
#include 
using namespace std;
  
const long long int MOD = 1000000007;
  
// function for sum of max min difference 
int maxMin (int arr[], int n) 
{
    // sort all numbers
    sort(arr, arr + n);
      
    // iterate over array and with help of 
    // horner's rule calc max_sum and min_sum
    long long int min_sum = 0, max_sum = 0;
    for (int i = 0; i < n; i++)
    {
        max_sum = 2 * max_sum + arr[n-1-i];
        max_sum %= MOD;
        min_sum = 2 * min_sum + arr[i];
        min_sum %= MOD;
    }
  
    return (max_sum - min_sum + MOD) % MOD;
}
  
// Driver Code
int main()
{
    int arr[] = {1, 2, 3, 4};
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << maxMin(arr,n);
    return 0;
}


Java
// JAVA Code for Find the sum of maximum 
// difference possible from all subset 
// of a given array.
import java.util.*;
  
class GFG {
      
    public static int MOD = 1000000007;
      
    // function for sum of max min difference 
    public static long maxMin (int arr[], int n) 
    {
        // sort all numbers
        Arrays.sort(arr);
          
        // iterate over array and with help of 
        // horner's rule calc max_sum and min_sum
        long min_sum = 0, max_sum = 0;
        for (int i = 0; i < n; i++)
        {
            max_sum = 2 * max_sum + arr[n - 1 - i];
            max_sum %= MOD;
            min_sum = 2 * min_sum + arr[i];
            min_sum %= MOD;
        }
      
        return (max_sum - min_sum + MOD)%MOD;
    }
      
    // Driver Code
    public static void main(String[] args) 
    {
            int arr[] = {1, 2, 3, 4};
            int n = arr.length;
            System.out.println(maxMin(arr, n));
    }
}
  
// This code is contributed by Arnav Kr. Mandal.


Python3
# python for finding max min difference
#from all subset of given set
  
MOD = 1000000007;
  
# function for sum of max min difference 
def maxMin (arr,n):
      
    # sort all numbers
    arr.sort()
      
    # iterate over array and with help of 
    # horner's rule calc max_sum and min_sum
    min_sum = 0
    max_sum = 0
    for i in range(0,n):
          
        max_sum = 2 * max_sum + arr[n-1-i];
        max_sum %= MOD;
        min_sum = 2 * min_sum + arr[i];
        min_sum %= MOD;
      
    return (max_sum - min_sum + MOD) % MOD;
  
# Driver Code
arr = [1, 2, 3, 4]
n = len(arr)
print( maxMin(arr, n))
  
# This code is contributed by Sam007.


C#
// C# Code to Find the sum of maximum 
// difference possible from all subset 
// of a given array.
using System;
  
class GFG {
      
    public static int MOD = 1000000007;
      
    // function for sum of max min difference 
    public static long maxMin (int []arr, int n) 
    {
        // sort all numbers
        Array.Sort(arr);
          
        // iterate over array and with help of 
        // horner's rule calc max_sum and min_sum
        long min_sum = 0, max_sum = 0;
        for (int i = 0; i < n; i++)
        {
            max_sum = 2 * max_sum + arr[n - 1 - i];
            max_sum %= MOD;
            min_sum = 2 * min_sum + arr[i];
            min_sum %= MOD;
        }
      
        return (max_sum - min_sum + MOD) % MOD;
    }
      
    // Driver Code
    public static void Main() 
    {
            int []arr = {1, 2, 3, 4};
            int n = arr.Length;
            Console.Write(maxMin(arr, n));    
    }
}
  
// This code is contributed by nitin mittal


PHP


Javascript


输出:

23