MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Coding an inverse permutation

  • To: mathgroup at smc.vnet.net
  • Subject: [mg79113] Re: [mg79078] Coding an inverse permutation
  • From: "Carl K. Woll" <carlw at wolfram.com>
  • Date: Thu, 19 Jul 2007 03:24:48 -0400 (EDT)
  • References: <200707180652.CAA04270@smc.vnet.net> <469E1148.1040707@wolfram.com> <a851af150707180710m37b35d15r63afae932f6a0920@mail.gmail.com>

Diana Mecum wrote:
> Thank you Carl. Would the algorithm give the same results as 
> Ordering[aa]? Diana

Yes, but invperm is faster. For example, here is a large permutation:

perm = Ordering[RandomReal[1,10^6]];

Here I compare invperm and Ordering timings:

In[100]:= r1 = invperm[perm]; // Timing
r2 = Ordering[perm]; // Timing
r1 === r2

Out[100]= {0.109,Null}

Out[101]= {0.875,Null}

Out[102]= True

So, invperm is about 8 times faster. This is because Ordering needs to 
sort, while invperm does no sorting. Hence, invperm uses an O(n) 
algorthm, while Ordering uses an O(n log n) algorithm.

Carl Woll
Wolfram Research

> 
> On 7/18/07, *Carl K. Woll* <carlw at wolfram.com 
> <mailto:carlw at wolfram.com>> wrote:
> 
>     Diana wrote:
>      > Folks,
>      >
>      > I have the following list:
>      >
>      > aa={1, 2, 5, 3, 4, 8, 9, 7, 11, 6, 13, 17, 10, 16, 19, 15, 14,
>     20, 21,
>      > 23, 25, 12, 29, 31, 18, 22,
>      >  37, 27, 26, 28, 33, 35, 32, 24, 41, 43, 30, 34, 47, 39, 38, 40, 45,
>      > 49, 44, 36, 53, 55, 46, 52,
>      >  59, 51, 50, 56, 57, 61, 62, 42, 67, 71, 48, 58, 65, 63, 64, 68, 69,
>      > 73, 74, 54, 77, 79, 60, 76,
>      >  83, 75, 80, 70, 81, 89, 85, 66, 95, 97, 72, 82, 91, 87}
>      >
>      > I want to figure out a clean way to code its inverse permutation.
>      >
>      > The inverse permutation list would start as follows:
>      >
>      > bb={1,2,4,5,3,10,8,6, ...}
>      >
>      > Since "3" is in position 4 of aa, position 3 of bb will be "4".
>      > Since "5" is in position 3 of aa, position 5 of bb will be "3".
>      >
>      > Can someone give me a suggestion as to how to code this?
>      >
>      > Thanks, Diana
>      >
> 
>     I don't think aa qualifies as a permutation, so finding the inverse
>     permutation will be difficult. This is because the list aa only has 88
>     elements, but it contains elements greater than 88. For example, aa
>     contains 91 in position 87, so presumably 87->91. However, as there are
>     only 88 elements in aa, we don't know where 91 goes to.
> 
>     I think a permutation list of length n should contain the numbers 1
>     to n
>     in some permuted order.
> 
>     At any rate, if your list is a permutation list as I defined above, then
>     the following is one way to find the inverse permutation:
> 
>     invperm[p_] := Module[{t=p}, t[[p]]=Range[Length[p]]; t]
> 
>     Carl Woll
>     Wolfram Research
> 
> 
> 
> 
> -- 
> "God made the integers, all else is the work of man."
> L. Kronecker, Jahresber. DMV 2, S. 19.



  • Prev by Date: Re: Re: Re: integration of piecewise convex bivariate function with 6 parameters
  • Next by Date: Re: Controlling the Appearance of Locators in Manipulate
  • Previous by thread: Re: Coding an inverse permutation
  • Next by thread: Re: Re: Coding an inverse permutation