C++ N皇后问题解决方案,来自破解编码面试。时间复杂度是多少?
我设法理解了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;
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