针对N个皇后区优化通用回溯算法

时间:2019-01-19 18:37:05

标签: java

对于我的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)?

将很高兴收到我的任何反馈^^

1 个答案:

答案 0 :(得分:2)

您的问题可以用两种方式解释。您是否想降低此问题的算法复杂性,还是想使其运行更快?

降低算法复杂度是行不通的。 N-Queen问题是一个著名的问题,到目前为止,数百万的开发人员已经看到了。为了更好地理解“算法复杂性”一词的含义,我建议阅读一些额外的材料。 this doc +做前两个练习的序言可能是一个好的开始。

使应用程序运行得更快一点是可行的。进一步了解Java并实施一些小技巧,可以为您提供无穷无尽的减少运行时间百分比的方法。在开始之前,您应该设置一个可靠的测试系统(例如JMH)来跟踪您的进度。您可以查看对象分配的详细信息,JIT,内联,变量的大小等。起初可能有些吓人,但这是学习新事物的有趣方式。