Efficiently get sorted sums of a sorted list *

Question

You have an ascending list of numbers, what is the most efficient algorithm you can think of to get the ascending list of sums of every two numbers in that list. Duplicates in the resulting list are irrelevant, you can remove them or avoid them if you like.

To be clear, I'm interested in the algorithm. Feel free to post code in any language and paradigm that you like.

Answer

If you write out the sums like this:

1 4  5  6  8  9
---------------
2 5  6  7  9 10
  8  9 10 12 13
    10 11 13 14
       12 14 15
          16 17
             18

You'll notice that since M[i,j] <= M[i,j+1] and M[i,j] <= M[i+1,j], then you only need to examine the top left "corners" and choose the lowest one.

e.g.

  • only 1 top left corner, pick 2
  • only 1, pick 5
  • 6 or 8, pick 6
  • 7 or 8, pick 7
  • 9 or 8, pick 8
  • 9 or 9, pick both :)
  • 10 or 10 or 10, pick all
  • 12 or 11, pick 11
  • 12 or 12, pick both
  • 13 or 13, pick both
  • 14 or 14, pick both
  • 15 or 16, pick 15
  • only 1, pick 16
  • only 1, pick 17
  • only 1, pick 18

Of course, when you have lots of top left corners then this solution devolves.

I'm pretty sure this problem is Ω(n²), because you have to calculate the sums for each M[i,j] -- unless someone has a better algorithm for the summation :)

< br > via < a class="StackLink" href=" http://stackoverflow.com/questions/826/" >Efficiently get sorted sums of a sorted list< /a>
Share on Google Plus

About Cinema Guy

This is a short description in the author block about the author. You edit it by entering text in the "Biographical Info" field in the user admin panel.
    Blogger Comment
    Facebook Comment

0 comments:

Post a Comment