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