以非常大的数字序列查找周期

时间:2012-10-08 20:25:22

标签: c++

是否有可能在很大一部分数字中找到一个循环长度(超过C / C ++中bigest整数类型的最大值,假设为2 ^ 20),而不涉及磁盘来执行它?最好的情况是按顺序分析它们,因为它们是从标准输入到达的,但我很确定这是不可能的,我需要将它们存储在内存中。但我希望我错了。数字值是整数,它们来自标准输入。

实施例: 输入:(1 2 3 ...(1 ^ 3的2 ^ 20三倍)... 1 2 3) 期望的结果:3

修改

让我们把周期看作一个周期(f(x)= f(x + t)对于某些t) - 寻找t的值

让我们假设操作内存太少而无法存储所有数字(数字可能超过2 ^ 20)并且可能是gmp类型。

2 个答案:

答案 0 :(得分:2)

这是一个经过充分研究的问题,有很多算法取决于您的资源和约束是什么:

http://en.wikipedia.org/wiki/Cycle_detection

您不需要将所有内容存储在内存中(基本算法中只有两个指针/索引),但您需要能够多次访问序列。

另见:

Floyd's cycle-finding algorithm

答案 1 :(得分:1)

找到句点长度的标准方法是想象你的序列是整数字母表中的字符串S,然后找到最左边的位置(大于0),其中S可以在字符串SS中找到(串联字符串S与自身)。也就是说,如果S = 'abcabc',则必须找到大于零的第一个位置i,以便在字符串i中的位置SS = 'abcabcabcabc'处找到S.在这种情况下,这是3,这是期间的长度。

这可以通过任何具有线性性能的字符串搜索算法来完成,并且对于现代计算机上的2 ^ 20个数字应该可以完美地工作。我怀疑你可以避免在内存中保存数字。