algose:feuille2
Différences
Ci-dessous, les différences entre deux révisions de la page.
| algose:feuille2 [2016/09/19 09:46] – créée blanc | algose:feuille2 [2016/09/19 10:18] (Version actuelle) – supprimée blanc | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ===== Feuille 2 ===== | ||
| - | |||
| - | ==== Notions de complexité algorithmique ==== | ||
| - | |||
| - | Il est important, lorsqu' | ||
| - | |||
| - | * Qu' | ||
| - | * Quels calculs permettent d' | ||
| - | |||
| - | === Ordre de grandeur et notation grand " | ||
| - | |||
| - | L' | ||
| - | |||
| - | La complexité s' | ||
| - | |||
| - | * Par exemple, on écrit et on dit qu'un algorithme est de l' | ||
| - | |||
| - | La notion grand $O$ peut être définie précisément. Soit deux fonctions $f(N)$ et $g(N)$, on dira que $f(N) \to O(g(N))$ lorsque $N \to \infty$ si et seulement s'il existe une constante $c$ telle que: | ||
| - | |||
| - | $$|f(N)| \leq |c \cdot g(N)|$$ | ||
| - | |||
| - | pour $N$ assez grand; c' | ||
| - | |||
| - | On utilisera toujours, en lieu de $g$, des fonctions types: | ||
| - | |||
| - | * logarithmique: | ||
| - | * linéaire: $g(N) = N$ | ||
| - | * quadratique: | ||
| - | * ou encore $g(N) = N \log(N)$ (la complexité des " | ||
| - | * ... | ||
| - | |||
| - | La notation grand $O$ possède des propriétés intéressantes, | ||
| - | |||
| - | * Si $f_1(N) = O(g_1(N))$ et $f_2(N) = O(g_2(N))$ alors | ||
| - | * $(f_1 + f_2)(N) = O(g_1(N) + g_2(N))$ | ||
| - | * $(f_1 \cdot f_2)(N) = O(g_1(N) \cdot g_2(N))$ | ||
| - | |||
| - | Sauriez-vous le démontrer ? | ||
| - | |||
| - | |||
| - | La complexité peut être mesurée de plusieurs manières, notamment //dans le pire des cas// ou //en moyenne// | ||
| - | |||
| - | * La **complexité dans le pire des cas** considère la complexité maximale sur toutes les entrées possibles. | ||
| - | * La **complexité en moyenne** est une moyenne de la complexité pondérée entre les différentes entrées possibles selon une distribution donnée. | ||
| - | |||
| - | |||
| - | ==== Exercice 1. Recherchez un élément dans un tableau ==== | ||
| - | |||
| - | Prenez l' | ||
| - | |||
| - | * Combien de comparaisons doit-on effectuer si l' | ||
| - | * Quelle est la complexité de cet algorithme (combien de comparaisons doit-il effectuer) dans //le pire des cas// (//worst case complexity// | ||
| - | * Quelle est la complexité //moyenne// ? Il faut faire la moyenne du nombre de comparaisons sur tous les cas possibles: lorsque l' | ||
| - | |||
| - | ==== Exercice 2. Décalez les entrées d'un tableau d' | ||
| - | |||
| - | Prenez l' | ||
| - | |||
| - | * Quelle est la complexité de cet algorithme en pire cas ? en moyenne ? Démontrez vos affirmations en faisant une utilisation rigoureuse de la notation $O$. | ||
| - | |||
| - | ==== Exercice 3. Fusionnez deux tableau d' | ||
| - | |||
| - | La semaine dernière vous avez proposé deux algorithmes pour ce problème, un qui implémente une solution " | ||
| - | |||
| - | * Donnez la complexité en pire cas pour ces deux algorithmes. | ||
| - | |||
| - | ===== TD machine ===== | ||
| - | |||
| - | ==== Générez des entiers au hasard ==== | ||
| - | |||
| - | La génération aléatoire d' | ||
| - | |||
| - | **Qu' | ||
| - | |||
| - | Par exemple, on peut voir le jeu de pile ou face comme un tirage aléatoire uniforme sur l' | ||
| - | |||
| - | ==== Exercice 4. La hasard en langage C ==== | ||
| - | |||
| - | La plupart des langages propose des librairies effectuant les opérations de base et nécessaires à la génération aléatoire: générer un entier au hasard parmi tous les entiers possibles. | ||
| - | |||
| - | <file c ex_hasard.c> | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | int main(void) { | ||
| - | |||
| - | int tab[10]; | ||
| - | |||
| - | srand(time(NULL)); | ||
| - | |||
| - | for(int i = 0; i < 10; ++i) { | ||
| - | tab[i] = rand() % 10; | ||
| - | |||
| - | } | ||
| - | printf(" | ||
| - | for(int i = 0; i < 10; ++i) { | ||
| - | printf( "%d ", tab[i]); | ||
| - | } | ||
| - | printf(" | ||
| - | return EXIT_SUCCESS; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | Ce code insère 10 entiers choisis au hasard dans l' | ||
| - | |||
| - | Observez comment on s' | ||
| - | |||
| - | |||
| - | ==== Exercice 5. Est-ce bien au hasard ??? ==== | ||
| - | |||
| - | Nous allons maintenant vérifier que le tirage aléatoire est bien uniforme ... c' | ||
| - | |||
| - | * On détermine un intervalle $[0, M]$. Nous prendrons $M = 9$ comme dans l' | ||
| - | * On utilise un tableau $T$ de taille $M$, dont les entrées sont initialisées à 0. | ||
| - | * On détermine un nombre de tirages $N$, suffisamment grand (on le fera varier en prenant des valeurs de plus en plus grandes). | ||
| - | * On effectue $N$ tirages aléatoires d' | ||
| - | * A chaque tirage '' | ||
| - | * En fin de boucle, l' | ||
| - | * Reste à calculer la fréquence d' | ||
| - | |||
| - | En vous basant sur le programme donné dans l' | ||
| - | |||
| - | ==== Exercice 6. Générez une liste d' | ||
| - | |||
| - | Cet exercice vise à mettre au point un algorithme générant au hasard une liste d' | ||
| - | |||
| - | **Première tentative** Implémentez l' | ||
| - | |||
| - | < | ||
| - | entrée: N | ||
| - | sortie: un tableau de N entiers distincts parmi {1, ..., N} | ||
| - | |||
| - | on génère un tableau T de N entiers parmi {1, ..., N} (avec l' | ||
| - | tant que les entiers du tableau T ne sont pas distincts deux à deux | ||
| - | on recommence | ||
| - | </ | ||
| - | |||
| - | **Deuxième tentative** | ||
| - | |||
| - | < | ||
| - | entrée: N | ||
| - | sortie: un tableau de N entiers distincts parmi {1, ..., N} | ||
| - | |||
| - | T un tableau vide de taille N | ||
| - | repeter pour i de 0 à N-1 | ||
| - | k = entier choisi au hasard | ||
| - | tant que k est deja present dans T | ||
| - | k = entier choisi au hasard | ||
| - | T[i] = k | ||
| - | </ | ||
| - | |||
| - | * Evaluez combien le deuxième algorithme est plus rapide que le précédent. Pour cela, faites les tourner, et comptez pour chacun le nombre total d' | ||
| - | * Cet algorithme nécessite de chercher si un élément est dans le tableau. Comment avez-vous géré cette recherche ? Quelle solution peut-on envisager pour éviter de lancer une recherche " | ||
| - | * Analysez la complexité dans le pire des cas pour les deux algorithmes. | ||
algose/feuille2.1474278360.txt.gz · Dernière modification : 2016/09/19 09:46 de blanc
