2016-04-12 3 views
-1

J'étudie ce livre depuis hier et après avoir compris et appliqué le premier algorithme, j'ai essayé d'aller seul et de regarder différemment. Voici, en Java, l'algorithme montré:Pourquoi mon algorithme de tri est-il plus rapide que celui de "Introduction to Algorithms" de H.Cormen?

public static int[] sort(int[] array) 
{ 
    for(int i = 1; i < array.length; i++){ 
     int value = array[i]; 
     int j = i - 1; 

     while(j >= 0 && array[j] > value){ 
      array[j + 1] = array[j]; 
      j--; 
     } 
     array[j+1] = value; 
    } 

    return array; 
} 

Et voici le mien:

public static int[] sortb(int[] array) 
{ 
    for(int i = 0; i < array.length; i++){ 
     int value = array[i]; 
     int j = i; 

     while(j < array.length && value > array[j]){ 
      array[j] = array[j + 1]; 
      j++; 
     } 

     array[j] = value; 
    } 

    return array; 
} 

Pour 1 million d'appel de fonction pour chacun, je suis arrivé 32 ms pour le premier et 25 ms pour la deuxième . Je commence toujours avec des algorithmes, donc je n'ai aucune idée de la signification.

+0

Cela n'a pas vraiment de sens. Je passerais plus de temps à me concentrer sur les algorithmes et moins sur la mesure de leur vitesse. Si vous ne savez pas comment faire des mesures correctement, vous pouvez obtenir toutes sortes de résultats et perdre votre temps à essayer de trouver un sens là où il n'y a pas de sens. – Kayaman

+0

@FarazDurrani Je suis à peu près sûr que lorsque les professeurs enseignent des algorithmes, ils sont plus intéressés par le 'Big O' que les millisecondes obtenues par de mauvaises mesures. – Kayaman

+0

Je ne travaille pas avec le professeur, mais sur mon propre – Despirithium

Répondre

6

J'ai trouvé pourquoi votre tri est tellement plus rapide que l'original: Parce que vous ne faites rien du tout.

Dans votre code

int value = array[i]; 
    int j = i; 

    while(j < array.length && value > array[j]) { ... } 

Parce que j = i, donc value == array[j] avant d'entrer dans la boucle while, et donc votre corps de la boucle while ne sera jamais exécutée. Votre résultat de tri sera erroné. C'est la raison principale pour laquelle votre code est extrêmement rapide.

+0

Eh bien, j'ai honte. Merci d'avoir remarqué ça! – Despirithium

+0

doivent être rejetés .... –

5

Dans mon expérience (lire expérience de l'étudiant) ce genre de différentes valeurs ont peu de signification. Peut-être que vous avez eu un processus d'arrière-plan qui a pris/libéré un peu plus de ressources de l'un à l'autre. Peut-être que le cas spécifique que vous avez essayé d'organiser était meilleur pour l'un des algorithmes que pour l'autre.

Peut-être, si vous avez utilisé différents tableaux au hasard, l'un d'entre eux était plus proche d'être triés que l'autre ..

Pour avoir de bonnes mesures, vous devez généralement faire beaucoup de tests, non seulement un. Par exemple, générer des tableaux de 1k 10k éléments chacun et chacun de trier ce tableau avec les deux algorythmes ..

Quoi qu'il en soit, parfois spécifiques caractéristiques d'une langue ou d'un compilateur peut générer des résultats différents pour algorythmes avec théoriquement la même complexité exacte (un exemple: une fois que j'ai remarqué en C++ si vous traversez un tableau bidimensionnel d'abord par des colonnes puis par des lignes, vous aurez une vitesse très différente que si vous le faites dans l'autre sens, mais je ne me souviens pas était plus rapide tbh).

+1

Si vous voulez dire 'a [10] [10]' tel tableau C++ bidimensionnel, il sera plus rapide si vous traversez avec la boucle externe est 'a [0-9]' et la boucle interne est 'a [i] [ 0-9] 'parce que' a [i] [0-9] 'devrait être séquentiellement placé en mémoire. – Nier