Hi all

Here is a rather naive implementation of the SEPA algorithm for generating lexical permutations:


lexperm3 <- function(x, n=length(x)) {
 perms <- list()
 k <- 1
 perms[[k]] <- x
 k <- k + 1

 for (y in 1:(factorial(n)-1)) {
  i <- n-1
  while (x[i] > x[i+1] && i > 0) {
   i <- i - 1
  }

  # i is largest index st x[i] > x[i+1]
      j <- n

  # find min{ x[j], st n>=j>=i+1 and x[j]>x[i] }
  while (x[j] <= x[i] && j > i) {
   j <- j - 1
  }

  # swap x[i] and x[j]
  tmp <- x[i];x[i] <- x[j]; x[j] <- tmp

  # now sort everything from x[i+1]..x[n]
  # by reversing the elements within
  p <- i + 1
  q <- n
  while (p < q) {
   tmp <- x[p]; x[p] <- x[q]; x[q] <- tmp
   p <- p + 1
   q <- q - 1
  }

  perms[[k]] <- x
  k <- k + 1
 }

 perms
}


This, as you can imagine, is severely slow. I would like to speed up this function if possible, which I guess would involve vectorizing the inner loop..does anyone have any ideas about how to improve this code's runtime?

One small potential optimization I tried was to shorten the "sort by reverse ordering" near the end of the inner loop : I tried replacing it with rev() and sort(decreasing=TRUE) over a partial subset of the x vector: however rev() was much slower, and I dont think sort() supports lexicographic ordering, so that didnt work.

Thanks
rory

Rory Winston
RBS Global Banking & Markets
280 Bishopsgate, London, EC2M 4RB
Office: +44 20 7085 4476



***********************************************************************************
The Royal Bank of Scotland plc. Registered in Scotland No 90312. Registered Office: 36 St Andrew Square, Edinburgh EH2 2YB. 
Authorised and regulated by the Financial Services Authority 

This e-mail message is confidential and for use by the=2...{{dropped:25}}

