Algorithm: Inverse in place

来源:互联网 发布:java 内部类构造函数 编辑:程序博客网 时间:2024/05/16 07:20

Algorithm I

Algorithm I (Inverse in place). Replace X[1]X[2]… X[n], a permutation of
{1,2,…,n}, by its inverse. This algorithm is due to Bing-Chao Huang [Inf.
Proc. Letters 12 (1981), 237-238].
I1. [Initialize.] Set m <– n, j <– -1.
I2. [Next element.] Set i <– X[m]. If i < 0, go to step I5 (the element has
already been processed).
I3. [Invert one.] (At this point j < 0 and i = X[m]. If m is not the largest ele-
ment of its cycle, the original permutation had X[-j] = m.) Set X[m] <– j,
j <– -m, m <– i, i <– X[m].
I4. [End of cycle?] If i > 0, go back to I3 (the cycle has not ended); otherwise
set i <– j. (In the latter case, the original permutation had X[-j] = m, and
m is largest in its cycle.)
I5. [Store final value.] Set X[m] <– -i. (Originally X[-i] was equal to m.)
I6. [Loop on m.] Decrease m by 1. If m > 0, go back to I2; otherwise the
algorithm terminates. |


Data table

这里写图片描述


Java program

/** * Created with IntelliJ IDEA. * User: 1O1O * Date: 12/18/13 * Time: 6:52 PM * :)~ * Inverse in place:ALGORITHMS */public class Main {    public static void main(String[] args) {        int[] X = new int[7];        int m;        int n=6;        int i;        int j;        X[1]=6;        X[2]=2;        X[3]=1;        X[4]=5;        X[5]=4;        X[6]=3;        /*Print the initial X[i] (1<=i<=n)*/        System.out.println("The initial X[i] (1<=i<=n) is:");        for(int k=1; k<=n; k++){            System.out.println("X["+k+"]="+X[k]);        }        System.out.println();        /*Print the initial permutation*/        System.out.println("The initial permutation is:");        System.out.print("| ");        for(int k=1; k<=n; k++){            System.out.print((char)(k+96));            System.out.print(' ');        }        System.out.print("|");        System.out.println();        System.out.print("| ");        for(int k=1; k<=n; k++){            System.out.print((char)(X[k]+96));            System.out.print(' ');        }        System.out.print("|");        System.out.println();        System.out.println();        m=n;                       /*I1*/        j=-1;        do{            i = X[m];                 /*I2*/            if(i < 0){            }else {                do{                    X[m] = j;               /*I3*/                    j = -m;                    m = i;                    i = X[m];                }while (i > 0);            /*I4*/                i = j;            }            X[m] = -i;                  /*I5*/            m--;        }while (m > 0);        /*Print the final X[i] (1<=i<=n) after inversed*/        System.out.println("The final X[i] (1<=i<=n) after inversed is:");        for(int k=1; k<=n; k++){            System.out.println("X["+k+"]="+X[k]);        }        System.out.println();        /*Print the final permutation after inversed*/        System.out.println("The final permutation after inversed is:");        System.out.print("| ");        for(int k=1; k<=n; k++){            System.out.print((char)(k+96));            System.out.print(' ');        }        System.out.print("|");        System.out.println();        System.out.print("| ");        for(int k=1; k<=n; k++){            System.out.print((char)(X[k]+96));            System.out.print(' ');        }        System.out.print("|");        System.out.println();    }}

Outputs

The initial X[i] (1<=i<=n) is:X[1]=6X[2]=2X[3]=1X[4]=5X[5]=4X[6]=3The initial permutation is:| a b c d e f || f b a e d c |The final X[i] (1<=i<=n) after inversed is:X[1]=3X[2]=2X[3]=6X[4]=5X[5]=4X[6]=1The final permutation after inversed is:| a b c d e f || c b f e d a |

Reference

<< The Art of Computer Programming: Fundamental Algorithms >> VOLUME 1, DONALD E. KNUTH

0 0
原创粉丝点击