> Robust? Yes. It would take virtually forever to run out of space through repeated list reordering.
I think the author missed a pathological case with using the Stern-Brocot tree.
The goal is to sort each item with a score. Then to insert something between two items, you calculate a new score that is "between" their existing scores.
- Option 1) Take the average of the two score a/b and c/d:
(ad+bc)/(2bd)
- Option 2) Take the mediant(
https://en.wikipedia.org/wiki/Mediant_(mathematics) ):
(a+c)/(b+d)
We don't want to use the first option, the
average because almost by definition you would require at least another bit of precision in the denominator for each insert due the multiplication by 2. This limits you to a meager ~64 repeated inserts before overflowing the denominator.
So the mediant is better because the precision requirements is limited by the number of times you can add instead of multiply. This might seem to grow a lot slower at first. And the author even showed that if you're repeatedly averaging 0/1 with the new score, you would get the pattern 1/2, 1/3, 1/4, 1/5, 1/6, .... Which means you can handle up 2^precision number of inserts which is much better than before.
But this only applies to inserting to front (medianting with 0/1) or back (medianting with 1/1) because this will only add a 0 or 1 each time.
If you go down a zigzag path down the middle of the tree instead, you can get the two numbers added to be much closer in magnitude and explode. For example: 1/1, 1/2, 2/3, 3/5, 5/8, 8/13, 13/21, 21/34, ... (it's fibonacci!).
So essentially you get the same thing as the averaging case where the precision required roughly doubles(1.6180339887...) at each step and it will overflow quickly.
This isn't a purely theoretical edge case either. The example from before can be realized by repeatedly inserting between the last two items inserted, which arises naturally if you're repeatedly adding to the middle of a list.