【问题标题】:Complexity for towers of Hanoi?河内塔的复杂性?
【发布时间】:2012-09-12 07:21:03
【问题描述】:

我最近在解决河内塔问题。我使用“分而治之”的策略来解决这个问题。我将主要问题分成三个较小的子问题,从而产生了以下递归。

T(n)=2T(n-1)+1

解决这个问题会导致

O(2^n) [指数时间]

然后我尝试使用记忆技术来解决它,但是这里的空间复杂度也是指数级的,堆空间很快就会耗尽,对于更大的 n 问题仍然无法解决。

有没有办法在不到指数的时间内解决问题?解决问题的最佳时间是什么时候?

【问题讨论】:

  • 您所说的“河内塔”问题是什么意思?您的意思是确定 k 次移动后的状态,还是确定进入状态 X 需要多少次移动?
  • @MikeT 使用辅助(额外)peg 将 n 个磁盘从 src peg 移动到目标 peg 需要多少次移动,前提是您一次只能移动单个磁盘并且不能更大在运动过程中,圆盘可以放在更小的圆盘上。
  • (2^n)-1,恒定时间解。好吧,就 2^n 而言,“恒定”是恒定的,我认为实际上是 O(log(n))
  • @MikeT 加上将其转换为通常的 base-10 表示法 (cs.stackexchange.com/questions/21736/…) 以进行输出所需的时间。除非您从一开始就在正确的基础上计算算术运算。

标签: algorithm complexity-theory


【解决方案1】:

这取决于您所说的“解决”是什么意思。 3个钉子和n圆盘的河内塔问题需要2**n - 1移动来解决,所以如果你想枚举移动,你显然不能比O(2**n)做得更好,因为枚举k事物是@987654325 @。

另一方面,如果您只想知道所需的移动次数(不枚举它们),计算2**n - 1 是一个更快的操作。

另外值得注意的是,移动的枚举可以迭代完成,O(n)空间复杂度如下(disk1是最小的磁盘):

while true:
    if n is even:
        move disk1 one peg left (first peg wraps around to last peg)
    else:
        move disk1 one peg right (last peg wraps around to first peg)

    if done:
        break
    else:
        make the only legal move not involving disk1

【讨论】:

    【解决方案2】:

    你可以解决递归并获得一个封闭的形式。

    T(n) = 2*T(n-1) + 1

    T(n) = 2 * ( 2 * T(n-2) + 1) + 1

    T(n) = (2 ^ 2) * T(n-2) + 2^1 + 2^0

    T(n) = (2^k) * T(n-k) + 2^(k-1) + 2^(k-2) + ... + 2^0

    解决这个封闭的结果是

    T(n) = (2^n) - 1 与 T(0) = 0

    现在使用平方取幂。

    【讨论】:

    • 我也知道这个复发怎么解决。我的问题是这个谜题能否在不到指数级的时间内解决。
    • 不,如果不改变游戏的参数,它无法在小于指数的时间内解决。
    【解决方案3】:

    不幸的是,不可能在更短的时间内解决这个问题,因为改变所有河内塔的位置所需的移动次数是指数级的。 所以根据步数O(T),最好的解是线性的,所以尾数解是指数O(2^n)

    【讨论】:

      【解决方案4】:

      正好有 2^n-1 个动作,所以要列出它们,我们不能做得比 O(2^n) 时间复杂度更好。

      可以在 O(1) (好吧,如果你取任意大小的整数,则为 O(log n))空间中枚举必要的移动:

      (define (fbs n i) (if (even? n) (fbs (/ n 2) (+ i 1)) i))
      
      (define (fb n) (fbs n 1))
      
      (define (hanois n i m) 
        (
          cond 
          ((= i m) "DONE")
          (else 
                (define k (fb i))
                (print "move disk " k " " (if (even? (+ n k)) "left" "right"))
                (hanois n (+ 1 i) m))))
      
      (define (hanoi n) (hanois n 1 (expt 2 n)))
      

      [方案]

      请注意,由于算术,此算法有 log n 的开销(算法fb 查找最低有效设置位的位置)。任何涉及计数器递增/递减的简单解决方案都将具有相同的开销。

      【讨论】:

        【解决方案5】:

        这在一定程度上取决于您接受哪种表示形式。想象一下 以下表示:

        OneMove
            from : integral
            to   : integral
        
        Solution
            step_one   : optional reference to Solution
            step_two   : OneMove
            step_three : optional reference to Solution
        

        这样的表示实际上可以以线性复杂度创建,因为 有很多重复。

        我刚试过,为高度 64 构建这样的解决方案花了 不到一毫秒。当然,通过它仍然需要 2n-1 步。

        您没有指定语言,但如果您想要 C++ 中的代码,请添加一行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-18
          • 2023-04-06
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多