2015-04-20 3 views
9

Hallo Ich habe den folgenden CodeAusführungsalgorithmus rekursiv niedrigere Zahl zu suchen, ist sehr langsam

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <string.h> 

#define min(x, y)(x < y)?(x):(y) 
#define SIZE 1000 

int valormenor(int a[], int n) 
{ 
    if(n == 1) 
     return a[0]; 
    else 
     return min(a[0], valormenor(a + 1, n - 1)); 
} 

int main(void) 
{ 
    int arr[SIZE] = {0}, i; 
    srand (time (NULL)); 
    for(i = 0; i < SIZE; i++) 
     arr[i] = rand() % SIZE; 
    arr[5] = -1; 
    printf("%d\n", valormenor(arr, SIZE)); 

    return 0; 
} 

Der Punkt, dass nicht verstehen ist, weil es zu lange dauert die kleinste Zahl zu finden, meine Theorie ist, dass diese rekursive Funktion ist schlecht umgesetzt, Sie behaupten?

+3

Wie langsam ist "sehr langsam"? Aber natürlich haben Sie Recht damit, dass dies ein unglaublich langsamer Weg ist, den minimalen Wert in einem Array zu finden, verglichen mit einer einfachen Schleife, wegen all dem unnötigen Overhead. –

+0

@romkyns können Sie erklären, warum diese Funktion ineffizient ist – Kevin

+1

Ihr Algorithmus ist O (n) ² – xsami

Antwort

15

Lassen Sie uns das min Makro hier erweitern:

return min(a[0], valormenor(a + 1, n - 1)); 

Das

return (a[0] < valormenor(a + 1, n - 1))?(a[0]):(valormenor(a + 1, n - 1)); 

wird Wie Sie sehen können, ist valormenor zweimal aufgerufen. Diese zwei rekursiven Aufrufe machen vier rekursive Aufrufe, die acht rekursive Aufrufe machen, und so weiter. Es ist ein klassischer Doppel-Evaluierungsfehler.

Verwenden Sie keine Makros wie diese. Sie sind einfach nicht die Kopfschmerzen wert.

+3

@Tony: Tu das nicht. Eine Frage pro Frage. – user2357112

+0

Außerdem: das Makro ist nicht richtig geklammert! es sollte '#define MIN (x, y) ((x) <(y))? (x) :(y)' sein. Um die Mehrfachauswertung zu vermeiden, machen Sie es zu einer Funktion. Für die Leistung kann diese Funktion "statisch" oder besser "statisch inline" gemacht werden. – chqrlie