From 57c9ce933b02974125b3eeec223975696725cd11 Mon Sep 17 00:00:00 2001 From: rabot Date: Wed, 7 Oct 2026 12:20:50 +0200 Subject: [PATCH] =?UTF-8?q?Remplacement=20du=20tri=20=C3=A0=20bulles=20par?= =?UTF-8?q?=20un=20tri=20par=20tas=20pour=20am=C3=A9liorer=20les=20perform?= =?UTF-8?q?ances=20de=20tri?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- COMPTE_RENDU.md | 1 + analyseur.c | 33 ++++++-- notes.md | 52 ++++++++++++- out/analyseur | Bin 27288 -> 27328 bytes out/gmon.out | Bin 8651 -> 8922 bytes out/profil_apres_tri.txt | 160 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 237 insertions(+), 9 deletions(-) create mode 100644 COMPTE_RENDU.md create mode 100644 out/profil_apres_tri.txt diff --git a/COMPTE_RENDU.md b/COMPTE_RENDU.md new file mode 100644 index 0000000..a48c3f8 --- /dev/null +++ b/COMPTE_RENDU.md @@ -0,0 +1 @@ +// Piste : réduire le temps d'exécution de `doit_echanger` diff --git a/analyseur.c b/analyseur.c index 8fd5b0b..7081696 100644 --- a/analyseur.c +++ b/analyseur.c @@ -319,16 +319,33 @@ int doit_echanger(const Entree *a, const Entree *b) return comparer(a->mot, b->mot) > 0; } +/* La racine du tas est l'entrée qui doit apparaître le plus tard. */ +void retablir_tas(Entree *table, int n, int racine) +{ + while (racine < n / 2) { + int enfant = 2 * racine + 1; + if (enfant + 1 < n && doit_echanger(&table[enfant + 1], &table[enfant])) + enfant++; + if (!doit_echanger(&table[enfant], &table[racine])) + break; + + Entree tmp = table[racine]; + table[racine] = table[enfant]; + table[enfant] = tmp; + racine = enfant; + } +} + void trier_entrees(Entree *table, int n) { - for (int i = 0; i < n - 1; i++) { - for (int j = 0; j < n - 1 - i; j++) { - if (doit_echanger(&table[j], &table[j + 1])) { - Entree tmp = table[j]; - table[j] = table[j + 1]; - table[j + 1] = tmp; - } - } + /* Construire le tas, puis placer chaque racine à sa position finale. */ + for (int i = n / 2 - 1; i >= 0; i--) + retablir_tas(table, n, i); + for (int fin = n - 1; fin > 0; fin--) { + Entree tmp = table[0]; + table[0] = table[fin]; + table[fin] = tmp; + retablir_tas(table, fin, 0); } } diff --git a/notes.md b/notes.md index d34bfd2..663034c 100644 --- a/notes.md +++ b/notes.md @@ -365,4 +365,54 @@ Empreinte du rapport : 1d53de903efd2b7c real 0m0.751s user 0m0.703s sys 0m0.004s -``` \ No newline at end of file +``` + +## Remplacement du tri à bulles par un tri par tas + +Le tri à bulles effectuait systématiquement n(n - 1)/2 comparaisons, +soit 17 202 045 appels à `doit_echanger` pour 5 866 mots distincts. + +`trier_entrees` utilise maintenant un tri par tas. La racine du tas contient +l'entrée qui doit apparaître le plus tard dans le classement. Elle est +échangée avec la dernière entrée de la partie non triée, puis `retablir_tas` +restaure cette propriété sur les entrées restantes. La construction du tas +coûte O(n), puis les extractions coûtent O(log n) chacune : le tri complet +passe de O(n²) à O(n log n), y compris dans le pire cas. + +Le tri travaille directement dans le tableau, avec O(1) de mémoire +supplémentaire. `doit_echanger` reste inchangée : fréquence décroissante, +puis ordre alphabétique croissant. Chaque échange déplace l'entrée entière, +y compris la longueur mémorisée. + +Profil enregistré dans [out/profil_apres_tri.txt](out/profil_apres_tri.txt). +La comparaison porte sur la version précédente, décrite dans +`out/profil_apres_longueurs.txt`. + +| Mesure | Tri à bulles | Tri par tas | +| --- | ---: | ---: | +| Appels à `doit_echanger` pendant le tri | 17 202 045 | 129 602 | +| Appels à `comparer` pour départager les fréquences égales | 12 172 087 | 32 813 | +| Temps réel médian du programme sans profiling (`gcc -O0`, 5 exécutions par version) | 0,367 s | 0,113 s | + +Le tri effectue environ 133 fois moins de comparaisons d'entrées. +Le temps total baisse de 69,3 %, soit une accélération d'environ 3,25. +Les cinq mesures, réalisées en alternant les deux versions sur la même +machine, sont respectivement : 0,365 / 0,363 / 0,372 / 0,383 / 0,367 s +avant, et 0,112 / 0,113 / 0,115 / 0,113 / 0,112 s après. + +Validation : compilation sans avertissement avec `-Wall -Wextra -Wpedantic`, +rapport et sortie console identiques octet par octet sur les dix exécutions, +avec `-pg` et sous AddressSanitizer et UndefinedBehaviorSanitizer. +L'empreinte reste **`1d53de903efd2b7c`**. +Des tests temporaires ont comparé le résultat à `qsort` sur des tableaux +de 0 à 20 000 entrées, aléatoires, déjà triés ou inversés. Ils vérifient +aussi les fréquences égales, les doublons, les préfixes, les valeurs +extrêmes de fréquence et la conservation des longueurs des mots. + +Commandes pour reproduire ce profil : + +```bash +mkdir -p out/apres_tri +gcc -O0 -pg analyseur.c -o out/apres_tri/analyseur +(cd out/apres_tri && ./analyseur && gprof -b ./analyseur gmon.out > ../profil_apres_tri.txt) +``` diff --git a/out/analyseur b/out/analyseur index 65c902b44302a4ef745cd2f227f566f54736bc09..3c0d27544abf3d772994107472f6a5f7ad6528b7 100755 GIT binary patch delta 3330 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 VH36Cy*;yxBWtlNfpIn%w4glDCMil@6 delta 3005 zcmX?bm2t*Z#t9mXGbU=@=ejGy00wtuCJQm@ae8opc?=$tJsI~4z3_za5cFgzCN)6~ zFNiRlo*c-ej!khFlO3lBBSf*trn z_kwL&hc~Zb?w4iK5}$0VsK=BiJvmoVj!95@bFboBzR7Mz{EEk2cYus~na#++aNKnd znC;2Pz|ifw$76;^Zvf-u0|s_Hvj6}8Z#}@@@`-_gVe&>pg~?imnye6M0Yh zCKnjG!iA(JYZ$A#H@og(>~>w!{DM*2b%&+v9{!%C|Nj4PcHIFLwRGLV-_!Q*|NjXd z-L5ZEJhWLk4aR2@@lhmrZsw# zMa+$uD)c6Mm=`lWel>Zoxh+%3tI2=NHAJMi85lgeTQmOu|L@Ux&ZG1Ai?wejTUcZ} zZscNM@aSzV`2YXEW9LWD&L8_47#J8lI*)^c?S;?F|NlLDrzU{(_4a~Pp_;<@cJdPo zBhDEw|NlRE_(kK($?}$kGJG%p{}1)(eCpBsM&c8{pzDiI`~qNtmxp`u8cPYLPh69a zS*kN#fZXP~!lT=D#l8s_m_d$s@%Zgzdn-|)0>ljyY7TjHLlove`~SZ?w8f*_^+4w}kj~)Ah1PZT^VmTavd#oi z5b<1)>7A}GJeq4?FqFu9bceq1=yrYJ0g?Ux6m0hkkO_yM{{P?Y+ThVEn#Rt+(0R7ud)u6tXigICg&MJO;7Q2xMU|>m0CU$6qi%oqX3OjNc8y zg(%tgWU`a3nwA<^3={wm;kGAW|2zQs#|y#+hq2w0$&+l=)Wn{ELURTrG-uRY_2_op z0aE(!F<9FM5c|{P$@gs4q)$BtDV@XESUV?Nnt`G23Mip~?+Tk!;x2GjWE zT^JZX^UMA6=oY=J%)nsy?Z2w5^5j4}Nv2myn{(`@Fm5goS-`l-L5H~>ROl!&FfjbM z^Z)+@Mh1o#cmMz2!N|by|e28;|08u$MHcVT2;$hi0ae+nZ5L&d%S|0@_77y|GA z|9^pzfnmb^|NlRL)ZhRAUx0~$Vfusr{|%TJ7-S#*{~y4_z_94y|NjL{3=HQU{{KIL ziGhLj(f|J&m>3wM9{>M;g^8h_A>!Hp|6iCG7>+#u|6hWcfg$q6|Nl133=G>|{Qn=r z%)lV_^8f!DW(Ee4SO5RdVP;?`e*ORd9%crHg>U}*5D<^Zh$}`TGtm!Jx_+YZ9t2|@;nVGjS z^00F-Fo0am!_2@i>(%5scPTai;tUK7 zQ=sw=3=9mQI`#;Z4+?i#1_lOXzA6I)!4 zm@e3C{^Xm+#;CD5GNhi7F=q13(B(|gMw6Su)EGM_uME>?G@AS{Tzv9}FpkLr;Tn=l z7#SFZn0Of$*noV;zyLBB#9BQ$FkD=66C(qI0D}}H?m@y(ymNA6xH#j<$%$d&jCUq) z3>TLKWeXuDK86cWbD#fB3T2W7!HAC z8Lv$?j1-rA%EZ7R$Rx$kfo9I9$%&ETl8np{H`wVwwElxo41AL(Mv8kXGK0cLn&Chh zsvp##x>P~AiGhLPC{)@6Dn0>J3NbK%aw6Eg-pL;$#XUjE73AM0XzKU}Dxnz|7^0xM zJ{W-&GiWeF=v=7yD?Naq`h01`ac~D(d&@d?m2{JG+tbmGVT0jI0 zLDee*1H;7S}PeWz*D??=4AQZ!u$q%E%Js&`2?`cDXVL|yC>;^uDyJ)H6BUJrt zP=(CEz@P^WAC}3E(c+R~ERZyL0IG`*VkmB&lIdR(x?f5B#QR9YLO$mEA<`hpHF5WO&3VX|VnJ}083 z8<}p-h18Osm2SofZ$WRqneNWS7%^Ef%bcqs24c=HmdQz3W}HQd5U$c>#T0n}`^(gg diff --git a/out/gmon.out b/out/gmon.out index ac86df0362031b24c982ca672ea39d5d8c00fda2..7fe4e4c66e850c54b89a9937ee2b93ed4f46f917 100644 GIT binary patch delta 497 zcmX@@e9Lu$EN6oq0~jpWs5V_-VF2Ui{h}g_8v`;JC+`>ani#+bqBaHyfVdirOdB0D zIXADBTfkVa+rYrUxWNFdm*Jc~gqHrxz`)302;sm4)j@&y{2PXKn{+|#7qXU{~cr!l(qk#oPsTWi~BLf2i;{!Co zS0I}dtRO0lR3S82r2|y3T@6Vv04mt32@_;xU|?*pnk=X&T<>5F5nP}Lp+AK%FfbNC z1V#+ G^aB7MH9cAY delta 489 zcmccRdfIt{Eaw9o1~9PLs5V`Ik!7Q!G9x47GGB7SM0NcrMP9H+oRu5)kG3}02TbG1rhud z!oa||z!Jh)pa-GBf)}8IT2LQ?&3phAd~XO*2^M5Xw}S8zj36{vQ~)aY3F>gLpaE3y XE3!%lsGuy=-(ZyotRZIABWVW!Bi2uB diff --git a/out/profil_apres_tri.txt b/out/profil_apres_tri.txt new file mode 100644 index 0000000..dcfb79c --- /dev/null +++ b/out/profil_apres_tri.txt @@ -0,0 +1,160 @@ +Flat profile: + +Each sample counts as 0.01 seconds. + % cumulative self self total + time seconds seconds calls ms/call ms/call name + 45.45 0.05 0.05 12198772 0.00 0.00 egales + 18.18 0.07 0.02 1 20.00 27.09 analyser_bigrammes + 9.09 0.08 0.01 5297256 0.00 0.00 est_lettre + 9.09 0.09 0.01 1266663 0.00 0.00 en_minuscule + 9.09 0.10 0.01 250000 0.00 0.00 est_mot_vide + 9.09 0.11 0.01 1 10.00 10.00 decouper_lignes + 0.00 0.11 0.00 928117 0.00 0.00 alea + 0.00 0.11 0.00 150182 0.00 0.00 chercher_mot + 0.00 0.11 0.00 150182 0.00 0.00 compter_mot + 0.00 0.11 0.00 150182 0.00 0.00 hacher_mot + 0.00 0.11 0.00 129602 0.00 0.00 doit_echanger + 0.00 0.11 0.00 32813 0.00 0.00 comparer + 0.00 0.11 0.00 26801 0.00 0.00 ajouter + 0.00 0.11 0.00 21746 0.00 0.00 compter_mots_ligne + 0.00 0.11 0.00 21746 0.00 0.00 normaliser_ligne + 0.00 0.11 0.00 8798 0.00 0.00 retablir_tas + 0.00 0.11 0.00 5866 0.00 0.00 copier + 0.00 0.11 0.00 1 0.00 0.00 construire_rapport + 0.00 0.11 0.00 1 0.00 0.00 ecart_type_longueur + 0.00 0.11 0.00 1 0.00 0.00 empreinte + 0.00 0.11 0.00 1 0.00 0.00 generer_texte + 0.00 0.11 0.00 1 0.00 0.00 generer_vocabulaire + 0.00 0.11 0.00 1 0.00 0.00 longueur_moyenne + 0.00 0.11 0.00 1 0.00 0.00 racine + 0.00 0.11 0.00 1 0.00 0.00 trier_entrees + + Call graph + + +granularity: each sample hit covers 4 byte(s) for 9.09% of 0.11 seconds + +index % time self children called name + +[1] 100.0 0.00 0.11 main [1] + 0.00 0.06 21746/21746 compter_mots_ligne [2] + 0.02 0.01 1/1 analyser_bigrammes [5] + 0.00 0.01 21746/21746 normaliser_ligne [6] + 0.01 0.00 1/1 decouper_lignes [9] + 0.00 0.00 1/1 generer_vocabulaire [23] + 0.00 0.00 1/1 generer_texte [22] + 0.00 0.00 1/1 trier_entrees [26] + 0.00 0.00 1/1 longueur_moyenne [24] + 0.00 0.00 1/1 ecart_type_longueur [20] + 0.00 0.00 1/1 racine [25] + 0.00 0.00 1/1 construire_rapport [19] + 0.00 0.00 1/1 empreinte [21] +----------------------------------------------- + 0.00 0.06 21746/21746 main [1] +[2] 54.5 0.00 0.06 21746 compter_mots_ligne [2] + 0.01 0.05 250000/250000 est_mot_vide [3] + 0.00 0.00 150182/150182 compter_mot [11] +----------------------------------------------- + 0.01 0.05 250000/250000 compter_mots_ligne [2] +[3] 54.0 0.01 0.05 250000 est_mot_vide [3] + 0.05 0.00 12045671/12198772 egales [4] +----------------------------------------------- + 0.00 0.00 153101/12198772 chercher_mot [10] + 0.05 0.00 12045671/12198772 est_mot_vide [3] +[4] 45.5 0.05 0.00 12198772 egales [4] +----------------------------------------------- + 0.02 0.01 1/1 main [1] +[5] 24.6 0.02 0.01 1 analyser_bigrammes [5] + 0.01 0.00 3757672/5297256 est_lettre [7] +----------------------------------------------- + 0.00 0.01 21746/21746 main [1] +[6] 11.7 0.00 0.01 21746 normaliser_ligne [6] + 0.01 0.00 1266663/1266663 en_minuscule [8] + 0.00 0.00 1539584/5297256 est_lettre [7] +----------------------------------------------- + 0.00 0.00 1539584/5297256 normaliser_ligne [6] + 0.01 0.00 3757672/5297256 analyser_bigrammes [5] +[7] 9.1 0.01 0.00 5297256 est_lettre [7] +----------------------------------------------- + 0.01 0.00 1266663/1266663 normaliser_ligne [6] +[8] 9.1 0.01 0.00 1266663 en_minuscule [8] +----------------------------------------------- + 0.01 0.00 1/1 main [1] +[9] 9.1 0.01 0.00 1 decouper_lignes [9] +----------------------------------------------- + 0.00 0.00 150182/150182 compter_mot [11] +[10] 0.6 0.00 0.00 150182 chercher_mot [10] + 0.00 0.00 153101/12198772 egales [4] + 0.00 0.00 150182/150182 hacher_mot [13] +----------------------------------------------- + 0.00 0.00 150182/150182 compter_mots_ligne [2] +[11] 0.6 0.00 0.00 150182 compter_mot [11] + 0.00 0.00 150182/150182 chercher_mot [10] + 0.00 0.00 5866/5866 copier [18] +----------------------------------------------- + 0.00 0.00 27934/928117 generer_vocabulaire [23] + 0.00 0.00 900183/928117 generer_texte [22] +[12] 0.0 0.00 0.00 928117 alea [12] +----------------------------------------------- + 0.00 0.00 150182/150182 chercher_mot [10] +[13] 0.0 0.00 0.00 150182 hacher_mot [13] +----------------------------------------------- + 0.00 0.00 129602/129602 retablir_tas [17] +[14] 0.0 0.00 0.00 129602 doit_echanger [14] + 0.00 0.00 32813/32813 comparer [15] +----------------------------------------------- + 0.00 0.00 32813/32813 doit_echanger [14] +[15] 0.0 0.00 0.00 32813 comparer [15] +----------------------------------------------- + 0.00 0.00 5867/26801 construire_rapport [19] + 0.00 0.00 20934/26801 generer_vocabulaire [23] +[16] 0.0 0.00 0.00 26801 ajouter [16] +----------------------------------------------- + 0.00 0.00 8798/8798 trier_entrees [26] +[17] 0.0 0.00 0.00 8798 retablir_tas [17] + 0.00 0.00 129602/129602 doit_echanger [14] +----------------------------------------------- + 0.00 0.00 5866/5866 compter_mot [11] +[18] 0.0 0.00 0.00 5866 copier [18] +----------------------------------------------- + 0.00 0.00 1/1 main [1] +[19] 0.0 0.00 0.00 1 construire_rapport [19] + 0.00 0.00 5867/26801 ajouter [16] +----------------------------------------------- + 0.00 0.00 1/1 main [1] +[20] 0.0 0.00 0.00 1 ecart_type_longueur [20] +----------------------------------------------- + 0.00 0.00 1/1 main [1] +[21] 0.0 0.00 0.00 1 empreinte [21] +----------------------------------------------- + 0.00 0.00 1/1 main [1] +[22] 0.0 0.00 0.00 1 generer_texte [22] + 0.00 0.00 900183/928117 alea [12] +----------------------------------------------- + 0.00 0.00 1/1 main [1] +[23] 0.0 0.00 0.00 1 generer_vocabulaire [23] + 0.00 0.00 27934/928117 alea [12] + 0.00 0.00 20934/26801 ajouter [16] +----------------------------------------------- + 0.00 0.00 1/1 main [1] +[24] 0.0 0.00 0.00 1 longueur_moyenne [24] +----------------------------------------------- + 0.00 0.00 1/1 main [1] +[25] 0.0 0.00 0.00 1 racine [25] +----------------------------------------------- + 0.00 0.00 1/1 main [1] +[26] 0.0 0.00 0.00 1 trier_entrees [26] + 0.00 0.00 8798/8798 retablir_tas [17] +----------------------------------------------- + +Index by function name + + [16] ajouter [9] decouper_lignes [23] generer_vocabulaire + [12] alea [14] doit_echanger [13] hacher_mot + [5] analyser_bigrammes [20] ecart_type_longueur [24] longueur_moyenne + [10] chercher_mot [4] egales [6] normaliser_ligne + [15] comparer [21] empreinte [25] racine + [11] compter_mot [8] en_minuscule [17] retablir_tas + [2] compter_mots_ligne [7] est_lettre [26] trier_entrees + [19] construire_rapport [3] est_mot_vide + [18] copier [22] generer_texte