求无限矩阵对角线遍历序列的第n个坐标的公式或算法
求无限矩阵对角线遍历序列的第n个坐标的公式或算法
嘿,这个问题我太熟了!你说的这种遍历方式其实是按对角线分组来走的:每一组对角线上的坐标都满足 x + y = s(s从0开始递增),而且每组里的坐标是从(s, 0)往(0, s)依次排列的。咱们一步步拆解出公式:
第一步:找到n所在的对角线s
首先,前s条对角线(从s=0到s=s-1)的总元素个数是等差数列求和:1 + 2 + ... + s = s*(s+1)/2,这个值就是第s条对角线的起始序号(比如s=2的起始序号是3,对应坐标(2,0))。
要找到n对应的s,只需要解不等式:s*(s+1)/2 ≤ n
解这个二次不等式,就能得到s的计算公式:s = floor( (sqrt(8n + 1) - 1) / 2 )
这里的floor是向下取整,用Python里的math.floor()或者直接用整数除法都可以。
第二步:计算n在对角线上的偏移量
找到s之后,这条对角线的起始序号是start = s*(s+1)//2,那么n在这条对角线上的位置偏移量就是:offset = n - start
第三步:推导坐标值
因为这条对角线上的坐标是从(s, 0)开始,每往后一个位置,x减1、y加1,所以对应的坐标就是:(s - offset, offset)
直接可用的Python实现
把上面的逻辑写成函数,测试一下完全符合你的序列:
import math def get_nth_pair(n): s = math.floor( (math.sqrt(8 * n + 1) - 1) / 2 ) start = s * (s + 1) // 2 offset = n - start return (s - offset, offset)
验证几个例子
- n=0 → (0, 0) ✔️
- n=5 → (0, 2) ✔️
- n=10 → (4, 0) ✔️
- n=14 → (0, 4) ✔️
另外你提到的生成函数,其实逻辑是对的——它是按对角线从s=0开始生成,每一条对角线对应循环里的i(i = s+1),总元素数确实是m*(m-1)/2 -1,和你观察到的一致。
备注:内容来源于stack exchange,提问作者user695931
相关产品推荐
相关产品推荐

