是否有可能在很大一部分数字中找到一个循环长度(超过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类型。
答案 0 :(得分:2)
这是一个经过充分研究的问题,有很多算法取决于您的资源和约束是什么:
http://en.wikipedia.org/wiki/Cycle_detection
您不需要将所有内容存储在内存中(基本算法中只有两个指针/索引),但您需要能够多次访问序列。
另见:
答案 1 :(得分:1)
找到句点长度的标准方法是想象你的序列是整数字母表中的字符串S,然后找到最左边的位置(大于0),其中S可以在字符串SS中找到(串联字符串S与自身)。也就是说,如果S = 'abcabc'
,则必须找到大于零的第一个位置i
,以便在字符串i
中的位置SS = 'abcabcabcabc'
处找到S.在这种情况下,这是3,这是期间的长度。
这可以通过任何具有线性性能的字符串搜索算法来完成,并且对于现代计算机上的2 ^ 20个数字应该可以完美地工作。我怀疑你可以避免在内存中保存数字。