web-dev-qa-db-ja.com

バックトラッキングを使用したN Queenの時間の複雑さ

#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()関数についても混乱しています。

11
tanmoy

アルゴリズムの時間の複雑さを改善できるほど多くの最適化があります。

これらのリンクには詳細情報があります。

  1. https://sites.google.com/site/nqueensolver/home/algorithm-results

  2. https://sites.google.com/site/nqueensolver/home/algorithms/2backtracking-algorithm

Snapshot

10
Juan Ramirez

For Your function T(n) = n*T(n-1) + O(n^2)これは、平均でO(N!)時間の複雑さに変換されます。

9
Vikram Bhat

N QUEEN問題の時間の複雑さは

> O(N!)

説明:これらをすべて加算して、ランタイムをT(N)として定義する場合。次にT(N) = O(N2) + N * T(N-1)。この繰り返しを使用して再帰ツリーを描画する場合、最後にtermはn3 + n!O(1)のようになりますBig Oの定義により、これはO(n!)実行時間に短縮できます。

7
Shyam Bhimani

複雑さはn ^ nで、ここに説明があります

ここで、nはクイーンの数を表し、すべての関数呼び出しで同じままです。 Kは行番号であり、kがnに達するまで関数が呼び出されます。n= 8の場合、n行とnクイーンがあります。

Tの最大値はnなので、T(n)= n(n + t(kの最大値-1))= nの最大値= n ^ n.

注:関数には2つのパラメーターがあります。ループでは、nは減少しません。関数呼び出しごとに同じままですが、関数が呼び出される回数は減少しているため、再帰を終了できます。

2
aman_41907

O(n ^ n)は、バックトラッキングを使用してnクイーンを解く際の上限です。クイーン 列方向 を割り当てることでこれを解決していると仮定しています。ただし、これを考慮してください-最初の列にクイーンの場所を割り当てると、n個のオプションがあります。その後、最初のクイーンと同じ行にクイーンを配置できないため、n-1個のオプションしかありません。次にn-2など。したがって、最悪の場合の複雑さはまだO(n!)によって上限があります。

私はほぼ4年遅れていますが、これがあなたの質問に答えることを願っています!

2
Akshay

私たちの女王がrookであると考えてみましょう。これは、対角線の競合を処理する必要がないことを意味します。

この場合の時間の複雑さは、最悪の場合O(N!)になります。これは、ソリューションが存在するかどうかを確認するために狩りをしていた場合に想定されます。以下に簡単な説明を示します。

N = 4の例を見てみましょう。

2次元行列を塗りつぶしたいとします。 Xは空いているポジションを表し、_1_は取得したポジションを表します。

最初は、回答マトリックス(入力する必要があります)は次のようになります。

_X X X X
X X X X
X X X X
X X X X
_

これを行ごとに入力してみましょう。つまり、各行で1つの場所を選択し、次の行に進みます。

最初の行については、マトリックス全体に何も書き込まれていないため、_4 options_があります。 2番目の行には、1つの行が既に削除されているため、_3 options_があります。同様に、3番目の行には_2 options_があり、最後の行には_1 option_だけが残っています。

合計オプション= 4*3*2*1 = 24 (4!)

さて、これは私たちの女王がルークだった場合に当てはまりましたが、女王の場合にはより多くの制約があるためです。複雑さは、実際の操作数に関してO(N!)より小さくする必要があります。

0
Mohit Gupta