diff --git a/TP7/analyse-tris/analyse_tris.csv b/TP7/analyse-tris/analyse_tris.csv new file mode 100644 index 0000000000000000000000000000000000000000..b679da25df8ac52db9fc3d28e2673e75f7f28072 --- /dev/null +++ b/TP7/analyse-tris/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.62 + 4; 6.00; 4.90 + 5; 10.00; 7.54 + 6; 15.00; 10.90 + 7; 21.00; 14.56 + 8; 28.00; 19.96 + 9; 36.00; 23.84 + 10; 45.00; 29.12 + 11; 55.00; 35.24 + 12; 66.00; 42.72 + 13; 78.00; 48.12 + 14; 91.00; 55.06 + 15; 105.00; 64.22 + 16; 120.00; 72.72 + 17; 136.00; 82.22 + 18; 153.00; 91.08 + 19; 171.00; 100.86 + 20; 190.00; 109.80 + 21; 210.00; 116.96 + 22; 231.00; 136.72 + 23; 253.00; 142.74 + 24; 276.00; 154.70 + 25; 300.00; 172.60 + 26; 325.00; 185.50 + 27; 351.00; 197.92 + 28; 378.00; 213.90 + 29; 406.00; 228.38 + 30; 435.00; 242.74 + 31; 465.00; 264.10 + 32; 496.00; 273.96 + 33; 528.00; 297.28 + 34; 561.00; 308.94 + 35; 595.00; 328.56 + 36; 630.00; 347.48 + 37; 666.00; 369.30 + 38; 703.00; 386.26 + 39; 741.00; 417.00 + 40; 780.00; 429.88 + 41; 820.00; 438.68 + 42; 861.00; 476.60 + 43; 903.00; 490.30 + 44; 946.00; 514.28 + 45; 990.00; 535.98 + 46; 1035.00; 546.88 + 47; 1081.00; 598.08 + 48; 1128.00; 605.58 + 49; 1176.00; 639.08 + 50; 1225.00; 651.50 + 51; 1275.00; 689.16 + 52; 1326.00; 712.04 + 53; 1378.00; 746.86 + 54; 1431.00; 768.66 + 55; 1485.00; 794.12 + 56; 1540.00; 819.04 + 57; 1596.00; 854.84 + 58; 1653.00; 890.52 + 59; 1711.00; 931.04 + 60; 1770.00; 951.98 + 61; 1830.00; 968.66 + 62; 1891.00; 1008.38 + 63; 1953.00; 1037.84 + 64; 2016.00; 1090.42 + 65; 2080.00; 1080.92 + 66; 2145.00; 1127.48 + 67; 2211.00; 1188.08 + 68; 2278.00; 1207.70 + 69; 2346.00; 1225.60 + 70; 2415.00; 1281.40 + 71; 2485.00; 1313.32 + 72; 2556.00; 1353.52 + 73; 2628.00; 1379.60 + 74; 2701.00; 1422.80 + 75; 2775.00; 1469.98 + 76; 2850.00; 1506.84 + 77; 2926.00; 1535.16 + 78; 3003.00; 1578.44 + 79; 3081.00; 1621.58 + 80; 3160.00; 1655.34 + 81; 3240.00; 1699.60 + 82; 3321.00; 1717.26 + 83; 3403.00; 1794.74 + 84; 3486.00; 1826.90 + 85; 3570.00; 1874.66 + 86; 3655.00; 1931.14 + 87; 3741.00; 1935.44 + 88; 3828.00; 2021.40 + 89; 3916.00; 2035.10 + 90; 4005.00; 2128.82 + 91; 4095.00; 2130.34 + 92; 4186.00; 2177.56 + 93; 4278.00; 2271.38 + 94; 4371.00; 2261.42 + 95; 4465.00; 2299.68 + 96; 4560.00; 2374.12 + 97; 4656.00; 2422.98 + 98; 4753.00; 2486.74 + 99; 4851.00; 2532.82 +100; 4950.00; 2560.18 diff --git a/TP7/analyse-tris/analyse_tris2.py b/TP7/analyse-tris/analyse_tris2.py new file mode 100755 index 0000000000000000000000000000000000000000..be9e9189425a29f967e009520964646b6e8e78b1 --- /dev/null +++ b/TP7/analyse-tris/analyse_tris2.py @@ -0,0 +1,88 @@ +#!/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 * + + +################################################ +# 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 + + + +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, 1, 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], + c_sort)) + + # 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/TP7/analyse-tris/tp7.py b/TP7/analyse-tris/tp7.py new file mode 100644 index 0000000000000000000000000000000000000000..9b15b67cb350bafc47d289622056f68240f5aa9e --- /dev/null +++ b/TP7/analyse-tris/tp7.py @@ -0,0 +1,31 @@ +# TP7 AP Analyse empirique des tris +# Belkacemi Melissa +# 13/03/2024 + +#Préliminaires + +# l'expression l=[k for k in range(n)] permet de construire en compréhension une liste des entiers de 0 à n-1 +from random import shuffle + +def liste_alea(n:int)->list[int]: + """Renvoie une liste de longueur n contenant les entiers de 0 à n-1 mélangés + + Précondition : n>=0 + Exemple(s) : + $$$ liste_alea(0) + [] + $$$ liste_alea(1) + [0] + + """ + l=[k for k in range(n)] + shuffle(l) + return l +#Représentation graphique avec Matplotlib +import matplotlib.pyplot as plt + +#Compter les comparaisons +from ap_decorators import count +from compare import compare + +nvle_compare = count(compare) \ No newline at end of file diff --git a/TP7/analyse-tris/tris.py b/TP7/analyse-tris/tris.py old mode 100644 new mode 100755 index 18df74065a465ff7025f8fc807a4bd08958869a5..66cee9a364ad242c9cf635662b835f0a5aa9b583 --- a/TP7/analyse-tris/tris.py +++ b/TP7/analyse-tris/tris.py @@ -186,6 +186,32 @@ def tri_insert(liste: list[T], comp: Callable[[T, T], int] = compare) -> NoneTyp inserer(liste, i, comp=comp) # alors la tranche liste[0:i+1] est triée # à l'issue de l'itération la tranche liste[0:n] est triée + +from functools import cmp_to_key + +def tri_sort(liste: list[T], comp: Callable[[T, T], int] = compare) -> NoneType: + """modifie la liste liste en triant ses éléments selon l'ordre défini par comp en utilisant sort + + Précondition : + Exemple(s) : + $$$ liste = [3, 1, 4, 1, 5, 9, 2] + $$$ tri_sort(liste) + $$$ liste == [1, 1, 2, 3, 4, 5, 9] + True + $$$ from random import randrange + $$$ l1 = [randrange(1000) for k in range(randrange(100))] + $$$ l2 = l1.copy() + $$$ tri_sort(l2) + $$$ est_trie(l2) + True + $$$ all(l1.count(elt) == l2.count(elt) for elt in l1) + True + $$$ all(l1.count(elt) == l2.count(elt) for elt in l2) + True + + """ + liste.sort(key=cmp_to_key(comp)) + if (__name__ == '__main__'): diff --git a/TP7/analyse-tris/tris_nbcomp.png b/TP7/analyse-tris/tris_nbcomp.png new file mode 100644 index 0000000000000000000000000000000000000000..e17e8c6a3f44b28019c7fde9ec262bdc4a6a2042 Binary files /dev/null and b/TP7/analyse-tris/tris_nbcomp.png differ