用于生成记录序列的数学公式
问题描述:
我有两个查找表,如果可能的话,我想用简单的数学来消除这两个查找表。用于生成记录序列的数学公式
第一个是从数组中的索引到序列{0} => 1,{1,2} => 2,{3,4,5} => 3,s.t.的映射。有一个1中,两个2S,三个3S,等等或视觉:
lookup1[N] = {
1,
2, 2,
3, 3, 3,
4, 4, 4, 4,
5, 5, 5, 5, 5,
6, 6, 6, 6, 6, 6,
7, 7, 7, 7, 7, 7, 7,
8, 8, 8, 8, 8, 8, 8, 8,
...
}
第二个是用于增加序列,所述第一序列是(1),第二(1,2),所述第三(1 ,2,3)。这就像一个模数周期,但是在每个周期后都会增加。目测:
lookup2[N] = {
1,
1, 2,
1, 2, 3,
1, 2, 3, 4,
1, 2, 3, 4, 5,
1, 2, 3, 4, 5, 6,
1, 2, 3, 4, 5, 6, 7,
1, 2, 3, 4, 5, 6, 7, 8,
1, 2, 3, 4, 5, 6, 7, 8, 9,
...
}
这些需要从索引映射。对于第二次查找,输入5,4,3分别映射到3,2,1。
是否有任何数学公式会产生这些模式?我宁愿执行一些指令,而不是执行内存访问。
答
对于lookup1,这看起来与Triangular numbers密切相关,事实上它是相反的问题。三角形数字是具有n行的三角形中的项目数量。所以你有T1 = 1,T2 = 1 + 2 = 3,T3 = 1 + 2 + 3 = 6,T4 = 1 + 2 + 3 + 4 = 10。或者作为函数f(1)= 1,f 2)= 3,f(3)= 6,f(4)= 10。 (1)= 1,g(3)= 2,g(6)= 3,g(10)= 4。我们后面担心其他值。
没有为三角形数F(N)= N(N + 1)/ 2,和更复杂的一个用于逆
g(n) = (sqrt(8 * n + 1) - 1)/2
小实验示出了公式
ceil((sqrt(8*n+1) - 1)/2)
给出你想要的数字。
对于第二部分,你可以使用函数的逆三角形的数字,然后找到以前的三角形数量,并采取差异
X = ceil((sqrt(8*n+1) - 1)/2);
T = (X * (X-1))/2 ;
print(n-T);
略有谨慎注意。在转换点sqrt(8*n+1)
应计算为一个奇数整数值。非常大的n可能会发生什么,而舍入错误可能会支付一部分。我已经测试了超过一百万,并没有看到问题发生。