On 9/13/10 1:34 PM, Phil Bewig wrote:
Fixed.  See the comment at
http://programmingpraxis.com/2009/12/11/selection/.

Prabhakar:  You are correct that shuffling once at the beginning is
sufficient.  But I am interested in your critique of shuffling.  Do you
know a better way to shuffle a list than to convert it to a vector,
shuffle in place, then convert back to a list?  You might look at this
discussion:
http://groups.google.com/group/comp.lang.scheme/browse_thread/thread/24270db01f684439/e54c99564028efec.
  The list-vector-list method is O(n); any functional method appears to
be O(n log n).

I don't know of a purely-functional way to shuffle a list of length n (where every permutation is equally likely) in o(n log n) time ("little-o"). It's an interesting problem.

But the reason that the randomized selection algorithm takes O(n) time with high probability is that it discards chunks of the original list, avoiding the overhead of going over them again and again. The depth of the recursion is still Omega(log n) with high probability, but the size of the recursion is getting small fast enough that that doesn't matter.

By choosing a random pivot each time, instead of a deterministic pivot after an expensive shuffling operation, you reap the same benefit, you get the O(n) running time (w.h.p), the code is clearer, and the analysis is easier (because each pivot choice is independent of earlier ones). --PR
_________________________________________________
 For list-related administrative tasks:
 http://lists.racket-lang.org/listinfo/users

Reply via email to