算法:用分治法设计gray码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法:用分治法设计gray码相关的知识,希望对你有一定的参考价值。

问题描述:

 Gray码是一个长度为2n的序列。序列中无相同的原图,每个元素都是长度为n位的串,相邻元素恰好只有一位不同。用分治策略设计一个算法对任意的n构造相应的Gray码。

算法设计:

n=1时,Gray码:0,1

n=2时,Gray码:00,10, 11,01

 n=3时,Gray码:000,010,011,001,101,111,110,100

 n=4,时,Gray码:0000,0010,0011,0001,0101,0111,0110,0100, 1100,1110,1111,1101,1001,1011,1010,1000

从上面可以看出如下规律:从n=2开始,每个n的Gray码由两部分组成。后一位的Gray码可以从前一位的Gray码求出,即,在n的Gray码的前半部分是n-1的所有Gray码顺次在前面加0得到;n的Gray码的后半部分是n-1的所有Gray码逆序在前面加1得到。

 实现:

import java.awt.*;

import javax.swing.*;

import java.math.*;

 

public class gray

{

    public static void main(String args[])

    {

        String []graycode;

        int n,pn;

        String str=JOptionPane.showInputDialog("请输入n:");

        n=Integer.parseInt(str);

        pn=(int)Math.pow(2,n);

        graycode=new String[pn];

        for(int l=0;l<pn;l++)

        {

            graycode[l]="";

        }

        code(n,pn,graycode);

    }

    static void code(int n,int pn,String graycode[])

    {

        if(0==n)

        {

            System.out.print("输入错误!");

        }

        else if(1==n)

        {

            graycode[0]="0";

            graycode[1]="1";

        }

        else

        {

            int t=1;

            int len=1;

            while(t<pn)

            {

                t=2*t;

                len++;

                for(int i=0;i<t/2;i++)

                {

                    graycode[i]="0"+graycode[i];

                }

                for(int j=t;j>t/2;j--)

                {

                    graycode[j-1]="1"+graycode[t-j].substring(1,len-1);

                }

            }

        }

        for(int m=0;m<pn;m++)

        {

            System.out.printf("%3d",m);

            System.out.print("的格雷码:");

            System.out.println(graycode[m]);

        }

 

    }

}

 

以上是关于算法:用分治法设计gray码的主要内容,如果未能解决你的问题,请参考以下文章

有缺陷的棋盘问题——寻找伪代码算法(分治法)

六中常用算法设计:穷举法分治法动态规划贪心法回溯法和分支限界法

六中常用算法设计:穷举法分治法动态规划贪心法回溯法和分支限界法

算法设计与分析 实验二 分治法求解最近点对问题

算法设计与分析分治法

分治法求解最大子段和问题