繁体   English   中英

如何生成将对序列进行代数编码的函数?

[英]How to generate a function that will algebraically encode a sequence?

有什么方法可以生成给定序列的函数F,例如:

seq = [1 2 4 3 0 5 4 2 6]

然后F(seq)将返回生成该序列的函数? 那是,

F(seq)(0) = 1
F(seq)(1) = 2
F(seq)(2) = 4
... and so on

另外,如果是,那么最低复杂度的函数是什么?生成的函数的复杂性是什么?

编辑似乎我不清楚,所以我将尝试举例说明:

F(seq([1 3 5 7 9])} 
# returns something like:
F(x) = 1 + 2*x
# limited to the domain x ∈ [1 2 3 4 5]

换句话说,我想使用+,*等数学函数计算一个可用于代数的函数,即使从内存中清除了整数序列,也要还原 我不知道是否可能,但是,由于对于平凡的情况,可以很容易地为这种函数编写一个近似值,因此我想知道它能走多远,是否有对此的一些实际研究。

编辑2回答另一个问题,我只对整数序列感兴趣-如果那很重要。

如果还不清楚,请告诉我!

好吧,如果您只是想知道带有“ +和*”的函数,也就是说是一个多项式,则可以查看Wikipedia中的Lagrange多项式( https://en.wikipedia.org/wiki/Lagrange_polynomial )。 它为您提供了编码序列的最低次多项式。

毫无疑问,您可能将无法存储比以前更少的存储量,因为多项式的概率为d = n-1,其中n是随机整数,数组的大小非常高。 此外,您将必须存储有理数而不是整数。 最后,与使用数组的O(1)相比,访问任意数量的数组都将在O(d)中(使用Horner算法进行多项式求值)。

但是,如果您知道序列可能非常简单且很长,则可以选择。

如果序列来自度数较低的多项式,则使用牛顿级数查找生成该序列的唯一多项式的简单方法。 为一个数字构造多项式具有O(n²)时间复杂度,而对其求值则具有O(n)。

在牛顿级数中,多项式用x,x(x-1),x(x-1)(x-2)等表示,而不是更熟悉的x,x²,x³。 要获得系数,基本上,您需要计算序列中后续项之间的差,然后计算差之间的差,直到只剩下一个或得到全零的序列为止。 沿着底部得到的数字除以项的阶乘可得出系数。 例如,在第一个序列中,您会得到以下差异:

1  2  4  3  0  5   4   2    6
   1  2 -1 -3  5  -1  -2    4 
      1 -3 -2  8  -6  -1    6
        -4  1 10 -14   5    7
            5  9 -24  19    2
               4 -33  43  -17
                 -37  76  -60
                     113 -136
                         -249

因此,生成此序列的多项式为:

f(x) = 1 + x(1 + (x-1)(1/2 + (x-2)(-4/6 + (x-3)(5/24 + (x-4)(4/120 
         + (x-5)(-37/720 + (x-6)(113/5040 + (x-7)(-249/40320))))))))

与使用其他技术(例如Lagrange插值)获得的多项式相同。 这是生成它的最简单方法,因为您可以获得可以用Horner方法求值的多项式形式的系数,这与例如Lagrange形式不同。

如果您说序列可能是完全随机的,那是没有魔术的。 但是,它始终是可能的,但不会节省您的内存。 在最坏的情况下,任何插值方法都需要相同数量的内存。 因为,如果没有,则有可能将所有内容压缩到单个位。

另一方面,有时可以使用蛮力,某些启发式方法(如遗传算法 )或数值方法来重现具有指定类型的某种数学表达式,但是祝您好运:)

只需使用一些存档工具即可,以节省内存使用量。

我认为这对您有所帮助: http : //en.wikipedia.org/wiki/Entropy_(information_theory)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM