如何解决来自 Cracking the Coding Interview 的 N Queens 问题解决方案什么是时间复杂度?
我设法理解了 N-Queens 问题的解决方案,但我对解决方案的时间复杂度有点困惑。我认为总体复杂度为 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;
}
现在的困惑是,根据我的说法,placeQueens
函数的每次调用都需要 O(n^2)
。由于 for loop
运行 n
次,并且在此循环的每次迭代中,我们都执行 O(n)
工作(因为 isSafe
函数也需要 O(n)
时间。所以整体复杂度变为 O(n!*(n^2))
。
我知道这是错误的。请帮助我了解我哪里出错了。
解决方法
您是正确的,每次调用 placeQueens
时它都执行 O(n2) 工作,但因为它只对 safe 方格进行递归调用不与之前的任何冲突,远远少于n!已拨打电话。
顶级调用将尝试顶行的每个方格并进行n次递归调用,但如果n非常大,则几乎所有第一个方格的选择都会排除3 下一行的选项,而不是 1。同样,在几乎所有的第 2 行选择之后,6 个方格将被排除在第 3 行。
如果 C(n) 是 nxn 板的调用次数,那么 C(n) 将不会离 n(n-3)(n-6) 太远...
当然我们有 C(n) 比任何多项式都快。
因此,只要每次调用 placeQueens
都做了多项式的工作,那么复杂度肯定在 O(n!) 中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。