On Saturday, 11 July 2015 at 02:56:55 UTC, Timon Gehr wrote:
...
The algorithm runs in O(n*log*(n)). It's not n log(n).
...
I understand now. I had never heard of an iterated logarithm
before. I took the asterisk to mean some constant, like a wild
card if you will. Sorry for the confusion.
I wonder if the true O(n) algorithm is still worth pursuing.
Although log*(n) may only be a factor of 2 or 3, the O(n)
algorithm may have a small constant factor which makes it 2-3x
faster.
That paper appears to be available here:
https://github.com/lispc/lispc.github.com/raw/master/assets/files/situ.pdf
No idea what the constant is though, I have not read the
paper (yet).
I don't know if there is anything relevant but that paper
focuses on a
different problem involving sorting.
No, it focuses on a few closely related problems, and the
O(n*log*(n))-algorithms solves a problem that is a
straightforward generalization of the problem you are looking
at. Stable three way partition is stable sorting where there
are only three "distinct" values (smaller, equal, greater). The
paper you provided builds on top of this algorithm. It is the
main reference and part (ii) of the "Algorithm B" part of the
O(n)/O(1) algorithm does not occur in the paper you provided,
but only in that other paper, so yes, it is relevant. :-)
I get that much now, but this paper is still way above my head.
There's some notation in the sample code that I don't understand.
In this statement:
e <- #{ j : L[j] = x, 1 <= j <= n }
I'm not sure what the pound # signifies or what exactly is being
assigned to e. I'm assuming it performs some operation on the
set, like "max", but I'm not sure what.