【问题标题】:Finding period of a sequence序列的查找周期
【发布时间】:2017-09-26 11:18:57
【问题描述】:

我想解决这个问题:

对于给定的序列a[0], a[1], a[2],..., a[n-1],请找到该序列的“句号”。
周期是所有有效 i 满足 a[i] = a[i+k] 的最小整数 k (k >= 1),并且 k 是 n 的除数。

我当前的解决方案是计算 n 的所有除数(这是 k)并测试所有 k,但它需要 O(n * d(n))。我认为它很慢。
有没有高效的算法?

【问题讨论】:

  • 您可以用 O(1) 而不是 O(n) 排除一些除数。如果 a[0] !== a[1] 排除除数 1。如果 a[0] !== a[2] 排除除数 2。如果 a[0] !== a[3] 排除除数 3等等。一般来说,如果 a[0] !== a[divisor] 你可以从潜在的解决方案中排除除数。
  • @FreemanLambda 但即使测试的除数不是句点,该测试也可以通过,所以我不同意它是 O(1)。它可能一步拒绝除数,但也可能更晚。
  • @harold 你说的是真的,但是在他当前的解决方案中 square1001 总是测试每个除数(直到找到解决方案)。假设已经有一个循环可以找到 n 的所有除数,那么在该循环中潜入 a[0] !== a[divisor] 应该不会那么昂贵。

标签: arrays algorithm computer-science number-theory period


【解决方案1】:

将 Z 算法(herehere)应用于给定序列。

然后找到i这样的第一个位置

  i+z[i] = n

  n mod i = 0

如果i这样的值存在,则为最短周期

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 2012-03-23
    • 2015-10-14
    相关资源
    最近更新 更多