通过最近范围的索引填充二维数组

时间:2011-03-10 12:37:41

标签: algorithm language-agnostic

有点难以描述我想要的东西,所以我开始并举例:

Index   ArrayPos
1       0,0
2       1,0
3       0,1
4       1,1
5       2,0
6       2,1
7       2,2
8       0,2
9       1,2
10      1,2
11      3,0
12      3,1

等等。基本上我想要逐行或逐列填充数组,但总是最接近0,0的自由位置。

如果我想获得索引3或4237882348的数组位置,如果算法的持续时间总是相同的话会很好。

我用模数尝试了一些东西,但从未得到它。

3 个答案:

答案 0 :(得分:2)

如果算法能够记住最后的位置,那将非常容易。

您从等级编号开始,该编号为0.对于每个等级r,有2r+1个职位免费。 所以r = 0 =>一个可用的位置是0,0, 对于每个等级,您生成2r+1个位置并存储在数组中。值由

生成 每个r

,循环并开始创建位置r,0 - 0,r - r,1 - 1, r ...直到r,r 因此,对于每个新索引,使用其中一个创建的位置,直到没有自由位置。然后增加等级并继续。

目前尚不清楚考虑哪种距离测量,但这可以根据示例进行。

答案 1 :(得分:2)

如果您不关心x,y和y,x的顺序,那么这应该适合您:

let x = ceiling(sqrt(Index)) - 1
let y = ceiling((Index - x^2)/2) - 1
if Index is odd, swap x and y

有了这个,虽然4,4在5,0之前出现,所以它取决于您在进入示例中没有的较大数字时所需的顺序......

答案 2 :(得分:1)

如果我们采用p-范数,其中p =无穷大(也就是最大范数),它将距离定义为最大坐标,看起来就像你的例子,那么下面的工作在javascript中(虽然逻辑适用于任何你喜欢的语言):

var i=1, L=0, n=15, x,y;
outer: while (true) {

  for (var j=1; j<=2*L+1; j++) {
    x = j<=L ? L : 2*L+1 - j;
    y = j<=L ? j-1 : L;
    document.write(x+" "+y+"<br/>");
    i++;
    if (i>n) {
      break outer;
    }
  }
  L++;
}

请注意,n是您要打印的元素数量,您可以更改document.write行以执行任何操作。因此,如果您想用单个数组中的值填充您的二维数组:

n = oneDimArray.length;

而不是document.write:

newArray[x][y] = oneDimArray[i];