Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何生成对序列进行代数编码的函数?_Algorithm_Function_Complexity Theory - Fatal编程技术网

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

Algorithm 如何生成对序列进行代数编码的函数?,algorithm,function,complexity-theory,Algorithm,Function,Complexity Theory,在给定序列的情况下,是否有方法生成函数F,例如: seq = [1 2 4 3 0 5 4 2 6] 然后Fseq将返回生成该序列的函数?就是 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 #

在给定序列的情况下,是否有方法生成函数F,例如:

seq = [1 2 4 3 0 5 4 2 6]
然后Fseq将返回生成该序列的函数?就是

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回答另一个问题,我只对整数序列感兴趣-如果这很重要的话


如果还不清楚,请告诉我

如果你说序列可能是完全随机的,那就没有什么神奇的了。然而,这总是可能的,但不会节省您的内存。在最坏的情况下,任何插值方法都需要相同的内存量。因为,如果不这样做,就有可能将所有内容压缩到一个位

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

只需使用一些存档工具,以节省内存使用


我想这对你来说是很有用的:

如果你只想知道一个带+和*的函数,也就是说,一个多项式,你可以去维基百科查一下拉格朗日多项式。 它给出了编码序列的最低次多项式

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


尽管如此,如果您知道序列可能非常简单且非常长,这可能是一种选择。

如果序列来自一个低阶多项式,则使用一种简单的方法来查找生成序列的唯一多项式。构造n个数的多项式具有On²的时间复杂度,而计算它具有On²的时间复杂度

在牛顿级数中,多项式表示为x,xx-1,xx-1x-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))))))))

它与使用其他技术得到的多项式相同,比如拉格朗日插值;这是生成它的最简单的方法,因为你可以得到多项式形式的系数,可以用霍纳的方法计算,不像拉格朗日形式

Fseq{return seq;}?从代数角度讲,我的意思是函数将由数学运算组成,如+、-、*,等等。换句话说,您可以从内存中释放原始seq。floor624503421/10^k%10Ok,所以你想插值一个函数,其中x值是序列0..N-1的索引,相应的y值是序列的项。检查一些线性插值程序。