C 使用回溯的N皇后的时间复杂度? #包括 #包括 无效印刷板(int n); void fourQueen(int k,int n); int地点(int k,int i); int x[100]; 无效n(整数k,整数n) { int i; 对于(i=1;i
有许多优化可以提高算法的时间复杂度 这些链接中有更多信息:C 使用回溯的N皇后的时间复杂度? #包括 #包括 无效印刷板(int n); void fourQueen(int k,int n); int地点(int k,int i); int x[100]; 无效n(整数k,整数n) { int i; 对于(i=1;i,c,algorithm,n-queens,C,Algorithm,N Queens,有许多优化可以提高算法的时间复杂度 这些链接中有更多信息: 对于你的函数T(n)=n*T(n-1)+O(n^2),它大约转化为O(n!)时间复杂度。复杂度是n^n,下面是解释 这里n表示皇后的数量,并且对于每个函数调用都保持不变。 K是行号,函数将被多次调用,直到K到达n。如果n=8,我们有n行和n个皇后 T(n)=n(n+T(k-1的最大值))=n^k的最大值=n^n,因为k的最大值是n 注意:函数有两个参数。在循环中,n不是递减的,对于每个函数调用,它都保持不变。但是函数调用的次数是递减
对于你的函数
T(n)=n*T(n-1)+O(n^2)
,它大约转化为O(n!)
时间复杂度。复杂度是n^n,下面是解释
这里n表示皇后的数量,并且对于每个函数调用都保持不变。
K是行号,函数将被多次调用,直到K到达n。如果n=8,我们有n行和n个皇后
T(n)=n(n+T(k-1的最大值))=n^k的最大值=n^n,因为k的最大值是n
注意:函数有两个参数。在循环中,n不是递减的,对于每个函数调用,它都保持不变。但是函数调用的次数是递减的,以便递归可以终止。O(n^n)肯定是使用回溯求解n皇后的上限。
我假设你是通过指派一个女王来解决这个问题的。
但是,考虑一下这一点——当你在第一列中分配皇后的位置时,你有N个选项,之后,你只有N-1选项,因为你不能将皇后放置在与第一皇后相同的行中,然后N-2等等。因此,最坏情况的复杂性仍然由O(n)。
希望这能回答你的问题,即使我迟到了将近4年!N-QUEEN问题的时间复杂性是 >O(N!) 说明:
如果我们将所有这些加起来,并将运行时间定义为T(N)。然后T(N)=O(N2)+N*T(N-1)。如果使用此递归绘制递归树,最后的项将类似于n3+N!O(1)。根据大O的定义,这可以减少为O(N!)运行时间。
让我们考虑我们的皇后是一个强> RO/<强>,这意味着我们不需要关心对角线冲突。
在这种情况下,时间复杂度将是O(N!)
,在最坏的情况下,假设我们正在搜索,以检查是否存在任何解决方案。下面是一个简单的解释
让我们举一个例子,其中N=4
假设我们要填充二维矩阵。X
表示一个空缺职位,而1
表示一个空缺职位
在开始时,答案矩阵(我们需要填写)如下所示:
#include<stdio.h>
#include<math.h>
void printboard(int n);
void fourQueen(int k,int n);
int place(int k,int i);
int x[100];
void NQueen(int k,int n)
{
int i;
for(i=1;i<=n;i++)
{
if(place(k,i)==1)
{ x[k]=i;
if(k==n)
{
printf("Solution\n");
printboard(n);
}
else
NQueen(k+1,n);
}
}
}
int place(int k,int i)
{
int j;
for(j=1;j<k;j++)
{
if((x[j]==i)||abs(x[j]-i)==abs(j-k))
return 0;
}
return 1;
}
void printboard(int n)
{
int i;
for(i=1;i<=n;i++)
printf("%d ",x[i]);
}
void main()
{
int n;
printf("Enter Value of N:");
scanf("%d",&n);
NQueen(1,n);
}
让我们按行填充,这意味着将在每行中选择一个位置,然后前进到下一行
对于第一行,由于整个矩阵中没有填充任何内容,因此我们有4个选项
。
对于第二行,我们有3个选项
,因为其中一行已经被删除。
类似地,对于第三行,我们有2个选项
,对于最后一行,我们只剩下1个选项
总选项=4*3*2*1=24(4!)
现在,如果我们的皇后是一辆车,情况就是这样,但是因为我们在皇后的情况下有更多的限制。就实际操作数而言,复杂性应该小于
O(N!)
。请解释一下O(N^2)是如何来的?@tan在if语句中,u正在检查place(),它是O(N),for循环是O(N),因此是O(N^2)@nhahdh O(N!)X X X X
X X X X
X X X X
X X X X