使用回溯的N Queen的时间复杂度?

时间:2014-01-11 06:38:08

标签: c algorithm n-queens

#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);
}

我认为它有时间复杂度:O(n ^ n),因为NQueen函数是递归调用的,但这个程序是否有更紧密的约束?那么最好的情况,最坏的情况时间复杂性。我也对place()函数感到困惑,它是O(k)并从NQueen()调用。

6 个答案:

答案 0 :(得分:10)

答案 1 :(得分:9)

对于您的函数T(n) = n*T(n-1) + O(n^2),其平均时间复杂度为O(N!)

答案 2 :(得分:6)

N-QUEEN问题的时间复杂性

<强>&GT; O(N!)

说明: 如果我们将所有这些添加起来并将运行时间定义为T(N)。然后T(N)= O(N2)+ N * T(N-1)。如果使用此重复绘制递归树,则最终项将类似于n3 + n!O(1)。通过Big O的定义,这可以减少到O(n!)运行时间。

答案 3 :(得分:2)

复杂性是n ^ n,这是解释

这里n表示皇后的数量,并且对于每个函数调用将保持相同。 K是行号,函数将被调用次数,直到k到达n。如果n = 8,我们有n行和n个皇后。

T(n)= n(n + t(k = 1的最大值))= n ^ k,k = n ^ n,因为k的最大值是n。

注意:该函数有两个参数。在循环中,n没有减少,对于每个函数调用它都保持相同。但是对于调用函数的次数,它正在减少,以便递归可以终止。

答案 4 :(得分:1)

O(n ^ n)绝对是使用回溯解决n-queens的上限。 我假设您通过分配女王column-wise来解决这个问题。 但是,考虑到这一点 - 当您在第一列中指定女王的位置时,您有n个选项,之后,您只有n-1个选项,因为您可以将女王放在与第一列相同的行中女王,然后是n-2等等。因此,最坏情况的复杂性仍然受到O(n!)的限制。

希望这可以回答你的问题,即使我已经差不多4年了!

答案 5 :(得分:0)

让我们认为我们的女王是个白痴,这意味着我们无需处理对角线冲突。

在最坏的情况下,这种情况下的时间复杂度将为O(N!),假设我们正在寻找是否存在任何解决方案。这是一个简单的解释。

让我们以N = 4为例。

假设我们要填充二维矩阵。 X代表一个空缺职位,而1代表一个空缺职位。

一开始,答案矩阵(我们需要填写)看起来像

X X X X
X X X X
X X X X
X X X X

让我们逐行填写此内容,这意味着将在每一行中选择一个位置,然后前进到下一行。

对于第一行,由于矩阵中没有任何内容,因此我们有4 options。 对于第二行,我们有3 options,因为已经删除了一行。 同样,对于第三行,我们有2 options,对于最后一行,我们只剩下1 option

总选项= 4*3*2*1 = 24 (4!)

现在,如果我们的女王是车手,情况就是这样,但是由于我们在女王的情况下有更多的限制。就实际操作次数而言,复杂度应小于O(N!)