algorithm - 汉诺塔的复杂性?

标签 algorithm complexity-theory

我最近在解决汉诺塔问题。我使用了“分而治之”的策略来解决这个问题。我将主要问题分成三个较小的子问题,因此产生了以下重现。

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

解决这个问题会导致

O(2^n) [exponential time]

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

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

最佳答案

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

另一方面,如果您只想知道所需的步数(无需枚举),计算 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

关于algorithm - 汉诺塔的复杂性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12383044/

相关文章:

algorithm - 寻找 "positive cycle"

javascript - 我的循环运行了两次,没有给出正确的答案任何解决方案

MYSQL:复杂查询问题

java - 给定一个元素时,哪个 Java 集合的链表在 O(1) 中添加?

algorithm - 时间复杂度和递推关系

java - 通缉 : Recurrence Formula of In-Order binary tree output method

algorithm - big-O 表示法与并发世界相关吗?

algorithm - 有效地找到直线的斜率

algorithm - 有向图找到其输入边不能从给定节点全部到达的节点

c++ - 相交三角形的面积