国际象棋骑士游戏的复杂性

时间:2016-05-15 09:08:57

标签: c time-complexity backtracking

我遇到了解渐近分析或复杂性的问题,我尝试了以下link 并阅读完整的文章,但这并没有给我最终答案我的问题,即:

我是否应该为每行代码编写复杂性并总结或其他内容?我的老师并没有完全解释如何做到这一点但是希望它完成。

  

条件:骑士(象棋)必须越过冰湖(m x n 矩阵)并得到他的好友   从湖的另一边有给定的障碍。每次他   跳跃,他跳跃的矩阵的细胞成为一个障碍   (冰瀑)。在他得到他的伙伴后,他必须回到起点   遵循不同的路线。起点是左下角的单元格,他的伙伴位于右上角的单元格

我使用Backtracking进行此算法,剩下的问题是计算时间渐近复杂度。 代码如下:

A

1 个答案:

答案 0 :(得分:4)

当您分析代码时,您必须逐行分析,计算每个操作/识别时间复杂度,最后,您必须将其求和以获得全局。

例如,你可以有一个带有线性复杂度的简单循环,但是后来在同一个程序中你可以有一个具有立方复杂度的三重循环,所以你的程序将具有立方复杂度。增长的功能顺序就在这里发挥作用。

让我们看一下算法时间复杂度的可能性,你可以看到我上面提到的增长顺序:

  • 常量时间的增长顺序为1,例如:a = b + c

  • 对数时间的增长顺序为LogN,通常会发生 当你将某事分成两半时(二元搜索,树木,甚至循环),或以相同的方式增加某些东西。

  • 线性,增长顺序为N,例如

    int p = 0;
    for (int i = 1; i < N; i++)
      p = p + 2;
    
  • Linearithmic ,增长顺序为n*logN,通常出现在分而治之的算法中。

  • Cubic ,增长顺序N^3,经典示例是一个三重循环,您可以检查所有三元组:

    int x = 0;
    for (int i = 0; i < N; i++)
       for (int j = 0; j < N; j++)
          for (int k = 0; k < N; k++)
              x = x + 2
    
  • 指数,增长顺序2^N,通常在您进行详尽搜索时发生,例如检查某些集合的子集。

我认为你的老师想要全面了解你的回溯算法是非常慢的。