C++ N皇后问题解决方案,来自破解编码面试。时间复杂度是多少?

C++ N皇后问题解决方案,来自破解编码面试。时间复杂度是多少?,c++,algorithm,data-structures,time-complexity,n-queens,C++,Algorithm,Data Structures,Time Complexity,N Queens,我设法理解了N皇后问题的解决方案,但对于解决方案的时间复杂性,我有点困惑。我认为总体复杂性将是O(n!*(n^2))。我知道这是错误的。请帮忙 void placeQueens(int row, vector<int> &columns,int n, vector<vector<int>>&ans) { if(row==n) { ans.push_back(columns); return;

我设法理解了N皇后问题的解决方案,但对于解决方案的时间复杂性,我有点困惑。我认为总体复杂性将是
O(n!*(n^2))
。我知道这是错误的。请帮忙

void placeQueens(int row, vector<int> &columns,int n, vector<vector<int>>&ans)
{      
   if(row==n)
   {
       ans.push_back(columns);
       return;
   }

   for(int col=0;col<n;col++)
   { 
       //O(n) time, the checking take O(n) time
       if(isSafe(row,col,columns))
       { 
           columns[row]=col;
           placeQueens(row+1,columns,n,ans);
       }
   }        
}


bool isSafe(int r1,int c1, vector<int>&columns)
{  
   //check if r1,c1 is safe to place a queen or not
   for(int row=0; row<r1 ; row++)
   {            
       if(columns[row] == c1)
       { 
           //same column 
           return false;
       }
       if(abs(columns[row]-c1) == abs(row-r1))
       { 
           //same diagonal
           return false;
       }   
   }

   return true;
}
void placequeen(int行、向量和列、int n、向量和ans)
{      
如果(行==n)
{
ans.push_back(列);
返回;
}

对于(int col=0;col来说,它对
placeQueens
的每次调用都起O(n2)作用,这是正确的,但是因为它只对安全平方进行递归调用,而这些安全平方与以前的安全平方不冲突,所以所进行的调用远远少于n个

顶层调用将尝试顶行中的每个方块,并进行n递归调用,但如果n非常大,则第一个方块的几乎所有选择都将排除下一行的3选择,而不是1。同样,在第二行的几乎所有选择之后,6方块将被排除在外在第三场比赛中获胜

如果C(n)是对nxn板的调用次数,那么C(n)与n(n-3)(n-6)的距离不会太远

当然我们有C(n)
因此,只要每次调用
placeQueens
都做了多项式量的工作,那么复杂性肯定在O(n!)。

当使用大O时,除最大值外的其他项都会被删除。是的,但是当它们是加法时,我们会删除高阶项。比如
O(n!+(n^2))
会变成
O(n!)
。但这里有
O(n!*(n^2))
。请帮助我了解是否还有其他需要考虑的问题。
当使用大O时,除最大O以外的术语往往会被删除。
。这是完全正确的。只是,这里只有一些因素,所以我们不会删除任何内容。很抱歉前面的回答错误。它不会减少到
O(n^2*n!)
。它有一个形式为
T(n)=n*T(n-1)+O(n^2)
的递归关系,它不会简化为
O(n^2*n!)
。这里有一个链接来进行更多说明:codesdope.com/course/algorithms-backtracking