2016-04-26 3 views
0

私は擬似コードだ:このアルゴリズムは何をしていますか?

public class Test 
{ 
    public static void main (String[] args) 
    { 
     int A[] = {1,2,3,4,5,6,7,8,9}; 
     int x = 0; 

     for (int i = 1; i < A.length; i++) 
     { 
      for (int j = i + 1; j < A.length; j++) 
      { 
       if (x < Math.abs(A[i] - A[j])) 
       { 
        x = Math.abs(A[i] - A[j]); 
       } 
      } 
     } 
     System.out.println(x); 
    } 
} 

出力は、コード内の配列と7だった:私はそれが何の見え方が実際のコードに変換したことを

Input: Array A with n (= length) >= 2 
Output: x 
x = 0; 
for i = 1 to n do 
    for j = i+1 to n do 
    if x < |A[i] - A[j]| then 
     x = |A[i] - A[j]|; 
    end if 
    end for 
end for 
return x; 

を。 私は別の配列(1から20)を使用していて、putputは18でした。 配列1-30、出力は28でした。 パターンは明らかですが、アルゴリズムは最後の配列値から3分の1を返します。または私は間違っていますか?

+0

仮説を異なる入力でテストしようとしましたか? '[5,5,5,5]'? –

+0

疑似コードはしばしば '1'でループを開始しますが、本当に意味するのは最初の項目です。だからループを '0'で始める – user

+2

なぜ私は1に初期化されますか?これにより、配列の最初の要素が重要にならなくなります。 – LaneL

答えて

5

私は疑似コードは、配列内の任意の2つの要素の違いのうち大きい方を見つけようとします。

実際のコードは0の代わりに1から始まり、したがってこの配列内の最初の要素は除外されます。

+0

*最大の差異は – rocketspacer

0

すべての正の整数を仮定すると、アルゴリズムは簡単に言えば、配列の最大値と最小値の差を求めます。しかし、forループでiを0に初期化しない限り、正しく動作しません。

for (int i = 0; i < A.length; i++) 
2

このコードは、配列内の2つの要素の間で最大の違いを示します。

2つのネストループがあり、それぞれが配列の各要素を実行します。 2番目のループは、最初のループの要素の後の要素から開始されるため、各可能なペアは1回のみとみなされます。

変数xは現在の最大値で、0に初期化されています。 xが現在のペアの差の絶対値よりも小さい場合は、新しい最大値が保存されます。

ただし、擬似コードの開始インデックス1を直接コピーしたため、インデックス0を使用して誤って配列の最初の要素をスキップしています。したがって、Javaコードは、最初の要素を考慮せずに最大の違いを与えています。もし1nの間の値の配列を持っている場合

、あなたはスキップされ、返された値(指数0で)1は、アレイ内の第三の対の最後の値であることを起こるn - 2、です。あなたが別のテストケースとして、配列の値をシャッフルした場合、あなたは今1nの両方がいる限りn自体が第一の位置ではなかったと(考えられるであろうと、戻り値はn - 1に変わっていたことがわかります)。いずれの場合においても

、あなたは最初の要素が考慮されるように0に最初の要素のインデックスを設定する必要があります。次に、{1,2,3,4,5,6,7,8,9}は、8(または、これらの同じ要素の他の順番)を返します。

4

私は擬似コードは、配列内の2つの数字の間に最大の違いを見つけることを試みていると思います。配列の最小値と最大値の差でなければなりません。

私は個人的にはO(n^2)でこのタスクを実行しているので、これは本当に貧弱なアルゴリズムだと思います。配列の最小値と最大値はO(n)にあります。それらの数字と結果の差をとって同じ結果になります。擬似コードを確認してください

Input: Array A with n (= length) >= 2 
min=A[0];max = A[0]; 
for i = 1 to n do 
     if min > A[i] then 
     min = A[i]; 
     end if 
     if max < A[i] then 
     max = A[i] 
     end if 
end for 
return (max-min); 
+0

であり、 'n'は' n^2'の半分ではないので、パフォーマンスの改善は「半分」よりはるかに優れています。 – Andreas

+0

ああ申し訳ありませんが悪いです。 n時間で改善されます。 – denis