random cover of a range

Jason House jason.james.house at gmail.com
Thu Feb 12 12:23:31 PST 2009


Andrei Alexandrescu Wrote:

> Ok, following Leonardo's and Denis' ideas on covering an immutable array 
> in random order, I thought about it and came up with one algorithm, in 
> addition to the obvious one that stores one integer per element (see 
> Denis' code).
> 
> Here's the algorithm. It stores one bit per element and takes O(n log n) 
> time to cover a range of length n.
> 
> 1. Given a random-access range r of length n, create a bitmap with one 
> bit per element in r. The range is initially all zeros.
> 
> 2. At each step, select a random index in the _original_ array, i.e. a 
> random number in 0 .. r.length. Then walk upwards (with wrapping at the 
> end of the range) until you find a bit = 0 in the bitmap. Mark that bit 
> = 1 and return the found element.
> 
> 3. The cover ends when all bits in the bitmap are 1.


So far so good.


> I did a ballpark complexity estimate by approximating the average number 
> of steps in (2) with n / (n - k), where k is the number of 1s in the 
> bitmap. IIRC the average number of steps to hit a 1 in a binomial 
> distribution with p = (n - k) / n is 1/p. Right? In that case, the total 
> number of steps taken by the algo above is:
> 
> N = n / 1 + n / 2 + ... + n / (n - 1) = n * (1 + 1/2 + 1/3 + ... + 1/(n 
> - 1)) < O (n log n)
> 
> Makes sense?


No.  Your wording sounds like you're doing stuff that's way off, but the resulting math is correct.  My calculation would be based on the average length of a sequence of 1's (k/(n-k)).  That means the work is 1+k/(n-k) = n/(n-k).

Given that O(n*log(n)) is the theoretical best you can do, having a result that is < O(n*log(n)) is highly suspect.  The sum 1/1 + 1/2 + 1/3 + 1/4 + 1/5 + ... is in fact O(log(n)).  



> If the range does not offer random access, I think this algorithm will 
> have quadratic complexity because it needs to make a number of steps 
> proportional to n at each iteration.

That's when copying may be the best implementation



More information about the Digitalmars-d mailing list