Algorithms Computer science year 12, Lecture notes of Computer science

These are notes for algorithms in computer science for year 12. The language is in French.

Typology: Lecture notes

2020/2021

Uploaded on 11/27/2021

abel-tewodros
abel-tewodros 🇪🇹

1 document

1 / 11

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
NSI Première
Algorithmes : Terminaison, correction et complexité
Notion d’algorithme!
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 :!
Les mathématiciens babyloniens ont transcrit sur tablettes, des procédures de calcul et
de résolution d’équations. !
Les mathématiciens grecs employaient déjà des algorithmes : on peut citer le crible
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. !
Page sur 1 11
pf3
pf4
pf5
pf8
pf9
pfa

Partial preview of the text

Download Algorithms Computer science year 12 and more Lecture notes Computer science in PDF only on Docsity!

Algorithmes : Terminaison, correction et complexité

Notion d’algorithme

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 :

• Les mathématiciens babyloniens ont transcrit sur tablettes, des procédures de calcul et

de résolution d’équations.

• Les mathématiciens grecs employaient déjà des algorithmes : on peut citer le crible

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.

Mise en activité sur les variants et les invariants de boucle

Voir feuilles d’exercices : Exercices 6, 7, 8 et 9. Dans l’exercice 8, ignorer la question 3.

Complexité d’un algorithme

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.