2016-03-23 6 views
1

配列は、bruteforceθ(n2)と比較して、アルゴリズムθ(nlogn)[ソーティング+最小距離の発見]を作成するために事前にソートされています。どちらのコードも同じ仕事をしますが、最初のコードは時間制限を超えています。私はエラーが何であるのだろうか。コード内のバグはありますか? forループを使用してループ(時間制限を超過)n個の数字の配列内の2つの最も近い数字の間の距離を求める。 (Presorted Arrays)


#include <stdio.h> 

void mindistance(int a[],int n) 
{ 
    int i=1,arraymin=999,currentmin,current=a[0]; 

    while(i<n) 
    { 
     if(a[i]==current) 
      i++; 
     else 
     { 
      currentmin=a[i]-a[i-1]; 
      if(currentmin<arraymin) 
      { 
       arraymin=currentmin; 
       current=a[i]; 
       i++; 
      } 

     } 
    } 
    printf("%d",arraymin); 
} 


int main(void) 
{ 

    int a[]={4,34,56,77,99,424,754}; 
    mindistance(a,7); 

    return 0; 
} 

コードは(うまく動作)しながら、と

コード


#include <stdio.h> 

void mindistance(int a[],int n) 
{ 
    int i,arraymin=999,currentmin,current=a[0],x,y; 

    for(i=1;i<n;i++) 
    { 
     if(a[i]==current) 
      continue; 
     else 
     { 
      currentmin=a[i]-a[i-1]; 
      if(currentmin<arraymin) 
      { 
       arraymin=currentmin; 
       current=a[i]; 

      } 

     } 
    } 
    printf("%d",arraymin); 
} 


int main(void) 
{ 

    int a[]={4,34,56,77,99,424,754}; 
    mindistance(a,7); 

    return 0; 
} 
+1

「i ++」は常に起こるはずです。したがって、whileループでは、ループの最初のものか、ループの最後のもののどちらかとしてください。 if文ではしないでください。どんなところでも、もしあなたがテストでそれをやろうとするなら、 'if(currentmin

+0

これはうまくいった。 if-else節の後の一般的なi ++ステートメントしかし、なぜ私は別のI ++インクリメントで早く動かなかったのですか? –

答えて

1

ループは同一ではありません。 forループでは、各繰り返しでiが増加し、whileループではiが増加することがあります。同じwhileループは次のようになります。

while(i<n) 
{ 
    if(a[i]==current) 
     i++; 
    else 
    { 
     currentmin=a[i]-a[i-1]; 
     if(currentmin<arraymin) 
     { 
      arraymin=currentmin; 
      current=a[i]; 
     } 
     i++; 
    } 
} 
+0

しかし、if節の中で私が増分できない理由は分かりません。他の変数と同様にその権利ですか?またはif-else句のみに一致するようにインクリメントする必要がありますか? –

+0

できます。しかしwhileコードでは、else節を入力する反復ではiをインクリメントしないが、currentmin> = arraymin(したがって、2番目のif節は入力せず、iはインクリメントされません)と書いています。あなたが書いたforループでは、すべての反復で(たとえcurrentmin> = arrayminであっても)私は増分されます。 –

+0

ええ、それは気づいた...ありがとう。 –

0

私はあなたがいると信じて無限ループに巻き込まれてしまうのは、反復ごとに電流値を設定する。

+0

if-else節の後に一般的なi ++ステートメントを使用しました。しかし、なぜ私は別のI ++インクリメントで早く動かなかったのですか? –