Will M. Farr wrote:

Looks like Phil beat me to it, but here's some code that finds the
n-th element of a list in O(N) time.  The algorithm is similar to
quicksort, but you don't sort both the sub-lists: partition the list
into elements less than and greater or equal to a pivot.  By counting
the number of elements less than the pivot, you know whether the one
you're looking for will be found in that set, or in the greater or
equal set.  Repeat the search in the appropriate set.  The partition
takes O(N) time.  On average, it cuts the number of elements searched
in half each time, so we have

total time = N + N/2 + N/4 + ... = 2*N as N --> infty

Not quite. Consider the case of the median. If the pivot is the smallest element, the recursion is on N-1 elements. If the pivot is the second smallest, on N-2; and so on. If the pivot is the median, you can stop (not all provided code does this, but it doesn't matter much for the analysis). But the situation is symmetric on the other side: if the pivot is the largest element, the recursion is on N-1 elements, and so on down. So the expected number of elements the recursion is performed on is about 3N/4.

And then what? Are we justified in saying T(N) = T(3N/4) + O(N)? Really, we have T(N) = T(X) + O(N), where X is a random variable uniformly distributed over [0..N-1]. With a suitable induction hypothesis, we can dig ourselves out of this, but it's not simple, unfortunately. --PR
_________________________________________________
 For list-related administrative tasks:
 http://lists.racket-lang.org/listinfo/users

Reply via email to