有点难以描述我想要的东西,所以我开始并举例:
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的数组位置,如果算法的持续时间总是相同的话会很好。
我用模数尝试了一些东西,但从未得到它。
答案 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];