如何以字典方式枚举无序的整数对

时间:2011-09-04 17:27:03

标签: algorithm indexing combinatorics

算法(或者说公式)是什么,对于每对整数i和j,j> = i,给出一个整数k = k(i,j),使得

  • k(0,0)= 0
  • k(i,j2)= k(i,j1)+1为j2 = j1 + 1
  • k(i,0)= k(i-1,i-1)+ 1,i> = 1

成立?

换句话说,如果用自然数从左到右逐行填充矩阵的左下部分,从0开始,如何计算给定其行的索引的单元格的值i列索引j< = i?

非常感谢!

2 个答案:

答案 0 :(得分:1)

这是i *(i + 1)/ 2 + j。欢迎您查看

答案 1 :(得分:1)

Alleo答案的证明:

首先将第二个公式从j写入1

k(i,j)= k(i,j-1) + 1
k(i,j-1) = k(i,j-2) + 1
...
k(i,1) = k(i,0) + 1

总结你得到的这些公式:

k(i,j) = k(i,0) + 1+1 ..+1 = k(i,0) + j  (1)

现在来自你的第三个公式:

k(i,0) = k(i-1,i-1) + 1  

使用(1):

k(i-1,i-1) = k(i-1,0) + i-1 

然后

k(i,0) = k(i-1,0) + i

然后因为k(0,0)= 0

k(i,0) = sum(p for p=0 to i) = i*(i+1)/2 (2)

然后

(1) & (2) => k(i,j) = i*(i+1)/2 + j