【问题标题】:Time complexity of N Queen using backtracking?使用回溯的 N Queen 的时间复杂度?
【发布时间】:2014-01-11 06:38:07
【问题描述】:
#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 函数是递归调用的,但是这个程序有没有更严格的界限?最好的情况和最坏的情况时间复杂度怎么样。我也对 O(k) 和从 NQueen() 调用的 place() 函数感到困惑。

【问题讨论】:

    标签: c algorithm n-queens


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      对于您的函数T(n) = n*T(n-1) + O(n^2),它大约转换为O(N!) 时间复杂度。

      【讨论】:

      • 请解释一下 O(n^2) 是怎么来的?
      • @tan 在 if 语句中你正在检查 place() 这是 O(N) 并且 for 循环是 O(N) 因此 O(N^2)。
      • @nhahtdh O(N!)
      • @VikramBhat:对不起,我在脑海中展开并犯了一个错误。评论已删除。
      • 你提到了Avalage?那么最坏情况的时间复杂度是多少?请帮忙
      【解决方案3】:

      N-QUEEN 问题的时间复杂度是

      > O(N!)

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

      【讨论】:

      • 请解释原因。
      • 如果我们将所有这些加起来并将运行时间定义为 T(N)。那么 T(N) = O(N2) + N*T(N-1)。如果您使用此递归绘制递归树,则最终项将类似于 n3+ n!O(1)。根据 Big O 的定义,这可以减少到 O(n!) 的运行时间。
      【解决方案4】:

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

      希望这能回答你的问题,即使我迟到了将近 4 年!

      【讨论】:

        【解决方案5】:

        复杂度为n^n,这里是解释

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

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

        注意:该函数有两个参数。在循环中,n不递减,对于每个函数调用它都保持不变。但是对于函数被调用的次数,它是递减的,因此递归可以终止。

        【讨论】:

          【解决方案6】:

          让我们考虑一下我们的女王是一个,这意味着我们不需要处理对角线冲突。

          这种情况下的时间复杂度在最坏的情况下将是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!)

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-20
            • 1970-01-01
            • 2018-01-21
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多