用于生成记录序列的数学公式

问题描述:

我有两个查找表,如果可能的话,我想用简单的数学来消除这两个查找表。用于生成记录序列的数学公式

第一个是从数组中的索引到序列{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可能会发生什么,而舍入错误可能会支付一部分。我已经测试了超过一百万,并没有看到问题发生。