计算并列出所有排列

下面的小程序显示集合的所有排列N个n个={1,…,n},其中n从0变为7。N个0当然是空的。选择7作为允许集合的上限没有特殊的原因-下面描述的算法非常通用。问题在于速度。我没有足够的耐心等待7! = 5040N的排列7在我的100 MHz机器上列出。(在开发环境中,N8置换速度比N快7在浏览器中。附言:这是1997年写的!)因此,要当心。

在小程序中,每个排列都是循环。对于n=3,我们有一个包含6个元素的列表对称群S公司将排列作为循环的乘积进行观察,很明显S的元素表示等边三角形的刚性运动。事实上,设想这样一个三角形,并用数字1、2、3标记其顶点。然后(1 2 3)表示顶点的旋转,其中1指向2,2指向3,3指向1。(1 3 2)是相反方向的旋转。(1 2)(3)是围绕顶点3的中间点的对称性,依此类推。


此小程序需要Sun的Java VM 2,您的浏览器可能会将其视为弹出窗口。事实并非如此。如果您想看到小程序的工作,请访问Sun的网站:https://www.java.com/en/download/index.jsp,下载并安装Java VM并使用小程序。


如果applet不运行怎么办?

小程序提供了三种生成所有排列列表的算法:R(右)执行,L(左)由于B。H(H)eap。我将依次描述每一个。在所有算法中,N表示要置换的项目数。

  1. 递归算法

    递归算法简短而神秘。它是通过呼叫访问(0)执行的。全局变量级别初始化为-1,而数组Value的每个条目都初始化为0。

    无效访问(int k){级别=级别+1;值[k]=级别;//=是赋值如果(级别==N)//==是比较AddItem();//到列表框其他的for(int i=0;i<N;i++)if(值[i]==0)访问(i);级别=级别1;值[k]=0;}无效AddItem(){//从值[0]、值[1]…形成字符串。。。值[N-1]。//此时,该数组包含一个完整的置换。//该字符串将添加到列表框中以进行显示。//因此,函数对算法来说是至关重要的。}

    手动尝试此算法,以确保您理解其工作原理。

  2. 词汇顺序和下一个排列

    置换f位于词典编纂的(字母)顺序若(iff)对于k的最小值,使得f(k)≠g(k),我们得到f(k。从所有i的相同置换f(i)=i开始,第二个算法按字典顺序生成顺序置换。算法描述见[迪杰斯特拉,第71页]。

    无效getNext(){int i=N-1;while(值[i-1]>=值[i])i=i-1;int j=N;while(值[j-1]<=值[i-1])j=j-1;掉期(i-1,j-1);//交换位置(i-1)和(j-1)的值i++;j=N;而(i<j){掉期(i-1,j-1);i++;j——;}}
  3. B.希普算法

    Heap的简洁算法是作为递归方法HeapPermute实现的[列维京,第179页]。使用调用它堆置换(N)。

    无效堆权限(int n){如果(n==1)AddItem();其他{for(int i=0;i<n;i++)堆Permute(n-1);如果(n%2==1)//如果n是奇数掉期(0,n-1);else//如果n是偶数掉期(i,n-1);}

参考

  1. A.莱维汀,算法设计与分析导论,Addison Wesley,2003年
  2. E.W.Dijkstra,程序设计学科,普伦蒂斯·霍尔,1997年[传真](平装本)
  3. R.Sedgewick,C语言中的算法,Addison-Wesley,第3版(2001年8月31日)

突变

  • 换位
  • 排列组
  • 滑块
  • 图的困惑
  • 排列中的方程

    |联系人| |首页| |目录| |代数| |向上|

    版权所有©1996-2018亚历山大·博戈莫尼

  • 71883781