diff --git a/TP8/analyse_tris.csv b/TP8/analyse_tris.csv new file mode 100644 index 0000000000000000000000000000000000000000..0f380e82d21b1aec67aa52613b766d849c4d529c --- /dev/null +++ b/TP8/analyse_tris.csv @@ -0,0 +1,102 @@ +taille;"tri séléction";"tri insertion" + 0; 0.00; 0.00 + 1; 0.00; 0.00 + 2; 1.00; 1.00 + 3; 3.00; 2.76 + 4; 6.00; 4.82 + 5; 10.00; 7.52 + 6; 15.00; 11.22 + 7; 21.00; 15.06 + 8; 28.00; 19.92 + 9; 36.00; 23.42 + 10; 45.00; 28.42 + 11; 55.00; 35.60 + 12; 66.00; 41.88 + 13; 78.00; 47.32 + 14; 91.00; 56.94 + 15; 105.00; 64.18 + 16; 120.00; 70.92 + 17; 136.00; 82.80 + 18; 153.00; 92.20 + 19; 171.00; 102.88 + 20; 190.00; 109.10 + 21; 210.00; 124.82 + 22; 231.00; 130.18 + 23; 253.00; 146.66 + 24; 276.00; 161.96 + 25; 300.00; 169.40 + 26; 325.00; 179.54 + 27; 351.00; 201.26 + 28; 378.00; 212.50 + 29; 406.00; 224.52 + 30; 435.00; 245.34 + 31; 465.00; 260.58 + 32; 496.00; 271.32 + 33; 528.00; 295.56 + 34; 561.00; 307.54 + 35; 595.00; 334.18 + 36; 630.00; 358.66 + 37; 666.00; 367.52 + 38; 703.00; 380.28 + 39; 741.00; 410.68 + 40; 780.00; 418.60 + 41; 820.00; 455.84 + 42; 861.00; 463.90 + 43; 903.00; 486.88 + 44; 946.00; 501.62 + 45; 990.00; 546.30 + 46; 1035.00; 562.72 + 47; 1081.00; 590.30 + 48; 1128.00; 616.72 + 49; 1176.00; 623.34 + 50; 1225.00; 666.34 + 51; 1275.00; 674.36 + 52; 1326.00; 713.56 + 53; 1378.00; 734.34 + 54; 1431.00; 769.80 + 55; 1485.00; 780.88 + 56; 1540.00; 833.92 + 57; 1596.00; 844.72 + 58; 1653.00; 890.36 + 59; 1711.00; 914.04 + 60; 1770.00; 939.12 + 61; 1830.00; 975.28 + 62; 1891.00; 1026.10 + 63; 1953.00; 1023.50 + 64; 2016.00; 1064.12 + 65; 2080.00; 1089.02 + 66; 2145.00; 1156.74 + 67; 2211.00; 1169.76 + 68; 2278.00; 1213.86 + 69; 2346.00; 1217.68 + 70; 2415.00; 1242.02 + 71; 2485.00; 1317.76 + 72; 2556.00; 1313.18 + 73; 2628.00; 1363.12 + 74; 2701.00; 1418.40 + 75; 2775.00; 1466.94 + 76; 2850.00; 1496.98 + 77; 2926.00; 1540.84 + 78; 3003.00; 1581.18 + 79; 3081.00; 1583.32 + 80; 3160.00; 1653.38 + 81; 3240.00; 1701.74 + 82; 3321.00; 1769.40 + 83; 3403.00; 1774.48 + 84; 3486.00; 1828.00 + 85; 3570.00; 1857.48 + 86; 3655.00; 1899.12 + 87; 3741.00; 1926.82 + 88; 3828.00; 2014.10 + 89; 3916.00; 2011.46 + 90; 4005.00; 2048.14 + 91; 4095.00; 2110.86 + 92; 4186.00; 2201.62 + 93; 4278.00; 2229.68 + 94; 4371.00; 2297.28 + 95; 4465.00; 2349.78 + 96; 4560.00; 2348.66 + 97; 4656.00; 2444.30 + 98; 4753.00; 2462.70 + 99; 4851.00; 2497.82 +100; 4950.00; 2573.92 diff --git a/TP8/analyse_tris2.py b/TP8/analyse_tris2.py new file mode 100755 index 0000000000000000000000000000000000000000..7946ec383689160df1b1cd1fbf3d24568783fb95 --- /dev/null +++ b/TP8/analyse_tris2.py @@ -0,0 +1,90 @@ +#!/usr/bin/python3 +# -*- coding: utf-8 -*- + +""" +:mod:`analyse_tris` module +:author: FIL - Faculté des Sciences et Technologies - Univ. Lille <http://portail.fil.univ-lille1.fr>_ +:date: janvier 2017 +:dernières révisions: février 2018, février 2019 + +Analyse empirique des tris + +""" +from random import shuffle +from typing import Callable +from compare import compare +from ap_decorators import count +from tris import * +from functools import cmp_to_key + +################################################ +# ANALYSE EMPIRIQUE DES TRIS # +################################################ + +# ajout d'un compteur à la fonction compare +compare = count(compare) + +def analyser_tri(tri: Callable[[list[T], Callable[[T, T], int]], NoneType], + nbre_essais: int, + taille: int) -> float: + """ + renvoie: le nombre moyen de comparaisons effectuées par l'algo tri + pour trier des listes de taille t, la moyenne étant calculée + sur n listes aléatoires. + précondition: n > 0, t >= 0, la fonc + """ + res = 0 + for i in range(nbre_essais): + compare.counter = 0 + l = [k for k in range(taille)] + shuffle(l) + tri(l, compare) + res += compare.counter + return res / nbre_essais + +def tri_sort(l: list[T], compare: Callable[[T, T], int]) -> None: + l.sort(key = cmp_to_key(compare)) + + +if (__name__ == '__main__'): + from matplotlib import pyplot as plt + + # Calcul de nombres moyens de comparaison pour des listes + # de tailles comprises entre 0 et TAILLE_MAX + NB_ESSAIS = 50 + TAILLE_MAX = 100 + c_select = [0.0] * (TAILLE_MAX + 1) + c_insert = [0.0] * (TAILLE_MAX + 1) + c_sort = [0.0] * (TAILLE_MAX + 1) + + for t in range(TAILLE_MAX + 1): + c_select[t] = analyser_tri(tri_select, 1, t) + # inutile de moyenner pour le tri par sélection + c_insert[t] = analyser_tri(tri_insert, NB_ESSAIS, t) + c_sort[t] = analyser_tri(tri_sort, NB_ESSAIS, t) + + + + # Sauvegarde des données calculées dans un fichier au format CSV + prem_ligne = 'taille;"tri séléction";"tri insertion"\n' + ligne = '{:3d};{:8.2f};{:8.2f}\n' + with open('analyse_tris.csv', 'wt', encoding='utf8') as sortie: + sortie.write(prem_ligne) + for t in range(TAILLE_MAX + 1): + sortie.write(ligne.format(t, + c_select[t], + c_insert[t], + )) + + # Représentation graphique + plt.plot(list(range(TAILLE_MAX + 1)), c_select, 'b.', label='Tri sélection') + plt.plot(list(range(TAILLE_MAX + 1)), c_insert, 'r.', label='Tri insertion') + plt.plot(list(range(TAILLE_MAX + 1)), c_sort, 'g.', label='Tri sort') + plt.title('Tris : nbre de comparaisons') + plt.legend() + plt.xlabel('n = taille des listes') + plt.ylabel('c(n) = nbre de comparaisons') + plt.savefig('tris_nbcomp.png') + plt.show() + + diff --git a/TP8/tris_nbcomp.png b/TP8/tris_nbcomp.png new file mode 100644 index 0000000000000000000000000000000000000000..23313899895a26ae5533235b6f36fccd0aba9d48 Binary files /dev/null and b/TP8/tris_nbcomp.png differ