Académique Documents
Professionnel Documents
Culture Documents
Info1.Algo1
2023-2024 Printemps
1 Tableaux et matrices
Spécifier un type
Tableaux
Exercice
Matrice
2 Complexité
Notion de complexité
Application : Racine carrée entière
De façon générale :
Vocabulaire
On appelle type abstrait la définition d’un type de données
avec la spécification des opérations autorisées,
indépendamment de son implémentation.
Une structure de données définit aussi son implémentation,
c’est-à-dire sa mise en oeuvre matérielle.
Principes généraux
Un tableau permet de mémoriser une séquence d’éléments :
Le nombre d’éléments du tableau est fixe.
Tous les éléments du tableau sont de même type.
Chaque élément est repéré par sa position dans le tableau, son
indice.
Remarque : d’autres façons de représenter des séquences de
données (listes chaînées, piles, files. . . ) seront vues ultérieurement.
Opération autorisées
Créer un tableau en précisant :
Le nombre d’éléments qu’il contient.
Le type des éléments du tableau.
Déterminer la longueur d’un tableau.
Lire un élément à un indice valide.
Écrire un élément à un indice valide.
Spécification de l’interface
Créer un tableau : on utilise une fonction de création précisant
la longueur et la valeur par défaut des éléments du tableau.
tableau = creer_tableau(longueur,defaut)
Déterminer la longueur d’un tableau : len(tableau)
Lire un élément à un indice i valide : valeur = tableau[i]
Écrire un élément à un indice i valide : tableau[i] = valeur
Les indices i valides sont ceux qui vérifient :
0<=i<len(tableau)
Attention
La suppression et l’insertion ne sont donc pas autorisées pour le
type abstrait Tableau.
Exemple :
1 def creer_tableau(longueur,defaut):
2 return [defaut]*longueur
3
Utilisation en C
Un programme respectant le type abstrait tableau se traduira
naturellement en langage C. Ainsi l’exemple précédent donnera :
1 int main () {
2 // Tableau d’entiers de longueur 20 :
3 int tableau[20] = {0}; // Valable uniquement pour 0
4 // Ecriture dans le tableau :
5 scanf("%d",&tableau[0]);
6 // Lecture et ecriture
7 tableau[1] = 2*tableau[0];
8 return(0);
9 }
Principes généraux
Une matrice permet de mémoriser des éléments selon deux
dimensions :
Le nombre de lignes et le nombre de colonnes sont fixes et
non nuls.
Tous les éléments de la matrice sont de même type.
Chaque élément est repéré par sa position dans la matrice,
constituée par le couple (numéro de ligne, numéro de colonne).
Exemple : rotations en 3D
1 rot = [
2 [ 0, 1, 0], 0 1 0
3 [-1, 0, 0], R = −1 0 0
4 [ 0, 0, 1] 0 0 1
5 ]
Opération autorisées
Créer une matrice en précisant :
Son nombre de lignes et de colonnes.
Le type des éléments de la matrice.
Déterminer les dimensions d’une matrice.
Lire un élément à des indices valides.
Écrire un élément à des indices valides.
Utilisation en C
Un programme respectant le type abstrait matrice se traduira
naturellement en langage C. Ainsi l’exemple précédent donnera :
1 int main(void) {
2 // Matrice d’entiers de 19 lignes et 13 colonnes :
3 int matrice[19][13] = {0}; // valable uniquement pour 0
4 // Ecriture dans le tableau :
5 scanf("%d",&matrice[3][4]);
6 // Lecture et ecriture
7 matrice[2][7] = 2*matrice[3][4];
8 return(0);
9 }
1 Tableaux et matrices
Spécifier un type
Tableaux
Exercice
Matrice
2 Complexité
Notion de complexité
Application : Racine carrée entière
Définition
On appelle complexité d’un algorithme la quantité de ressources
nécessaires pour exécuter cet algorithme, exprimée en fonction de
la taille de son(ses) entrée(s).
Méthode
Afin de mesurer expérimentalement la complexité en temps
d’un algorithme, on peut utiliser la fonction time.time() de la
librairie python time qui retourne le temps (en secondes) écoulé
depuis le 1er Janvier 1970 à 00h00m00s (date initiale aussi
appelée epoch).
On mesure alors la différence entre les temps mesurés
avant et après l’exécution de l’algorithme.
5 for k in range(5,11):
6 n = 10**k
7 tic = time.time()
8 somme_entiers_1(n)
9 tac = time.time()
10 print(’n=10^’,k,’ : ’,tac-tic,’ sec’,sep=’’)
Exemple 1 (suite)
L’entrée du problème est un entier positif n, sa sortie est la
somme 1+2+...+n.
Les algorithmes mis en œuvre dans les fonctions
somme_entiers_1 et somme_entiers_2 permettent d’y répondre.
Info1.Algo1 CM 3 : Tableaux, Complexité 2023-2024 Printemps 33 / 42
Problèmes et algorithmes
Motivation de ce chapitre
Plusieurs algorithmes peuvent résoudre un même problème.
Ce n’est pas parce qu’un algorithme répond à un problème qu’il
est le plus adapté.
L’étude de la complexité est un des critères qui permet
d’évaluer, pour un même problème, différents algorithmes et de
choisir le plus adapté. Leur capacité d’adaptation au
changement peut par exemple être un critère plus impactant.
Problème posé
On considère un entier positif n et l’on souhaite déterminer la partie
entière de sa racine carrée.
Spécification
Type du paramètre : n est un entier.
Type de la valeur de retour : a est un entier.
Pré-condition : n>=0
Post-condition : a>=0 and a**2<=n<(a+1)**2
Remarque : même si la condition a>=0 ne semble pas absolument
nécessaire, elle sera utile lors du chapitre sur l’invariant pour s’assurer
que le carré a**2 définit a de manière univoque
Info1.Algo1 CM 3 : Tableaux, Complexité 2023-2024 Printemps 35 / 42
Racine carrée entière
1 def racine_entiere_1(n):
2 assert n>=0, ’Pre-condition’
3 a = 0
4 while (a+1)**2<=n:
5 a += 1
6 assert a>=0 and a**2<=n<(a+1)**2, ’Post-condition’
7 return a
Notations
La zone de recherche est comprise entre les entiers a (inclus)
et b (exclu).
À l’initialisation de l’algorithme a et b valent respectivement 0
et n+1.
L’algorithme se termine lorsque la longueur de la zone de
recherche est 1.
Le milieu est noté m et est obtenu par l’expression (a+b)//2,
C’est le carré du milieu m**2 qui doit être comparé à n.
Exemple
Si n=27, on obtient le déroulé suivant :
a b m m**2 m**2<=n
0 28 14 196 False
0 14 7 49 False
0 7 3 9 True
3 7 5 25 True
5 7 6 36 False
5 6