【发布时间】: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