有没有办法生成一个函数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 回答另一个问题,我只对整数序列感兴趣 - 如果这很重要。
如果还不清楚,请告诉我!
答案 0 :(得分:3)
好吧,如果您只想知道带有“+和*”的函数,也就是多项式,您可以去维基百科查看拉格朗日多项式(https://en.wikipedia.org/wiki/Lagrange_polynomial)。 它为您提供编码序列的最低次多项式。
不幸的是,你可能无法比以前存储更少,因为多项式的概率为d = n-1,其中n是数组的大小,随机整数非常高。 此外,您将不得不存储有理数而不是整数。 最后,与O(1)相比,对任意数量的数组的访问将在O(d)中(使用Horner算法进行多项式评估)。
尽管如此,如果您知道您的序列可能非常简单且非常长,那么它可能是一种选择。
答案 1 :(得分:3)
如果序列来自具有低度的多项式,则查找生成它的唯一多项式的简单方法是使用Newton's series。构造n个数的多项式具有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))))))))
这是使用其他技术获得的相同多项式,例如拉格朗日插值;这是生成它的最简单方法,因为您可以使用Horner方法计算多项式形式的系数,例如,与拉格朗日形式不同。
答案 2 :(得分:2)
如果你说序列可以是完全随机的,那就没有魔法了。然而,它总是可能的,但不会挽救你的记忆。在最坏的情况下,任何插值方法都需要相同的内存量。因为,如果它没有,则可以将所有内容压缩到一个位。
另一方面,有时候可以使用蛮力,一些启发式(如genetic algorithms)或数值方法来重现某种具有指定类型的数学表达式,但祝你好运: )
只需使用一些归档工具即可节省内存使用量。
我认为阅读此内容对您有用:http://en.wikipedia.org/wiki/Entropy_(information_theory)