例如,如果我有一个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网格上的运行时间是多少?
谢谢
答案 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。