Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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