微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

来自 Cracking the Coding Interview 的 N Queens 问题解决方案什么是时间复杂度?

如何解决来自 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 举报,一经查实,本站将立刻删除。