我遇到了解渐近分析或复杂性的问题,我尝试了以下link 并阅读完整的文章,但这并没有给我最终答案我的问题,即:
我是否应该为每行代码编写复杂性并总结或其他内容?我的老师并没有完全解释如何做到这一点但是希望它完成。
条件:骑士(象棋)必须越过冰湖(m x n 矩阵)并得到他的好友 从湖的另一边有给定的障碍。每次他 跳跃,他跳跃的矩阵的细胞成为一个障碍 (冰瀑)。在他得到他的伙伴后,他必须回到起点 遵循不同的路线。起点是左下角的单元格,他的伙伴位于右上角的单元格
我使用Backtracking进行此算法,剩下的问题是计算时间或渐近复杂度。 代码如下:
A
答案 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
,通常在您进行详尽搜索时发生,例如检查某些集合的子集。
我认为你的老师想要全面了解你的回溯算法是非常慢的。