不交叉序列计算

时间:2010-01-18 07:38:01

标签: algorithm math

来自http://discuss.joelonsoftware.com/default.asp?interview.11.794054.1

序列A定义如下:

从自然数字开始 1,2,3,...

Initialize count = 1;

    while(there are uncrossed numbers)
    {
        pick the first uncrossed number say n.
      set A[count] = n.
      Cross out the number count+n.
      Cross out the number n
      Increment count.
    }

给出一个快速算法来确定A [n],给定n。

尝试获取log n中的多项式算法。

2 个答案:

答案 0 :(得分:3)

很抱歉发布此问题。

显然这是一个名为Wythoff序列的着名序列,有一个由A [n] = [n * phi]给出的A [n]的整齐公式,其中[x] = x的整数部分,phi是黄金比例

为了计算[n phi],我们可以将phi近似为连续的斐波那契数的比率,给出O(logn loglogn)算法。 (O(logn)时间对O(log n)位数进行算术运算)。

答案 1 :(得分:2)

以下是如何开始

1 2 3 4 5 6 7 8 ... A[1] = 1, cross 2
1 X 3 4 5 6 7 8 ... A[2] = 1, cross 3
1 X X 4 5 6 7 8 ... A[3] = 1, cross 4
...

数字1永远不会越过,因为可以越过的最小数字是1 + 1 == 2.

因此有恒定时间算法:所有n的A [n] = 1。