






Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
These are notes for algorithms in computer science for year 12. The language is in French.
Typology: Lecture notes
1 / 11
This page cannot be seen from the preview
Don't miss anything!







Définition : Un algorithme est une séquence d’instructions décrivant de manière précise les étapes de la résolution d’un problème mathématique. C’est une définition très large, qui peut s’appliquer aussi bien aux mathématiques, à l’informatique, et même à des recettes de cuisine ou au montage d’un meuble en kit. Un peu d'histoire : Les algorithmes sont très antérieurs à l’informatique. Ils sont employés depuis l’Antiquité pour résoudre des problèmes :
de résolution d’équations.
d’Eratosthène pour trouver des nombres premiers, l’algorithme d’Euclide pour déterminer le plus grand commun diviseur de deux nombres entiers ou encore l’algorithme d’Archimède pour le calcul du nombre π (pi). Les mathématiciens grecs n’employaient cependant pas le terme d’algorithme qui est d’apparition plus récente. Le mot algorithme est une déclinaison latinisée du nom du grand mathématicien perse du IXe siècle Al-Khwârizmî, à qui on doit notamment les premiers manuels d’algèbre et de méthodes de résolution d’équation. Au XIXe siècle, le métier à tisser mécanique a été inventé par le mécanicien français Joseph Marie Jacquard, premier système se programmant avec des cartes perforées. Quelques années plus tard, la mathématicienne britannique Ada Lovelace publie le tout premier algorithme destiné à être exécuté par la machine analytique inventée par Charles Babbage. L’informatique se développe au XXe siècle, sous l’égide de plusieurs mathématiciens, parmi lesquels le britannique Alan Turing. Il formalise les concepts d’algorithmes et d’ordinateur et participe ensuite au développement des premières machines capables de stocker électroniquement des données. Algorithmes informatiques : Le développement fulgurant des ordinateurs pendant la seconde partie du XXe siècle, entraine celui des langages informatiques utilisés pour traduire la logique algorithmique, en instructions compréhensibles par l’ordinateur.
L’algorithme indique une méthode à appliquer pour résoudre un problème. Un programme informatique est une implémentation possible d’un algorithme. Remarque : Quand on écrit un algorithme, on utilise un langage dit « langage naturel » ou « pseudo- code » (« tant que", « si »…). Ce langage naturel permet de passer facilement à un langage de programmation (Python, Java...), on dit alors que l'on implémente l’algorithme. Mise en activité : Soit l'algorithme suivant : VARIABLES t : tableau d'entiers x : nombre entier tr : booléen (VRAI ou FAUX) i : nombre entier DEBUT tr ← FAUX i ← 1 tant que i<=longueur(t) et que tr==FAUX: si t[i]==x: tr ← VRAI fin si i ← i+ fin tant que renvoyer la valeur de tr FIN Exécuter à la main l'algorithme avec t=[5,8,15,53] et x=12, que fait cet algorithme?
Soit le programme suivant : i= while i != 11: print(i) i += 2 Que fait ce programme? Va-t-il se terminer? Corriger le. Définition : Un variant de boucle est une expression dont la valeur varie à chaque itération. Identifier un variant de boucle positif strictement décroissant qui est dans la condition de sortie de la boucle permet de s’assurer de la terminaison de la boucle. Attention : Quand les expressions évaluées par l’instruction while sont simples, il est assez facile de se prémunir contre une boucle infinie. Mais avec une expression plus complexe, la condition de sortie de boucle peut très bien ne pas se réaliser dans certains cas. Il faut donc prendre soin de toujours définir des conditions de sortie qui doivent finir par se réaliser quelles que soient les données fournies à l’algorithme. Remarque : Un algorithme doit se terminer. Mais la terminaison d’un algorithme ne garantit pas la correction du résultat qu’il fournit. Correction d’un algorithme Multiplier les exemples qui "fonctionnent" ne veut pas dire que l'algorithme donnera le "bon résultat" dans toutes les circonstances. C'est un peu comme en mathématiques, vérifier qu'une propriété est vraie sur un exemple n'a pas valeur de démonstration. Il se pourrait très bien que dans une situation donnée notre algorithme ne donne pas le résultat attendu. Il existe un moyen de démontrer (au sens mathématique du terme) la correction d'un algorithme.
Définition : La démarche pour prouver la correction d’un algorithme consiste à trouver un invariant de boucle. Un invariant de boucle est une propriété qui est vraie avant l’exécution d’une itération et qui reste vraie après cette exécution. Mise en activité : Soit l'algorithme suivant ; def mystere(liste): mini = liste[0] for element in liste: if element < mini: mini = element return mini 1/ Tester cette fonction avec la liste nombres = [-15, 2, 9, 137, -444, 12, 22] 2/ Rechercher une propriété qui resterait vraie avant et après chaque itération.
Bilan : L’existence d’un variant de boucle est nécessaire à la terminaison de l’algorithme. L’existence d’un invariant de boucle est nécessaire à la correction de l’algorithme. La troisième notion à prendre en compte est celle de la complexité des algorithmes.
Voir feuilles d’exercices : Exercices 6, 7, 8 et 9. Dans l’exercice 8, ignorer la question 3.
Tous les algorithmes ne mobilisent pas les ressources de la machine de la même manière. La notion de complexité traduit ici les performances prévisibles d’un algorithme donné. Définition : La complexité temporelle fait référence au temps mis par un programme informatique pour résoudre le problème.
La complexité spatiale fait référence à l’étendue de l’espace mémoire de l’ordinateur nécessaire pour résoudre le problème. En général la complexité algorithmique désigne d’abord la complexité temporelle. Scénarios optimistes et pessimistes : La performance d’un algorithme ne dépend pas seulement de la manière dont il a été conçu, mais aussi des données qui lui sont soumises. Mise en activité : Soit l'algorithme suivant : def mystere(nombre, liste): tour_de_boucle = 0 for element in liste: tour_de_boucle += 1 if element == nombre: return tour_de_boucle return tour_de_boucle nombres = [12, 17, 3, 29, 41, 1, 99, 51, 32, 6] print(mystere(41, nombres)) print(mystere(6, nombres)) print(mystere(12, nombres)) Que va afficher le programme? Remarque : Les trois recherches effectuées en milieu, en fin et en début de liste montrent qu’avec cet algorithme le nombre de tours de boucle dépend de la position du nombre recherché dans la liste.
Vous pourrez facilement constater en fixant différentes longueurs à la liste que le nombre de tours de boucles est n × n, soit n^2. Il est de complexité quadratique et l’on exprime en ordre de grandeur par O(n^2 ). Cela signifie que si la liste comporte mille éléments, le programme effectuera un million de tours de boucle. Remarque : Pour les algorithmes plus complexes, étant composés de plusieurs termes, on retient uniquement celui d’ordre le plus élevé. Propriétés : Pour n + 7 × n + 400 l’ordre de grandeur est n. Si n = 1 ou n = 10 la valeur de la constante 400 est bien plus importante, mais à mesure que n grandit, son importance décroit. Il en va de même pour 7 × n. On ne retient que n. Si un coefficient multiplicateur est présent, il est pareillement négligé. Ainsi 3 × n et 7 × n sont tous deux d’ordre n, que l’on écrira O(n). Mise en activité : Écrivez un algorithme permettant de trouver le plus grand entier présent dans un tableau. Vous ferez "tourner à la main" votre algorithme en utilisant le tableau t = [3,5,1,8,4,2]. Vous déterminerez ensuite la complexité de votre algorithme.
Écrivez un algorithme permettant de calculer la moyenne de tous les entiers présents dans un tableau. Vous ferez "tourner à la main" votre algorithme en utilisant le tableau t = [3,5,1,8,4,2]. Vous déterminerez ensuite la complexité de votre algorithme.