蛮力阵列遍历的复杂性

时间:2011-07-03 09:32:09

标签: algorithm complexity-theory big-o traversal

例如,如果我有一个4x4网格,我想从一个任意的单元格(i,j)开始,然后想要沿着每条路径行进而不会越过自己,那么复杂性(大o)是多少?我写了以下代码:

traverse(int[][]grid, int i, int j, boolean[][] visited){
    for(int x = -1; x<=1; x++){
       for(int y=-1; y<=1; y++){
           if(inBounds(grid, i+x, j+y), !visited[i+x][j+y]){
              traverse(grid, i+x, j+y, copyOfAndSet(visited, i+x, j+y));
           }
       }
    }
}

假设inBounds存在并且copyOfAndSet存在并且是O(1)(不是O(n * n)),因为我已经通过按位运算实现了这一点,但为了清楚起见,这里使用了一个布尔数组。

上述算法在NxN网格上的运行时间是多少?

谢谢

2 个答案:

答案 0 :(得分:2)

首先你的算法可以对角地遍历,我不确定你想要的是什么......第二:它应该首先访问起始节点(做一个copyOfAndSet),但你的算法首先移动到方向(-1 ,-1)。

当遍历数组时,算法访问每个节点,并且在每个节点中它检查9个邻居(它应该检查8个BTW,(0,0)没有意义)。对于NxN网格,这是9 * N * N或只是O(N^2)如果copyOfAndSet确实复制了数组,那么每个单元格的N * N都可以工作,因此它是O(N^4)

答案 1 :(得分:1)

如果我理解您的问题,您想要在2D网格上枚举所有自我避免行走。 (你说“沿着每条路径行进而不会越过我自己”)

您可以通过Google搜索这些关键字找到几篇关于此的论文。

http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.8.5913

根据该论文,问题似乎是#P-complete。