Osajoukon erojen summa

Osajoukon erojen summa
Kokeile sitä GfG Practicessa #practiceLinkDiv { näyttö: ei mitään !tärkeää; }

Kun annettu joukko S koostuu n numerosta, etsi kunkin osajoukon viimeisen ja ensimmäisen alkion välisen erotuksen summa. Löydämme jokaisen osajoukon ensimmäisen ja viimeisen elementin pitämällä ne samassa järjestyksessä kuin ne esiintyvät syötejoukossa S. eli sumSetDiff(S) = ? (viimeinen(t) - ensimmäinen(t)), jossa summa ylittää kaikki S:n osajoukot.

Huomautus:

Osajoukon elementtien tulee olla samassa järjestyksessä kuin joukossa S. Esimerkkejä:

 S = {5 2 9 6} n = 4   
Subsets are:
{5} last(s)-first(s) = 0.
{2} last(s)-first(s) = 0.
{9} last(s)-first(s) = 0.
{6} last(s)-first(s) = 0.
{52} last(s)-first(s) = -3.
{59} last(s)-first(s) = 4.
{56} last(s)-first(s) = 1.
{29} last(s)-first(s) = 7.
{26} last(s)-first(s) = 4.
{96} last(s)-first(s) = -3.
{529} last(s)-first(s) = 4.
{526} last(s)-first(s) = 1.
{596} last(s)-first(s) = 1.
{296} last(s)-first(s) = 4.
{5296} last(s)-first(s) = 1.
Output = -3+4+1+7+4-3+4+1+1+4+1
= 21.

Suositus: ratkaise se osoitteessa HARJOITELLA ' ensin ennen kuin siirryt ratkaisuun.

Yksinkertainen ratkaisu

Tässä tehtävässä on löytää ero viimeisen ja ensimmäisen alkion välillä jokaiselle joukon S osajoukolle s ja tulostaa näiden erojen summa. Tämän lähestymistavan aikamonimutkaisuus on O(2

n

).

Tehokas ratkaisu

ongelman ratkaisemiseksi lineaarisessa ajassa. Meille annetaan joukko S, joka koostuu n numerosta ja meidän on laskettava kunkin S:n osajoukon viimeisen ja ensimmäisen alkion välisen erotuksen summa eli sumSetDiff(S) = ? (viimeinen(t) - ensimmäinen(t)), jossa summa ylittää kaikki S:n osajoukot s. Vastaavasti sumSetDiff(S) = ? (viime(t)) - ? (ensimmäinen(t)) Toisin sanoen voimme laskea kunkin osajoukon viimeisen alkion summan ja kunkin osajoukon ensimmäisen alkion summan erikseen ja laskea sitten niiden eron. Sanotaan, että S:n alkiot ovat {a1 a2 a3... an}. Huomaa seuraava havainto:

  1. Osajoukot, jotka sisältävät elementin a1 ensimmäinen alkio voidaan saada ottamalla mikä tahansa osajoukko joukosta {a2 a3... an} ja sisällyttämällä siihen sitten a1. Tällaisten osajoukkojen määrä on 2 n-1 .
  2. Osajoukot, jotka sisältävät elementin a2 ensimmäisenä alkiona, voidaan saada ottamalla mikä tahansa osajoukosta {a3 a4... an} ja sisällyttämällä siihen sitten a2. Tällaisten osajoukkojen määrä on 2 n-2 .
  3. Osajoukot, jotka sisältävät elementin ai ensimmäisenä alkiona, voidaan saada ottamalla mikä tahansa {ai a(i+1)... an} osajoukko ja sisällyttämällä siihen sitten ai. Tällaisten osajoukkojen määrä on 2 n-i .

  4. Siksi kaikkien osajoukkojen ensimmäisen alkion summa on: SumF = a1.2
  5. n-1
  6. + a2.2
  7. n-2
  8. +...+ an.1 Samalla tavalla voidaan laskea S:n kaikkien osajoukkojen viimeisen alkion summa (Otetaan joka vaiheessa ai viimeiseksi alkioksi ensimmäisen alkion sijaan ja saadaan sitten kaikki osajoukot). SumL = a1,1 + a2,2 +...+ an.2
  9. n-1
  10. Lopulta vastaus ongelmaamme on
  11. SumL - SumF
  12. .
  13. Toteutus:
  14. C++
       // A C++ program to find sum of difference between   // last and first element of each subset   #include       // Returns the sum of first elements of all subsets   int     SumF  (  int     S  []     int     n  )   {      int     sum     =     0  ;      // Compute the SumF as given in the above explanation      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      sum     =     sum     +     (  S  [  i  ]     *     pow  (  2       n  -  i  -1  ));      return     sum  ;   }   // Returns the sum of last elements of all subsets   int     SumL  (  int     S  []     int     n  )   {      int     sum     =     0  ;      // Compute the SumL as given in the above explanation      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      sum     =     sum     +     (  S  [  i  ]     *     pow  (  2       i  ));      return     sum  ;   }   // Returns the difference between sum of last elements of   // each subset and the sum of first elements of each subset   int     sumSetDiff  (  int     S  []     int     n  )   {      return     SumL  (  S       n  )     -     SumF  (  S       n  );   }   // Driver program to test above function   int     main  ()   {      int     n     =     4  ;      int     S  []     =     {  5       2       9       6  };      printf  (  '%d  n  '       sumSetDiff  (  S       n  ));      return     0  ;   }   
    Java
       // A Java program to find sum of difference    // between last and first element of each    // subset   class   GFG     {          // Returns the sum of first elements       // of all subsets      static     int     SumF  (  int     S  []       int     n  )      {      int     sum     =     0  ;      // Compute the SumF as given in       // the above explanation      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      sum     =     sum     +     (  int  )(  S  [  i  ]     *         Math  .  pow  (  2       n     -     i     -     1  ));      return     sum  ;      }      // Returns the sum of last elements       // of all subsets      static     int     SumL  (  int     S  []       int     n  )      {      int     sum     =     0  ;      // Compute the SumL as given in       // the above explanation      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      sum     =     sum     +     (  int  )(  S  [  i  ]     *      Math  .  pow  (  2       i  ));          return     sum  ;      }      // Returns the difference between sum       // of last elements of each subset and       // the sum of first elements of each       // subset      static     int     sumSetDiff  (  int     S  []       int     n  )      {      return     SumL  (  S       n  )     -     SumF  (  S       n  );      }      // Driver program      public     static     void     main  (  String     arg  []  )      {      int     n     =     4  ;      int     S  []     =     {     5       2       9       6     };          System  .  out  .  println  (  sumSetDiff  (  S       n  ));      }   }   // This code is contributed by Anant Agarwal.   
    Python3
       # Python3 program to find sum of   # difference between last and    # first element of each subset   # Returns the sum of first   # elements of all subsets   def   SumF  (  S     n  ):   sum   =   0   # Compute the SumF as given   # in the above explanation   for   i   in   range  (  n  ):   sum   =   sum   +   (  S  [  i  ]   *   pow  (  2     n   -   i   -   1  ))   return   sum   # Returns the sum of last   # elements of all subsets   def   SumL  (  S     n  ):   sum   =   0   # Compute the SumL as given   # in the above explanation   for   i   in   range  (  n  ):   sum   =   sum   +   (  S  [  i  ]   *   pow  (  2     i  ))   return   sum   # Returns the difference between sum   # of last elements of each subset and   # the sum of first elements of each subset   def   sumSetDiff  (  S     n  ):   return   SumL  (  S     n  )   -   SumF  (  S     n  )   # Driver program   n   =   4   S   =   [  5     2     9     6  ]   print  (  sumSetDiff  (  S     n  ))   # This code is contributed by Anant Agarwal.   
    C#
          // A C# program to find sum of difference    // between last and first element of each    // subset   using     System  ;   class     GFG     {          // Returns the sum of first elements       // of all subsets      static     int     SumF  (  int     []  S       int     n  )      {      int     sum     =     0  ;          // Compute the SumF as given in       // the above explanation      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      sum     =     sum     +     (  int  )(  S  [  i  ]     *         Math  .  Pow  (  2       n     -     i     -     1  ));      return     sum  ;      }          // Returns the sum of last elements       // of all subsets      static     int     SumL  (  int     []  S       int     n  )      {      int     sum     =     0  ;          // Compute the SumL as given in       // the above explanation      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      sum     =     sum     +     (  int  )(  S  [  i  ]     *      Math  .  Pow  (  2       i  ));          return     sum  ;      }          // Returns the difference between sum       // of last elements of each subset and       // the sum of first elements of each       // subset      static     int     sumSetDiff  (  int     []  S       int     n  )      {      return     SumL  (  S       n  )     -     SumF  (  S       n  );      }          // Driver program      public     static     void     Main  ()      {      int     n     =     4  ;      int     []  S     =     {     5       2       9       6     };          Console  .  Write  (  sumSetDiff  (  S       n  ));      }   }       // This code is contributed by nitin mittal.   
    JavaScript
       // Returns the sum of first elements of all subsets   function     sumF  (  S       n  )     {      let     sum     =     0  ;      // Compute the SumF as given in the above explanation      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      sum     +=     S  [  i  ]     *     Math  .  pow  (  2       n     -     i     -     1  );      }      return     sum  ;   }   // Returns the sum of last elements of all subsets   function     sumL  (  S       n  )     {      let     sum     =     0  ;      // Compute the SumL as given in the above explanation      for     (  let     i     =     0  ;     i      <     n  ;     i  ++  )     {      sum     +=     S  [  i  ]     *     Math  .  pow  (  2       i  );      }      return     sum  ;   }   // Returns the difference between sum of last elements of each subset and the sum of first elements of each subset   function     sumSetDiff  (  S       n  )     {      return     sumL  (  S       n  )     -     sumF  (  S       n  );   }   // Driver program to test the above functions   function     main  ()     {      const     n     =     4  ;      const     S     =     [  5       2       9       6  ];      console  .  log  (  sumSetDiff  (  S       n  ));   }   main  ();   
    PHP
          // A PHP program to find sum    // of difference between last    // and first element of each subset   // Returns the sum of first    // elements of all subsets   function   SumF  (   $S     $n  )   {   $sum   =   0  ;   // Compute the SumF as given    // in the above explanation   for   (  $i   =   0  ;   $i    <   $n  ;   $i  ++  )   $sum   =   $sum   +   (  $S  [  $i  ]   *   pow  (  2     $n   -   $i   -   1  ));   return   $sum  ;   }   // Returns the sum of last   // elements of all subsets   function   SumL  (   $S     $n  )   {   $sum   =   0  ;   // Compute the SumL as given   // in the above explanation   for  (  $i   =   0  ;   $i    <   $n  ;   $i  ++  )   $sum   =   $sum   +   (  $S  [  $i  ]   *   pow  (  2     $i  ));   return   $sum  ;   }   // Returns the difference between   // sum of last elements of   // each subset and the sum of   // first elements of each subset   function   sumSetDiff  (   $S     $n  )   {   return   SumL  (  $S     $n  )   -   SumF  (  $S     $n  );   }   // Driver Code   $n   =   4  ;   $S   =   array  (  5     2     9     6  );   echo   sumSetDiff  (  $S     $n  );   // This code is contributed by anuj_67.   ?>   
  15. Lähtö:
  16.  21   
  17. Aika monimutkaisuus: O(n) Tämän artikkelin on kirjoittanut
  18. Akash Aggarwal
  19. . Jos pidät GeeksforGeeksistä ja haluat osallistua, voit myös kirjoittaa artikkelin käyttämällä
  20. myötävaikuttaa.geeksforgeeks.org
  21. tai lähetä artikkelisi osoitteeseen közreműkö[email protected]. Katso artikkelisi ilmestyvän GeeksforGeeks-pääsivulle ja auta muita nörtejä.
Luo tietokilpailu