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>
0 comments:
Post a Comment