From 97575ac0671d048194467492de6c899edd8fd9e9 Mon Sep 17 00:00:00 2001 From: kara-mosr Date: Wed, 15 Oct 2025 10:28:06 +0200 Subject: [PATCH] ajout TD4 --- Algo_ex3.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++++++ EX2.txt | 16 +++++++++++ EX3.txt | 20 ++++++++++++++ ex3 | Bin 0 -> 15864 bytes 4 files changed, 114 insertions(+) create mode 100644 Algo_ex3.c create mode 100644 EX2.txt create mode 100644 EX3.txt create mode 100755 ex3 diff --git a/Algo_ex3.c b/Algo_ex3.c new file mode 100644 index 0000000..ed3f9f3 --- /dev/null +++ b/Algo_ex3.c @@ -0,0 +1,78 @@ +#include +#include +#include + +static size_t ipow(size_t a, unsigned b) { + size_t r = 1; while (b--) r *= a; return r; +} + +static int cmp_int(const void *a, const void *b) { + int ia = *(const int*)a, ib = *(const int*)b; + return (ia > ib) - (ia < ib); +} + + +static void reorder_blocks(int *base, size_t block_sz, size_t M,const size_t *idx) +{ + size_t group_sz = block_sz * M; + int *tmp = malloc(group_sz * sizeof(int)); + for (size_t j = 0; j < M; ++j) + memcpy(tmp + j*block_sz, base + idx[j]*block_sz, block_sz*sizeof(int)); + memcpy(base, tmp, group_sz * sizeof(int)); + free(tmp); +} + + +void sort_ND(int *a, unsigned N, size_t M) +{ + const size_t total = ipow(M, N); + + + for (size_t off = 0; off < total; off += M) + qsort(a + off, M, sizeof(int), cmp_int); + + for (unsigned level = 2; level <= N; ++level) { + size_t block_sz = ipow(M, level - 1); + size_t group_sz = block_sz * M; + size_t groups = total / group_sz; + + long *sums = malloc(M * sizeof(long)); + size_t *idx = malloc(M * sizeof(size_t)); + + for (size_t g = 0; g < groups; ++g) { + int *base = a + g * group_sz; + + + for (size_t j = 0; j < M; ++j) { + long s = 0; + int *p = base + j * block_sz; + for (size_t t = 0; t < block_sz; ++t) s += p[t]; + sums[j] = s; + idx[j] = j; + } + + for (size_t i = 0; i + 1 < M; ++i) + for (size_t j = i + 1; j < M; ++j) + if (sums[idx[j]] < sums[idx[i]]) { + size_t tmp = idx[i]; idx[i] = idx[j]; idx[j] = tmp; + } + + + reorder_blocks(base, block_sz, M, idx); + } + free(sums); free(idx); + } +} + + +int main(void) { + size_t M = 3; unsigned N = 2; + int a[] = { 0,3,2, 9,4,5, 4,1,3 }; + sort_ND(a, N, M); + + for (size_t i = 0; i < M; ++i) { + for (size_t j = 0; j < M; ++j) printf("%d ", a[i*M + j]); + printf("\n"); + } + return 0; +} diff --git a/EX2.txt b/EX2.txt new file mode 100644 index 0000000..a1a659e --- /dev/null +++ b/EX2.txt @@ -0,0 +1,16 @@ +1) +pour function_1 : +on a deux tableaux qu'on parcour en entier en comparant les elements un a un qui ont le meme indice ( tab[n] == tab[m] ? ) +On a donc O(n*m), ou n represente le premier tableau et m le deuxieme + +2) +pour function_2 : +La boucle while s'execute autant de fois que la valeur initiale de x (si x>0). On a donc un temps proportionnel a x. +On a donc O(x) comme complexite + + +3) +pour function_3 : +Un nombre fixe de tests if et d'affectations, independants de la taille de l'entre comme dans l'exemple dans le cours. +On va faire qu'une seule instruction quoi qui l'arrive. Selon la valeur de x on va faire une action differente mais dans tous les cas il ni y'en aura qu'une seule. +La complexite est donc de O(1) \ No newline at end of file diff --git a/EX3.txt b/EX3.txt new file mode 100644 index 0000000..6a24b1e --- /dev/null +++ b/EX3.txt @@ -0,0 +1,20 @@ +A chaque niveau, on effectue des tris de taille M sur un certain nombre de tranches/blocs + + +Role de chaque fonction + +ipow(a, b) : calcule a^b par multiplications successives. + +cmp_int(a, b) : comparateur d'entiers pour qsort (retourne l'ordre). + +reorder_blocks(base, block_sz, M, idx) : reordonne, dans un groupe de M blocs contigus de taille block_sz, +l'ordre des blocs selon le tableau d'indices idx (via un tampon temporaire). + +sort_ND(a, N, M) : +- trie chaque sous-tableau 1D de longueur M (dimension la plus basse) + +pour chaque niveau 2...N, calcule la somme de chaque bloc de la dimension inferieure, trie les blocs selon ces sommes, puis rerdonne physiquement les blocs. + + +Complexite de l'algorithme principal (sort_ND) : O(M^N * log (M)) + diff --git a/ex3 b/ex3 new file mode 100755 index 0000000000000000000000000000000000000000..b312e3aea44895891630933d942cc3391e0b2c66 GIT binary patch literal 15864 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