2016-07-25 6 views
0

次のアルゴリズムの時間複雑度はどのくらいでしょうか?助けてもらえますか次の配列ダブルルックアップのBig O表記における時間複雑度の計算方法

public class Util 
{ 

    public static int GetDistance(int[] array) 
    { 
     //Find the max seperation of two same numbers inside an array for example 
     // {1,2,4,1,5,9,0,4,15,1,2} should return 9 (position of '1' at 9th and 0th location) 

     int N = array.Length; 
     int maxDistance=0; 
     for (int i = 0; i < N; i++) 
     { 
      for (int j = (N-1); j > i; j--) 
      { 
       if (array[j]==array[i]) 
        if(maxDistance < (j-i)) 
         maxDistance = j- i; 
      }//End of inner for 

     }//End of for 
     System.Console.WriteLine("maxDistance " + maxDistance); 
     return maxDistance ; 
    } //End of Function 

} //End of Class 

答えて

2

内部ループ(一定時間内の操作)を見ます。内部ループは正確にN-1-i回実行されます。

次に、外部ループは、正確にN回実行され、値が増加すると、iとなります。総作業負荷には、体内の実行が含まれます。

(N-1) + (N-2) + (N-3) + ... + 1 

この合計は三角数であり、それが

(N-1).N/2 

これは、O(N²)であると等しいことを示すために、大したことではありません。

+0

それはOのその時の複雑さの表現を意味しているのを持っています(N²)はO((N²-N)/ 2)と同じですか? Then – Ash

+0

もちろん。大きなNの場合、NはN²に比べて無視できる。 –

0

あなたはN回反復する2つのforループを持っています(2つ目はNという意味になりますが、Nは大きく、反復回数は大きくなります)。ループ内で、操作はO

をである(1) だから、完全にあなたはO(1)* O(N^2)= O(N^2)

+0

O(N2)の時間複雑度表現はO((N2-N)/ 2)と同じであることを意味しますか? これは、次のループも同じ複雑さを持ち、サイクルが50%増えるので、big-O表記は良い比較パラメータではないことを意味します。 for (int i = 0; i < N; i++) { for (int j = (N-1); j >=0; j--) // reverse iterating complete array { if (array[j]==array[i]) if(maxDistance < (j-i)) maxDistance = j- i; }//End of inner for }//End of for Ash

+0

Big-Oは、特に大規模なNに向かっています。実際のコードの実績を推論している場合は、**プロファイル**を行う必要があります。入力Nが実際の入力データに対して十分に大きくなく、そのO(N)コードの複雑さがN^2のコストを超えている場合、O(N^2)がO最初のコードで2。例えば、約1e6の整数しか使用せず、C++でのランダム挿入と削除では、(ベクトルミスのため)ダブルリンクリスト(O(N))よりも速く(ベクトルO2(N^2))、ベクトルは、 。 – Ped7g

+0

内側のループは毎回N回反復しません –

関連する問題