【发布时间】:2012-05-04 02:00:09
【问题描述】:
我的问题是:我有一个很大的数字序列。我知道,在某个时间点之后,它会变成周期性的——也就是说,序列的开头有 k 个数字,然后有 m 个数字在序列的其余部分重复。作为一个更清楚的例子,序列可能如下所示: [1, 2, 5, 3, 4, 2, 1, 1, 3, 2, 1, 1, 3, 2, 1, 1, 3 , ...],其中 k 为 5,m 为 4,则重复块为 [2, 1, 1, 3]。从这个例子中可以清楚地看出,我可以在较大的块内有重复位,所以只查找第一个重复实例是没有帮助的。
但是,我不知道 k 或 m 是什么 - 我的目标是将序列 [a_1, a_2, ... , a_n] 作为输入并输出序列 [a_1, ... , a_k, [ a_(k+1), ... , a_(k+m)]] - 基本上通过将大部分序列作为重复块列出来截断较长的序列。
有没有一种有效的方法来解决这个问题?此外,在计算上可能更难但更理想 - 当我生成有问题的序列时是否可以这样做,以便我必须生成最少的数量?我在这个网站上查看了其他类似的问题,但它们似乎都处理没有开头非重复位的序列,而且通常不必担心内部重复。
如果它有帮助/有用,我还可以了解我为什么要查看这个以及我将使用它的目的。
谢谢!
编辑:首先,我应该提到我不知道输入序列是否正好在重复块的末尾结束。
我正在尝试解决的实际问题是为二次无理数(实际上是负 CFE)的连分数展开式 (CFE) 编写一个很好的封闭式表达式。为这些 CFE 生成任何精确度的部分商* 非常简单 - 但是,在某些时候,二次无理数的 CFE 尾部变成了重复块。我需要处理这个重复块中的部分商。
我目前的想法是:也许我可以调整一些建议的算法来使用这些序列之一。或者,也许证明二次无理数是周期性的,这将帮助我了解它们为什么开始重复,这将帮助我想出一些简单的标准来检查。
*如果我将连分数展开式写为 [a_0, a_1, ...],我将 a_i 称为部分商。
有兴趣的可以在这里找到一些背景信息:http://en.wikipedia.org/wiki/Periodic_continued_fraction
【问题讨论】:
-
如果你的序列是无限的,这个问题一般是无法解决的:你永远无法知道你是否只是处于一个稍后会停止的“内部重复”部分。您对
k/m是否有任何限制,或者您只是想要一个沿途运行的“最佳猜测”算法(对于“生成时”部分)? -
您是否保证在给定输入 [a_1...a_n] 的末尾至少有 2 次最终周期子序列的重复?
-
@Dougal 我对 m 有一些上限,尽管它们不是特别好的估计 - 序列在技术上是无限的,但我正在研究它的有限部分,它保证有多个重复部分的重复。哪个,我想回答了亚历克斯的问题 - 是的,我保证至少有两次重复。
标签: arrays algorithm language-agnostic sequence repeat