【问题标题】:Find period in very large sequence of numbers在非常大的数字序列中查找周期
【发布时间】:2012-10-08 20:25:21
【问题描述】:

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

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

编辑

让我们将循环视为一个周期(f(x) = f(x+t) 对于某些 t) - 寻找 t 的值

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

【问题讨论】:

  • ummmm...所以“循环”是指重复子字符串?
  • 您可能需要解释为什么“3”是您的示例中所需的结果。为什么不是 1?
  • 因为3是周期的长度,更正
  • 我认为 2^20 不会溢出最大可能的整数类型。即使是标准的现成整数类型,它也几乎不会溢出。
  • @Kerrek SB 但可能会溢出例如可用内存

标签: c++


【解决方案1】:

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

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

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

另见:

Floyd's cycle-finding algorithm

【讨论】:

  • 这不是 OP 似乎想要的。循环查找算法假定序列确实是循环的 - 即它是通过类似于您链接的维基百科页面上显示的递归关系计算的。它搜索序列中的第一个重复数字,这可能与句点的长度有很大的不同。
  • 这只是概括为在序列的开头有一些垃圾。在 Wiki 页面上使用的符号中,您可以找到 mu 和 lambda,而 lambda(循环长度)是提问者正在寻找的。​​span>
  • 关键是这个算法依赖于x1 = f(x0), x2 = f(x2)等事实——否则它不能正常工作。想象一下序列1 2 2 1 2 2 - Floyd 的算法将报告周期长度为 1 或 2,这取决于您是直接在 1 处停止还是继续到 2s。这两种长度显然都是错误的。
  • @Ivan 如果循环中的条目不明显,那您是对的。我假设循环中的每个条目都与 deha 的示例中的不同,但这可能是一个错误的假设。
【解决方案2】:

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

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

【讨论】:

  • 对,除非您知道字符串是周期性的并且有一个周期长度的界限,否则您必须拥有整个字符串,否则它可能会与最后一个字符中断。
猜你喜欢
  • 2017-09-26
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-03-23
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-09-30
相关资源
最近更新 更多