2016-03-23 6 views
1

Die Arrays sind vorsortiert, wodurch der Algorithmus θ (nlogn) [Sortieren + Minimaler Abstand finden] im Vergleich zur Bruteforce θ (n2) erstellt wird. Beide Codes machen die gleiche Arbeit, aber die erste zeigt das Zeitlimit überschritten. Ich frage mich, was der Fehler ist. Irgendein Fehler im Code?Den Abstand zwischen den beiden nächsten Zahlen in einem Array von n Zahlen finden. (Vorsortierte Arrays)

Code mit while-Schleife (Zeitlimit überschritten)


#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; 
} 

-Code for-Schleife (funktioniert gut)


#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 ++' sollte immer passieren. Also, in der while-Schleife entweder als erstes in der Schleife oder als letztes in der Schleife. Tu es nicht in den if-Anweisungen. Was auch immer, es gibt noch ein anderes 'if (currentmin

+0

Das hat funktioniert. Allgemeine i ++ - Anweisung nach der if-else-Klausel. Aber warum funktionierte es nicht früher mit separatem i ++ - Inkrement? –

Antwort

1

Loops sind nicht identisch. In der for-Schleife wird i in jeder Iteration erhöht, während in der while-Schleife i nur in einigen Fällen erhöht wird. Eine identische While-Schleife wäre:

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

Aber ich verstehe nicht, warum wir nicht innerhalb der if-Klausel inkrementieren können? Es ist genau wie jede andere Variable, oder? Oder sollte es nur mit der passenden if-else-Klausel inkrementiert werden? –

+0

Sie können. Aber in dem while-Code, den Sie geschrieben haben, inkrementieren Sie I nicht in Iterationen, in denen Sie die else-Klausel eingeben, sondern currentmin> = arraymin (daher geben Sie die zweite if-Klausel nicht ein und i wird nicht inkrementiert). In der for-Schleife, die Sie geschrieben haben, wird i in jeder Iteration inkrementiert (selbst wenn currentmin> = arraymin). –

+0

Yeah hat das bemerkt..Danke. –

0

Ich glaube, du bist sich in einer Endlosschleife verfangen, weil du nicht bist t Setzen von Stromwerten bei jeder Iteration.

+0

Arbeitete mit der allgemeinen i ++ - Anweisung nach der if-else-Klausel. Aber warum funktionierte es nicht früher mit separatem i ++ - Inkrement? –