如何设置Hypercube的坐标?我究竟做错了什么?

时间:2016-10-13 02:25:39

标签: java arrays data-structures computer-science

所以,我们有一个功课问题,要求我们创建一个角落的超立方体2 ^ n。并且每个角在x1,x2,x3 ...... xn的平面中具有一组n坐标。因此,n = 3超立方体具有如下坐标: 在平面x1,x2,x3中的000,001,011,010等。

编写这个程序的重点是有一个递归方法和一个迭代方法来“遍历”超立方体并且每个角落只传递一次而不重叠它的踪迹。教授还要求我们的Corner对象是超立方体类中的嵌套类。到目前为止,这是我提出的:

ublic class Hypercube {

private Corner[] walk;
private int size;
private final int ZERO  = 0;
private int count;

public Hypercube(int n) throws IllegalHypercubeException {
    if (n < 0) {
        throw new IllegalHypercubeException("Please enter a positive integer");
    } else {
        this.size = n;
        this.count = 0;
        this.walk = new Corner[(int) Math.pow(2, n)];
    }
}

public class Corner 
{

    private int[] coordinates;

    public Corner() {
        this.coordinates = new int[size];

    }this.coordinates = coordinates;

}

在我甚至可以在walk方法中递归排序之前,我发现设置坐标最困难。我是怎么设置2 ^ n个角的立方体每个角的所有坐标?

2 个答案:

答案 0 :(得分:0)

不打算为它编写代码(那是你的工作),但这里有一些东西可以帮助你:

在1D中 - 角落将是{0}和{1}

在2D中 - 角落将是

{
  {0,0}, {0,1}, 
  {1,0}, {1,1}
}

在3D中 - 角落将是

{
   {0,0,0}, {0,0,1}, {0,1,0}, {0,1,1},
   {1,0,0}, {1,0,1}, {1,1,0}, {1,1,1}
}

如果你仍然没有啊哈!的时刻,那么这就是扰流板:通过在N的所有角上添加前缀来制作N维角的列表-1维0然后1

答案 1 :(得分:0)

当你通过它的边缘遍历超立方体时,你会在每一步都改变一个坐标。注意,有一些特殊的二进制序列,其中只有一个位在相邻元素之间翻转。

查看Gray codes(n维超立方体的n位代码) - 它们已被很好地描述,存在大量递归和迭代生成序列的方法。