Approches impérative et fonctionnelle de l'algorithmique
Applications en C et en Caml-Light

   
                                                                                          
Préfacexi
Avant-proposxv
IIntroduction à l'Algorithmique1
1Notion d'algorithme3
1.1Définition d'un algorithme4
1.2Notion de complexité5
1.3Machine abstraite8
1.4Langage algorithmique9
1.5Idée de preuve de programme11
1.6Preuve par récurrence12
1.7Principe de la preuve par invariant13
2Complexité algorithmique17
2.1Notation "O"18
2.2Exponentiation logarithmique22
2.3Arithmétique polynomiale élémentaire24
2.3.1Addition de polynômes24
2.3.2Multiplication de polynômes25
2.3.3Évaluation par puissances croissantes26
2.3.4Schéma de Horner27
2.3.5Lecture d'entier28
2.3.6Écriture d'entier29
2.3.7Évaluation simultanée en plusieurs points29
2.4Interpolation de polynômes30
2.4.1Interpolation de Lagrange31
2.4.2Interpolation de Newton32
2.4.3Algorithme de Neville33
2.4.4Interpolation d'Hermite34
2.5Multiplication efficace de polynômes36
2.6Problèmes en arithmétique des matrices39
2.6.1Addition de matrices39
2.6.2Multiplication de matrices39
2.7Sur la multiplication efficace de matrices40
3Le type ensemble de données41
3.1Type de données concret41
3.2Notion de type abstrait41
3.3Le type abstrait "ensemble de données"43
3.3.1Implémentation par tableau44
3.3.2Recherche d'un élément46
3.3.3Implémentation par tableau trié47
3.3.4Recherche d'un élément par dichotomie48
L'algorithme récursif48
Calcul de la complexité49
3.4Exemples d'algorithmes de tri d'ensembles51
3.4.1Calcul du minimum52
3.4.2Tri d'un ensemble52
3.4.3Tri par insertion53
Recherche de la position d'insertion53
Fonction d'insertion54
Complexité de l'algorithme d'insertion54
Algorithme de tri par insertion55
Complexité du tri par insertion55
3.4.4Tri par sélection du minimum56
Preuve de correction56
Calcul de la complexité57
3.4.5Tri à bulles57
Calcul des transpositions élémentaires57
Algorithme et complexité57
Amélioration de l'algorithme57
3.5Étude comparée des algorithmes de tri élémentaires58
3.5.1Tri par insertion58
3.5.2Tri par sélection du minimum60
3.5.3Tri à bulles61
4Structures linéaires63
4.1Chaînage explicite64
4.1.1Chaînage par curseur64
4.1.2Intérêt d'un chaînage explicite65
4.1.3Notion de pointeur66
4.2Liste chaînée par pointeurs67
4.2.1Représentation effective en mémoire68
4.2.2Insertion d'une cellule69
4.2.3Suppression d'une cellule71
4.3Structure de pile72
4.3.1Exemple du bon parenthésage73
4.3.2Récursivité et dérécursivation74
4.3.3Implémentation par tableau76
4.3.4Implémentation par liste chaînée79
4.3.5Codage par pile du tri par insertion80
4.4Structure de file82
4.4.1Implémentation par tableau83
4.4.2Implémentation par liste chaînée84
4.4.3Utilisation d'une liste chaînée circulaire87
5Structures d'arbre89
5.1Arbres et images noir et blanc90
5.2Codage de Huffman92
5.2.1Notion de code préfixe93
5.2.2Construction d'un code de Huffman95
5.2.3Principe général de codage d'un fichier97
5.3Terminologie de base98
5.3.1Notion d'arbre planaire98
5.4Parcours en profondeur99
5.4.1Parcours préfixe99
5.4.2Parcours suffixe100
5.4.3Parcours infixe100
5.5Parcours hiérarchique101
5.6Opérations usuelles101
5.7Arbres binaires102
5.8Représentation des arbres104
5.8.1Représentation par la fonction père104
5.8.2Binarisation et listes de liens fils105
5.8.3Table de liens fils106
5.9Algorithmes sur les arbres binaires107
5.9.1Parcours en profondeur d'arbres binaires108
5.9.2Parcours en largeur d'arbres binaires111
5.10Arbres binaires de recherche113
5.10.1Recherche d'un élément114
5.10.2Insertion d'un élément116
5.10.3Suppression d'un élément117
5.10.4Efficacité des algorithmes118
IIProgrammation Impérative119
6Introduction au langage C121
6.1Structure de base d'un programme C et compilation122
6.2Préprocesseur et macro-instructions126
6.2.1Définition de constantes par substitution126
6.2.2Macro-instructions avec paramètres127
6.2.3Inclusion de fichier128
6.3Instructions et mots-clés130
6.4Variables et adresses131
6.5Définition d'une fonction132
6.6Fonctions d'entrées-sorties135
6.6.1Les fonctions getchar et putchar135
6.6.2Saisie formatée : la fonction scanf137
6.6.3Affichage formaté : la fonction printf139
6.6.4Les opérations d'entrée-sortie sur fichier141
6.7Les différents types d'instructions144
6.7.1Instructions construites à partir d'expressions144
6.7.2Instructions conditionnelles144
Conditionnelle simple144
Aiguillage146
6.7.3Instructions d'itération148
La boucle for148
La boucle while149
La boucle do-while149
6.7.4Construction d'une instruction à partir d'un bloc150
6.7.5Instructions de rupture de séquence151
6.8Les différents types d'expressions153
6.8.1Principe d'évaluation d'une expression153
6.8.2Les caractères153
6.8.3Les nombres entiers154
6.8.4Les nombres réels155
Le standard IEEE156
6.8.5La représentation des booléens158
6.8.6L'expression conditionnelle159
6.8.7Notion de séquence160
6.9Notion de compatibilité de types160
6.9.1La coercition161
6.9.2Le principe de conversion en affectation161
6.9.3Un type particulier : void162
6.10Les différents opérateurs162
6.10.1Les opérateurs arithmétiques162
6.10.2Les comparateurs164
6.10.3Les opérateurs logiques164
6.10.4Les opérateurs bit à bit165
Complément bit à bit165
Opérateurs de décalage bit à bit165
Opérateurs logiques bit à bit166
6.10.5L'opérateur d'affectation166
6.10.6Priorité et associativité des opérateurs167
6.10.7Notion de taille en mémoire : l'opérateur sizeof169
6.11Déclarations des variables et fonctions170
6.11.1Déclaration, définition et initialisation171
6.11.2Variables globales et variables locales171
6.11.3Domaine de validité d'une déclaration174
6.11.4Domaine de validité des fonctions176
6.12Les tableaux et les chaînes de caractères176
6.12.1Les tableaux176
6.12.2Les chaînes de caractères178
6.13Les pointeurs179
6.13.1Arithmétique des pointeurs180
6.14Les types structurés et la définition de types182
6.14.1Les structures182
6.14.2Définition de type183
6.14.3Les unions184
6.14.4Les constantes énumérées185
6.15Arguments de la ligne de commande186
6.16Notion d'allocation dynamique de mémoire187
7Algorithmique : exercices en C193
7.1Concepts de base193
7.2Autour des fonctions196
7.3Un peu d'analyse lexicale198
7.4Calcul de la solution d'une équation f(x)=0198
7.5Pointeurs et tableaux200
7.6Calcul matriciel202
7.7Récursivité203
7.8Listes chaînées par pointeur204
7.9Listes chaînées triées207
7.10Arbres binaires de recherche208
8Codage de Huffman dynamique en langage C211
8.1Description générale du codage adaptatif212
8.2Structures de données utilisées213
8.3Les sources C du programme213
8.4Complexité de l'algorithme222
8.5Limitations de l'algorithme dynamique222
9Examens d'algorithmique et de langage C223
9.1Manipulation d'entiers et de flottants en langage C223
9.2Manipulation d'entiers, langage C, algorithmique226
9.3Tableaux, ensembles, complexité algorithmique229
9.4Vecteurs booléens, arithmétique et permutations232
9.5Algorithmique des tableaux et vecteurs booléens233
IIIProgrammation Fonctionnelle237
10Introduction au système Caml-Light239
10.1Premiers pas en Caml-Light242
10.1.1Expressions de type int243
10.1.2Expressions de type float243
10.1.3Expressions booléennes244
10.1.4Chaînes de caractères245
10.1.5Produits cartésiens247
10.1.6Le type unit247
10.1.7Les déclarations globales247
10.1.8Expressions fonctionnelles249
10.1.9Les fonctions de plusieurs arguments253
10.1.10Fonctions récursives254
10.1.11Les déclarations locales255
10.1.12Notions de typage et de polymorphisme257
10.1.13Les listes259
10.1.14La fonctionnelle map261
10.1.15Fonctionnelle d'itération sur les listes262
10.1.16Les vecteurs265
10.2Définition de types267
10.2.1Les types énumérés268
10.2.2Les types somme268
10.2.3Types récursifs270
10.2.4Type des arbres binaires272
10.2.5Syntaxe abstraite274
10.2.6Les enregistrements275
10.3Le point sur le filtrage277
10.3.1La construction as277
10.3.2Un motif particulier278
10.3.3La construction match278
10.3.4Déclaration locale et filtrage278
10.3.5Sur la linéarité des motifs279
10.4Le mécanisme d'exception280
11Exercices de contrôle en Caml-Light283
11.1Questions de typage283
11.2Autour des listes286
11.3Manipulation d'ensembles de données288
11.4Algorithmes de tri289
11.5Structures d'arbre290
11.6Arbres et expressions arithmétiques291
11.7Arbres à branchements finis292
11.8Sur les vecteurs292
11.9Pour les passionnés...294
12Examens de Caml-Light297
12.1Une histoire de mobile297
12.2Raisonnement par récurrence300
12.3Fonctionnelles d'itération, arbres binaires303
13Le mot de la fin307
Les Annexes313
ACorrection des exercices en langage C315
Concepts de base315
Autour des fonctions323
Un peu d'analyse lexicale328
Calcul de la solution d'une équation f(x)=0330
Pointeurs et tableaux333
Calcul matriciel338
Récursivité343
Listes chaînées par pointeur347
Listes chaînées triées351
Arbres binaires de recherche354
BCorrection des sujets d'examen d'algorithmique et langage C361
Manipulation d'entiers et de flottants en langage C361
Manipulation d'entiers, langage C, algorithmique365
Tableaux, ensembles, complexité algorithmique369
Vecteurs booléens, arithmétique et permutations372
Algorithmique des tableaux et vecteurs booléens373
CCorrection des exercices en Caml-Light377
Questions de typage377
Autour des listes385
Manipulation d'ensembles de données389
Algorithmes de tri393
Structures d'arbre397
Arbres et expressions arithmétiques401
Arbres à branchements finis405
Sur les vecteurs406
Pour les passionnés...409
DCorrection des sujets d'examen en Caml-Light415
Une histoire de mobile415
Raisonnement par récurrence419
Fonctionnelles d'itération, arbres binaires422
EL'index425
FRéférences bibliographiques447
À propos d'algorithmique448
À propos de programmation impérative449
À propos de programmation fonctionnelle450


C'est tout !