2012-10-08 29 views
0

是否有任何可能性在非常大的数字部分(超过C/C++中的最大整数类型的最大值,比如2^20)中找到循环长度,而不涉及磁盘去执行它?最好的情况是按顺序分析它们,因为它们是从标准输入到达的,但我确信这是不可能的,我需要将它们存储在内存中。但我希望我错了。数字值是整数,它们来自标准输入。在非常大的数字序列中查找期间

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

EDIT

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

假设操作存储器太少而无法存储所有数字(数字可能大于2^20),可能是gmp类型。

+0

ummmm ......这样的 “循环” 你的意思是重复子? –

+1

您可能必须解释为什么“3”是您示例中所需的结果。为什么不是1? –

+0

因为3是循环的长度,所以更正 – deha

回答

1

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

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

+0

正确的,除非你知道字符串是周期性的,并且是周期长度的边界,否则你必须有整个字符串,否则它可能与最后一个字符断开。 –

2

这是一个精心研究的问题,与这取决于相当数量的算法,正是你的资源和约束上有:

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

你并不需要的一切存储在内存中(只有两个指针/ index在基本算法中),但是您需要能够多次访问序列。

参见:

Floyd's cycle-finding algorithm

+1

这不是OP似乎想要的。循环发现算法假定该序列实际上是循环的 - 即它是通过类似于您所链接的维基百科页面上显示的递归关系来计算的。它会搜索序列中的第一个重复数字,这可能与期间的长度有很大不同。 –

+0

这只是推广到在序列的开头有一些垃圾。在维基页面上使用的符号中,您会发现mu和lambda,而lambda(周期长度)是提问者正在寻找的内容。 – Soverman

+1

问题是,这个算法取决于'x1 = f(x0),x2 = f(x2)'等事实 - 否则它不能正常工作。想象一下序列'1 2 2 1 2 2' - 弗洛伊德算法会报告1或2的周期长度,具体取决于你是直接停在1还是继续2。两种长度显然都是错误的。 –

相关问题