用于查找序列中下一个数字的算法

时间:2010-03-17 19:21:29

标签: algorithm numbers sequence

自从我开始编程以来,这一直是我一直很好奇的事情。但对我来说似乎太复杂了甚至尝试。

我很乐意看到解决方案。

1, 2, 3, 4, 5    // returns 6 (n + 1)
10, 20, 30, 40, 50   //returns 60 (n + 10)
10, 17, 31, 59, 115  //returns 227 ((n * 2) - 3)

9 个答案:

答案 0 :(得分:19)

您要做的是多项式插值。有许多方法(参见http://en.wikipedia.org/wiki/Polynomial_interpolation),但你必须在多项式的次数和至少U + 1值上有一个上界U.

如果你有连续值,那么有一个简单的算法。

给定序列x1,x2,x3,...,让Delta(x)为差异序列x2-x1,x3-x2,x4-x3,....如果你有一个n次多项式的连续值,那么Delta的第n次迭代就是一个常数序列。

例如,多项式n ^ 3:

1, 8, 27, 64, 125, 216, ...
7, 19, 37, 61, 91, ...
12, 18, 24, 30, ...
6, 6, 6, ...

要获得下一个值,请填写另一个值,然后再向后工作。

6, 6, 6, 6 = 6, ...
12, 18, 24, 30, 36 = 30 + 6, ...
7, 19, 37, 61, 91, 127 = 91 + 36, ...
1, 8, 27, 64, 125, 216, 343 = 216 + 127, ...

对上述值数量的限制可确保您的序列在执行差异时不会变空。

答案 1 :(得分:4)

很抱歉让人失望,但这种情况不太可能(一般情况下),因为任何给定的k值都有无数的序列。也许有某些限制..

您可以查看此Everything2帖子,该帖子指向Lagrange polynomial

答案 2 :(得分:4)

正式地,部分序列没有唯一的下一个值。通常理解的问题可以清楚地表述为:

  

假设展示的部分序列足以约束某些生成规则,推导出最简单的规则并展示下一个生成的值。

问题在于“最简单”的含义,因此对于算法解决方案并不是很好。如果您将问题限制在生成规则的某类函数形式中,则可以执行此操作,但详细信息取决于您愿意接受的形式。

答案 3 :(得分:1)

这本书Numerical Recipes有实际算法的页面和页面来做这种事情。这非常值得一读!

前两种情况很简单:

>>> seq1 = [1, 2, 3, 4, 5]
>>> seq2 = [10, 20, 30, 40, 50]
>>> def next(seq):
...   m = (seq[1] - seq[0])/(1-0)
...   b = seq[0] - m * 0
...   return m*len(seq) + b
>>> next(seq1)
6
>>> next(seq2)
60

第三种情况需要求解非线性函数。

答案 4 :(得分:0)

我喜欢这个想法和序列中的第一和第二,在我看来这是可能的,但是再次你不能概括,因为序列可能完全脱离基础。答案可能是你无法概括,你可以做的是写一个算法来执行一个特定的序列,知道(n + 1)或(2n + 2)等......

您可以做的一件事是在元素i和元素i + 1以及元素i + 2之间取一个区别。

例如,在你的第三个例子中:

10 17 31 59 115

17和10之间的差异是7,31和17之间的差异是14,19和31之间的差异是28,15和59之间的差异是56.

所以你注意到它变成了元素i + 1 = i +(7 * 2 ^ n)。

所以17 = 10 +(7 * 2 ^ 0)

31 = 17 +(7 * 2 ^ 1)

等等......

答案 5 :(得分:0)

您可以尝试使用extrapolation。它将帮助您找到描述给定序列的公式。

对不起,我不能告诉你更多,因为我的数学教育发生在很久以前。但你应该在好书中找到更多的信息。

答案 6 :(得分:0)

这种数字系列通常是“情报测试”的一部分,这使我认为这种算法的术语是通过(至少部分)Turing Test的东西,这是相当困难的完成。

答案 7 :(得分:0)

对于任意函数,它无法完成,但对于像每个示例中的线性函数一样,这很简单。

您有f(n+1) = a*f(n) + b,问题相当于找到ab

至少给出序列的三个术语,你可以这样做(你需要三个因为你有三个未知数 - 起点ab)。例如,假设您有f(0)f(1)f(2)

我们可以求解方程式:

f(1) = a*f(0) + b
f(2) = a*f(1) + b

解决方案是:

a = (f(2)-f(1))/(f(1)-f(0))
b = f(1) - f(0)*(f(2)-f(1))/(f(1)-f(0))

(您需要单独解决f(0) = f(1)以避免被零除的情况。)

获得ab后,您可以重复将公式应用于起始值,以生成序列中的任何字词。

当给出任何序列中的三个点(例如,第4,第7,第23或其他)时,也可以编写更通用的过程。 。 。这只是一个简单的例子。

但是,我们不得不对我们的解决方案的形式做出一些假设。 。 。在这种情况下,将其视为线性,如您的示例所示。例如,可以将它作为更一般的多项式,但在这种情况下,您需要更多的序列项来找到解,这取决于多项式的次数。

答案 8 :(得分:0)

另见Douglas Hofstadter撰写的“流动概念与创造性类比:思想基本机制的计算机模型”一书中的“寻找序列”一章

http://portal.acm.org/citation.cfm?id=218753.218755&coll=GUIDE&dl=GUIDE&CFID=80584820&CFTOKEN=18842417