对于我的N Queens问题解决者,我当前正在使用回溯,并且运行时平均达到7毫秒。但是,我希望进一步优化回溯,以使其具有更好的时间复杂度。
public boolean solveQueen( int col) {
if(col == qColumn) {
solveQueen(col +1);
}
if(col >= board.length) {
printBoard();
System.out.println();
return true;
}
for(int i = 0; i < board.length; i++)
if(notUnderAttack(i,col))
{
placeQ(i,col);
solveQueen(col +1);
removeQ(i, col);
}
return false;
}
从我读到的内容来看,N个皇后回溯的时间复杂度为O(N!),但是由于我的回溯,我跳过了一个列,因为我先放置了一个皇后,所以不应该将其设为O (N!-1)?
将很高兴收到我的任何反馈^^
答案 0 :(得分:2)
您的问题可以用两种方式解释。您是否想降低此问题的算法复杂性,还是想使其运行更快?
降低算法复杂度是行不通的。 N-Queen问题是一个著名的问题,到目前为止,数百万的开发人员已经看到了。为了更好地理解“算法复杂性”一词的含义,我建议阅读一些额外的材料。 this doc +做前两个练习的序言可能是一个好的开始。
使应用程序运行得更快一点是可行的。进一步了解Java并实施一些小技巧,可以为您提供无穷无尽的减少运行时间百分比的方法。在开始之前,您应该设置一个可靠的测试系统(例如JMH)来跟踪您的进度。您可以查看对象分配的详细信息,JIT,内联,变量的大小等。起初可能有些吓人,但这是学习新事物的有趣方式。